smartcn和ik的对比,来自http://www.cnblogs.com/hadoopdev/p/3465556.html
一、引言:
中文分词一直是自然语言处理的一个痛处,早在08年的时候,就曾经有项目涉及到相关的应用(Lunce构建全文搜索引擎),那时的痛,没想到5年后的今天依然存在,切分效果、扩展支持、业务应用等方面依然不甚理想。收费的版本不提了,原因自不必言表,开源版本中,发现之前曾经活跃的版本,大多已经没落(好几年没更新了),存活下来的寥寥无几。我是一个守旧的人,评估版本的选择有些保守,至少目前为止,只看1.0正式版本之后的版本,0.XX的不在考虑范围之内,用了一个周末的时间,对比了十多款的样子,个人感觉源于中科院ICTCLAS的smartcn和IKAnanlyzer效果还是不错的。
二、结果对比
2.1 原始文本
"lucene分析器使用分词器和过滤器构成一个"管道",文本在流经这个管道后成为可以进入索引的最小单位,因此,一个标准的分析器有两个部分组成,一个是分词器tokenizer,它用于将文本按照规则切分为一个个可以进入索引的最小单位。另外一个是TokenFilter,它主要作用是对切出来的词进行进一步的处理(如去掉敏感词、英文大小写转换、单复数处理)等。lucene中的Tokenstram方法首先创建一个tokenizer对象处理Reader对象中的流式文本,然后利用TokenFilter对输出流进行过滤处理";
2.2 smartcn
lucen分析器使用分词器和过滤器构成一个管道文本流经这个管道后成为可以进入索引最小单位因此一个标准分析器有两个部分组成一个分词器 oken它用于将文本按照规则切分为一个个可以进入索引最小单位另外一个 okenfilt它主要作用对切出来词进行进一步处理如去掉敏感词英文大小写转换单复数处理等lucen中 okenstram方法首先创建一个 oken对象处理 eader对象中式文本然后利用 okenfilt对输出进行过滤处理
2.3 IKanalyzer
lucene分析器分析器使使用分词器分词器和过滤器过滤滤器构成一个一个管道文本在流经这个管道后成为可以进入索引的最小单位因此一个一个标准的分析器分析器有两个两个部分分组组成一个是一个一个是分词器分词器 okenizer它用用于将文本按照规则切分切分为一个个一个一个个个个可以进入索引的最小单位另外一个是一个一个是 okenfilter它主要作用用是对切出来切出切出来的词进行行进进一步进一一步一步的处理如去掉敏感词英文大小写大小小写转换单复数处理等lucene中的 okenstram方法首先创建一个一个 okenizer对象处理 eader对象中的流式文本然后利用 okenfilter对输出流进进行过滤处理
我的选择:虽然IK有很多碎片,但是可以提高查询的准确率。碎片带来的效果就是,需要占用更大的空间。最终仍然选择IK,原因如下:
比如我输入"北京市美食",如果使用smartcn,将会分词为"北京市""美食",那么如果文档中存储的是"北京美食"就查询不到了。
以下介绍solr 5.X版本中IK的配置,来自http://www.cnblogs.com/zhangweizhong/p/5593909.html
1. 首先,下载IKAnalyzer ,下载
注意:以前老的IK 不支持Solr 5.3的版本 ,请注意下载最新的。
2. 将ik的相关文件 拷贝到 webappssolrWEB-INFlib 目录下
3. 在 solr_homemycore1confschema.xml 增加如下配置
<!-- 我添加的IK分词 -->
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
<analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
同时,把需要分词的字段,设置为text_ik,
<field name="id" type="int" indexed="true" stored="true" required="true" multiValued="false" />
<field name="name" type="text_ik" indexed="true" stored="true" required="true" multiValued="false" />
<field name="title" type="text_ik" indexed="true" stored="true" required="true" multiValued="false" />
<field name="category" type="int" indexed="true" stored="true" required="true" multiValued="false" />
<field name="content" type="text_ik" indexed="true" stored="true" required="true" multiValued="false" />
<field name="price" type="double" indexed="true" stored="true" required="true" multiValued="false" />
<field name="color" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="orderBy" type="int" indexed="true" stored="true" required="true" multiValued="false" />
<field name="updatetime" type="date" indexed="true" stored="true" required="true" multiValued="false" />
4. 重启服务
注意:如果之前已经创建了索引,需要将之前的索引删掉,重新创建分词后的索引。
5. 在admin后台, analysis 下查看分词效果
1. 中文分词效果
2. 索引查询效果
6. 配置IKAnalyzer分词器的扩展词典,停止词词典
1. 将 文件夹下的IKAnalyzer.cfg.xml , ext.dic和stopword.dic 三个文件 复制到/webapps/solr/WEB-INF/classes 目录下,并修改IKAnalyzer.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">ext.dic;</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">stopword.dic;</entry>
</properties>
2. 在ext.dic 里增加自己的扩展词典,例如,婴儿奶粉3段
注意: 记得将stopword.dic,ext.dic的编码方式为UTF-8 无BOM的编码方式。