solr中文分词
Posted regulus
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了solr中文分词相关的知识,希望对你有一定的参考价值。
solr分词,就是solr配置的字段类型根据注册的分词文件分词断句的行为。
例如:你们村村通工程知道吗?
不分词的时候会是这样:
分词的话,我们把“村村通工程 ”名词化,分词结果为:
说说中文分词
中文分词器有多中,常用的有 IKAnalyzer、 mmseg4j。
前者最新版本更新到2012年,所以使用的时候要注意可能版本上有不兼容的情况, 由于它是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始, IKAnalyzer已经推出了4个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。从3.0版本开始,IK发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。在2012版本中,IK实现了简单的分词歧义排除算法,标志着IK分词器从单纯的词典分词向模拟语义分词衍化。
使用方法,需要下载相应的jar、配置文件,我这里分享了一个链接。
将ik的相关文件 拷贝到 solr工程的lib目录,配置 schema.xml 文件, 同时,把需要分词的字段,设置为text_ik,:
<!-- 需要分词的字段 --> <field name="content" type="text_ik" indexed="true" stored="true" required="true" multiValued="false" /> <!-- 我添加的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>
solr服务重启,索引文件重建。
配置IKAnalyzer分词器的扩展词典,停止词词典
将 文件夹下的IKAnalyzer.cfg.xml ,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>
相比于IKAnalyzer,mmseg4j算是更新频率高的,目前还在更新。 mmseg4j 用 Chih-Hao Tsai 的 MMSeg 算法(http://technology.chtsai.org/mmseg/ )实现的中文分词器,并实现 lucene 的 analyzer 和 solr 的TokenizerFactory 以方便在Lucene和Solr中使用。 MMSeg 算法有两种分词方法:Simple和Complex,都是基于正向最大匹配。Complex 加了四个规则过虑。官方说:词语的正确识别率达到了 98.41%。mmseg4j 已经实现了这两种分词算法。
mmseg4j项目地址:https://github.com/chenlb/mmseg4j-solr
使用方法
下载文件,导入solr服务的lib目录下
mmseg4j-core-1.10.0.jar
mmseg4j-solr-2.3.0.jar
配置schema.xml 文件, dicPath 指定词库位置(每个MMSegTokenizerFactory可以指定不同的目录,当是相对目录时,是相对 solr.home 的目录),mode 指定分词模式(simple|complex|max-word,默认是max-word)。
<fieldtype name="textComplex" class="solr.TextField" positionIncrementGap="100"> <analyzer type="index"> <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" dicPath="E:/solr_home/connect/conf/dic/" /> <filter class="solr.StopFilterFactory" ignoreCase="false" words="stopwords.txt"/> <filter class="solr.WordDelimiterFilterFactory"/> <filter class="solr.LowerCaseFilterFactory"/> <filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="20"/> <filter class="solr.StandardFilterFactory"/> </analyzer> <analyzer type="query"> <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" dicPath="E:/solr_home/connect/conf/dic/" /> <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> <filter class="solr.StopFilterFactory" ignoreCase="false" words="stopwords.txt"/> <filter class="solr.WordDelimiterFilterFactory"/> <filter class="solr.LowerCaseFilterFactory"/> <!-- <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="20"/> --> <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> </analyzer> </fieldtype>
配置词库
注意:
1、一些字符的处理 英文、俄文、希腊、数字(包括①㈠⒈)的分出一连串的。目前版本没有处理小数字问题, 如ⅠⅡⅢ是单字分,字库(chars.dic)中没找到也单字分。
2、词库(强制使用 UTF-8):
- data/chars.dic 是单字与语料中的频率,一般不用改动,1.5版本中已经加到mmseg4j的jar里了,我们不需要关心它,当然你在词库目录放这个文件可能覆盖它。
- data/units.dic 是单字的单位,默认读jar包里的,你也可以自定义覆盖它,这功能是试行,如果不喜欢它,可以空的units.dic文件覆盖它。
- data/words.dic 是词库文件,一行一词,当然你也可以使用自己的,1.5版本使用 sogou 词库,1.0的版本是用 rmmseg 带的词库。
- data/wordsxxx.dic 1.6版支持多个词库文件,data 目录(或你定义的目录)下读到"words"前缀且".dic"为后缀的文件。如:data/words-my.dic。
以上是关于solr中文分词的主要内容,如果未能解决你的问题,请参考以下文章