solr 中文分词相关(转载)

smartcn和ik的对比,来自http://www.cnblogs.com/hadoopdev/p/3465556.html

一、引言:

  中文分词一直是自然语言处理的一个痛处,早在08年的时候,就曾经有项目涉及到相关的应用(Lunce构建全文搜索引擎),那时的痛,没想到5年后的今天依然存在,切分效果、扩展支持、业务应用等方面依然不甚理想。收费的版本不提了,原因自不必言表,开源版本中,发现之前曾经活跃的版本,大多已经没落(好几年没更新了),存活下来的寥寥无几。我是一个守旧的人,评估版本的选择有些保守,至少目前为止,只看1.0正式版本之后的版本,0.XX的不在考虑范围之内,用了一个周末的时间,对比了十多款的样子,个人感觉源于中科院ICTCLASsmartcnIKAnanlyzer效果还是不错的。

二、结果对比

2.1 原始文本

"lucene\分析器\使用\分词器\\过滤器\构成\一个\"管道",文本\\流经\这个\管道\\成为\可以\进入\索引\\最小单位,因此,一个\标准\的分析器有两个部分组成,一个是分词器tokenizer,它用于将文本按照规则切分为一个个可以进入索引的最小单位。另外一个是TokenFilter,它主要作用是对切出来的词进行进一步的处理(如去掉敏感词、英文大小写转换、单复数处理)等。lucene中的Tokenstram方法首先创建一个tokenizer对象处理Reader对象中的流式文本,然后利用TokenFilter对输出流进行过滤处理";
2.2 smartcn

lucen\分析器\使用\分词\\\过滤器\构成\一个\管道\文本\流经\这个\管道\\成为\可以\进入\索引\\\单位\因此\一个\标准\分析器\\\\部分\组成\一个\分词\\token\\用于\\文本\按照\规则\切分\\一个\\可以\进入\索引\\\单位\另外\一个\tokenfilt\\主要\作用\\\出来\\进行\进一步\处理\\去掉\敏感\\英文\大小写\转换\\复数\处理\\lucen\\tokenstram\方法\首先\创建\\\token\对象\处理\reader\对象\\\文本\然后\利用\tokenfilt\\输出\进行\过滤\处理\

2.3 IKanalyzer

lucene\分析器\分析\器使\使用\分词器\分词\\\过滤器\过滤\滤器\构成\一个\\\管道\文本\\流经\这个\管道\\成为\可以\进入\索引\\最小\单位\因此\一个\\\标准\\分析器\分析\\\两个\\\部分\分组\组成\一个是\一个\\\\分词器\分词\\tokenizer\它用\用于\\文本\按照\规则\切分\\分为\一个个\一个\\个个\\\可以\进入\索引\\最小\单位\另外\一个是\一个\\\\tokenfilter\\主要\作用\用是\\切出来\切出\\出来\\\进行\行进\进一步\进一\一步\\\\处理\\去掉\敏感\\英文\大小写\大小\小写\转换\\复数\处理\\lucene\\\tokenstram\方法\首先\创建\一个\\\tokenizer\对象\处理\reader\对象\\\流式\文本\然后\利用\tokenfilter\\输出\流进\进行\过滤\处理\

 

我的选择:虽然IK有很多碎片,但是可以提高查询的准确率。碎片带来的效果就是,需要占用更大的空间。最终仍然选择IK,原因如下:

比如我输入"北京市美食",如果使用smartcn,将会分词为"北京市""美食",那么如果文档中存储的是"北京美食"就查询不到了。

以下介绍solr 5.X版本中IK的配置,来自http://www.cnblogs.com/zhangweizhong/p/5593909.html

  1. 首先,下载IKAnalyzer 下载

    注意:以前老的IK 不支持Solr 5.3的版本 ,请注意下载最新的。

   

  2. ik的相关文件 拷贝到 webapps\solr\WEB-INF\lib 目录下

   

  3. solr_home\mycore1\conf\schema.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.dicstopword.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.dicext.dic的编码方式为UTF-8 BOM的编码方式。 

   

posted on 2017-08-30 00:16  张小贱1987  阅读(266)  评论(0编辑  收藏  举报

导航