lucene.net学习七——分词
分词的重要性对于一个搜索引擎来说是相当重要的,英文的分词相对简单,因为英文的每个单词都具有天然的分隔符,但当遇到中文时,就显得无能为力了。
中文是世界上最复杂的语言之一,不同的字在不同的词语中可能代表不同的意思,一句话的意思不能简简单单的看汉字的意思,还有结合上下文语境,因此要让计算机理解中文是比较困难的。
前面学习的所有例子中都提到了分词,都用的是lucene.net自带的标准分析器。代码如:
//构造一个多Field查询
Query query = MultiFieldQueryParser.Parse(Lucene.Net.Util.Version.LUCENE_29, "郭靖", fields, clauses,
new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29));
这个标准的分析器,实际上进行的是单字分割,对于一个建好的索引,用NLuke打开,如下图:
原始数据源中有文件名:吸星大法、郭靖和乔峰、独孤九剑这三个文件名,对文件名建索引后,发现都被切割成一个个汉字了,而且像‘和’这样的汉字是没有多大意义的,可以去掉。
可见,lucene自带的标准分词不够合理。
lucene也实现了一个二分法算法的中文分词CJKAnalyzer,这个类所在的程序集为:Lucene.Net.Contrib.Analyzers.dll,命名空间是:Lucene.Net.Analysis.CJK;
修改代码:
Analyzer analyzer = new CJKAnalyzer();
在建立索引后,用NLuke查看分词的情况,如下图:
发现此分词算法,把2个汉字当作一个词来处理,感觉也不是很好。