初涉自然语言处理(一):概述

毕业设计做的是一个基于 JS 的拼写检查插件,涉及到自然语言处理的一些东西。因为初次接触踩了不少坑,所以专门写一系列文章来记录一下。我会在后续几篇中陆续发出细节部分,这篇先讲一下大致的原理和目标。

首先提到拼写检查很自然能够想到需要一个词典。将输入的单词与词典中的单词相比较,如果不存在符合的那么就认为拼写出错。

这部分需要解决的问题:

  • 大小写是否重要
  • 缩略词(CIA)、地名(San Francisco)、连接词(year-old)、缩写(you’d)如何处理
  • 英式英语和美式英语怎么算

第二,在有了词典之后,我们就可以筛选出输入的错误单词,这时需要给用户输出一个更正建议(Correction Suggestion),这步可以使用 Levenshtein 算法来完成,此算法通过计算编辑距离(edit distance)来找出与错误单词“足够相似的”正确单词。

这部分需要解决的问题:

  • 每种编辑的权重

第三,我们需要对第二步的结果进行筛选和排序,之所以需要这一步的原因如下图,如果仅仅基于 Levenshtein 算法来提供结果反倒会使用户更加困惑。这一步也是整个项目的重点,就是需要通过训练语料库建立语言模型,给出最有可能的建议。

这部分需要解决的问题:

  • 相似阈值设置为多少
  • 对语料库平滑处理(smoothing)
  • 选择合适的训练维度(uni-gram、 bi-gram or tri-gram)

第四,为了完成第三步,我们需要写一个程序来对大量文本进行处理,比如通过正则匹配进行分词(word tokenization)、计数(counting)等,有可能还需要对一些特殊单词进行规范化(normalization),例如 I’ll -> I will 。

这部分需要解决的问题:

  • 对文本进行格式化,去除数字、网址、汉字、标点等
  • 选择相应的语言和数据结构
  • 不在字典内的单词如何处理
  • 统计语料库中字典内词语的词频
  • 统计任意 n 个字典内单词一起出现的概率

第五,为了获得大量文本作为语料库,我们可能会需要一个爬虫(Spider),当然也可能不需要,一切根据需求来。

这部分需要解决的问题:

  • 获得大量英文文本文件

这篇先写这么多,其余的慢慢补上来。