首页 > 代码库 > solr中文分词

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中文分词