LingPipe是一个很好的NLP的工具,是由Alias-i公司开发的一个NLP系统,里面有很多NLP常用的东西:比如ME,CRFs,LDA,SVMs等常用模型;并且可以用它们来做很多NLP的事情:分词,词性标注,情感分析,文本分类等等。更为难得的是这个工具文档详尽(可能开发者确实想把它做成一个商用的系统,而不像很多科研人员提供的系统,只是用来演示论文)。所以借这个工具,自己用来复习一下以前学习过的的东西,当然有时间的话也会尝试其它的NLP相关的工具,比如Mallet,Stanford NLP Group的一些工具。
这个blog要讨论的是Spell Correction这个问题。Spell Correction也叫Spell Check,与之相关的任务还包括Spell Suggestion。我们用google等常见搜索引擎的例子来了解这两个任务。
Spell Suggestion:就是用户在输入的时候提示可能的单词或者短语。
Spell Correction:用户输入可能存在错误,比如用这样的query搜索结果很少,从而推测用户输入可能有错。
比如在google搜索“brec baldwin”,google提示Did you mean “breck baldwin”
当然除了搜索引擎,Spell Correction也有其它的用途,比如word这样的文本编辑器,也会提供纠错功能。
这两个任务有些类似,不过Spell Suggestion实时性更强,它在用户输入的同时就提示可能的结果,这样可以预防用户的拼写错误,而Spell Correction就是“事后诸葛亮”了,它一般通过query log或者搜索结果数来判断用户是否可能有拼写错误。
注意百度,google中文,google英文的细微区别:
我们输入anazon(应该没有这个词,正确的应该是amazon)
百度的suggestion其实是前缀的匹配,没法纠错
而google的就“智能”一些了:
而对于中文的拼音,百度和google都类似,不过google中文的提示是汉字,而google英文的提示是拼音
到这,大家应该对这个问题的定义和一些搜索引擎的实现有了一些体验了。下面我们来看看lingpipe里怎么使用Spell Correction。后续的文章会详细解析具体的实现,包括Character Language Model,Edit Distance,Noisy Channel model等等,不过现在还是先让它能运行起来再说吧。
首先当然要去 http:/alias-i.com/lingpipe/下载了,注意要下载包含源代码的文件,而不仅仅是jar的(我们当然是要学习它的原理而不仅仅是用它啦,大小应该是几十MB吧,大的文件注意是一些语料)。建议下载3.9.3的版本,最新的是4.0.1,但是文档是基于3.9写的,所以不必用最新的,如果用到3.9.3里没有的东西,我会提示的。
把lingpipe-3.9.3.tar.gz解压好就行了。我们看一下它的目录结构:
|
|--- src 这里面是源代码,它的编译不依赖任何东西,(当然测试代码要依赖于JUnit4啦)
|--- index.html 文档的入口,里面最有用的就是tutorial了,当然JavaDoc也不错,不过我们如果在Eclipse里又有源代码的话,在里
面看更方便
|--- demos 一些demo
|--- data demo用到的语料库
|--- model demo用到的模型,大部分模型是可以自己训练的,但是有些会涉及到版权的,可能只能提供训练后的模型。
|--- tutorial 许多的教程
|--- querySpellChecker 我们这个文章的话题,拼写纠错。
|--- src 源代码
了解了LingPipe的目录结构后,我们先来测试一下吧:
1. 进到 lingpipe-3.9.3/demos/tutorial/querySpellChecker
2. ant querySpellCheck 里面会给lingpipe-3.9.3/demos/data/rec.sport.hockey/train里的训练语料建立lucene索引和
Character Language Model,建完索引和模型后就可以拼写纠错了。
在Eclipse里调试:
1. lingpipe-3.9.3/src里的java代码加入(可以复制到工程的src下,当然也可以link过去),这是lingpipe的核心代码,只要有JUnit4
的库,应该就可以编译了,当然如果你不想阅读lingpipe的源代码,那么直接加入编译好的lingpipe-3.9.3.jar也行。
2. 加入lingpipe-3.9.3/demos/tutorial/querySpellChecker/src里的代码,由于使用了lucene来建立索引,索引需要加入
lingpipe-3.9.3/demos/lib/lucene-core-3.0.1.jar
3. 修改一下训练语料的路径
public class QuerySpellCheck { ..................... static final File DATA = new File("D:/lingpipe-3.9.3/demos/data/rec.sport.hockey/train"); }
当然,你也可以把需要的训练语聊复制到工程里,保持它的相对路径。
4. 运行或者调试 QuerySpellCheck,它会构建索引和训练Language Model,然后在命令行提示查询,比如测试“spead up”,
它会提示“speed up”
今天就先到这吧,有空自己试试让它运行起来。