美文网首页
【分词实验报告】solr+MMseg4j中文分词

【分词实验报告】solr+MMseg4j中文分词

作者: 狸狸深深 | 来源:发表于2017-05-23 17:11 被阅读0次

    目录##

    • 1.安装solr并整合MMseg4j分词包
    • 2.分词方法与分词效果分析
    • 3.分词包背后的分词算法学习
    • 4.分词结果
    • 5.基于分词结果的词云分析
    • 6.参考来源

    1.安装solr并整合MMseg4j分词包##

    • 基础环境要求:jdk1.8
    java.PNG solr.PNG cmd.PNG
    • 将MMseg4j中mmseg4j-core-1.10.0.jarmmseg4j-solr-2.3.0.jar两个文件复制到\solr-6.5.1\server\solr-webapp\webapp\WEB-INF\lib中。
    • 在cmd中用命令solr create -c name创建一个core,这个core文件夹默认位置在\solr-6.5.1\server\solr下。
      然后将下面代码加入到managed-schema中。(其中的dicPath要改为自己的项目路径)
      <!-- mmseg4j-->
         <field name="mmseg4j_complex_name" type="text_mmseg4j_complex" indexed="true" stored="true"/>
         <field name="mmseg4j_maxword_name" type="text_mmseg4j_maxword" indexed="true" stored="true"/>
         <field name="mmseg4j_simple_name" type="text_mmseg4j_simple" indexed="true" stored="true"/>
    
         <fieldType name="text_mmseg4j_complex" class="solr.TextField" positionIncrementGap="100" >
        <analyzer>
           <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" dicPath="E:\SA\solr-6.5.1\server\solr\aaa\conf"/>
           <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
         </analyzer>
         </fieldType>
         <fieldType name="text_mmseg4j_maxword" class="solr.TextField" positionIncrementGap="100" >
          <analyzer>
            <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="max-word" dicPath="E:\SA\solr-6.5.1\server\solr\aaa\conf"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
          </analyzer>
      </fieldType>
      <fieldType name="text_mmseg4j_simple" class="solr.TextField" positionIncrementGap="100" >
          <analyzer>
            <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="simple" dicPath="E:\SA\solr-6.5.1\server\solr\aaa\conf"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
          </analyzer>
      </fieldType>
      <!-- mmseg4j-->
    

    mmseg4j 在 solr 中主要支持两个参数:mode、dicPath。mode 表示是什么模式分词(有效值:simplex、complex、max-word,如果输入了无效的默认用 max-word。)。dicPath 是词库目录可以是绝对目录,也可以是相对目录(是相对 solr.home 目录下的,dic 就会在 solr.home/dic 目录下找词库文件),如果不指定就是默认在 CWD/data 目录(程序运行当前目录的data子目录)下找。

    来源:solr 中文分词 mmseg4j 使用例子

    • 重启solr服务solr restart -p 端口号后,可以在控制台刚才新建的core中看到新加入的field
    fencibao.png

    2.分词方法与分词效果分析###

    mmseg4j 四个 analyzer:SimpleAnalyzer、ComplexAnalyzer、MaxWordAnalyzer、MMSegAnalyzer。前面三个都是继承 MMSegAnalyzer,MMSegAnalyzer 默认使用 max-word 方式分词。
    MMSeg 算法有两种分词方法:Simple 和 Complex,都是基于正向最大匹配。

    下面分别用maxword、simple、complex三种方式对下段文字进行分词:

    罗辑伸手挥挥,像抚摸天鹅缄般感受着黑暗的质感,宇宙就是一座黑暗森林,每个文明都是带枪的猎人,像幽灵般潜行于林间,轻轻拨开挡路的树枝,竭力不让脚步发出一点儿声音,连呼吸都小心翼翼他必须小心,因为林中到处都有与他一样潜行的猎人。如果他发现了别的生命,不管是不是猎人,不管是天使还是魔鬼,不管是娇嫩的婴儿还是步履蹒跚的老人,也不管是天仙般的少女还是天神般的男神,能做的只有一件事:开枪消灭之?在这片森林中,他人就是地狱,就是永恒的威胁,任何暴露自己存在的生命都将很快被消灭。这就是宇宙文明的图景,这就是对费米悖论的解释。

    • 先设置停用词
      -- 配置schema:在新加入的MMseg4j的field中加入stopwords。
    stopwords.PNG

    -- 在stopwords.txt中添加停用词

    • Complex分词效果

      罗 辑   伸手  挥   挥   抚摸  天鹅  缄   感受   黑暗 质感  宇宙  一座  黑暗  森林  
      每个    文明  带枪  猎人  幽灵  潜行  林间  轻轻  拨开  挡路   树枝 竭力  不让  
      脚步    发出  一点儿 声音   呼吸  小心翼翼    必须 小心   林中 到处   
      与他    一样  潜行   猎人 发现  别的  生命   是不是    猎人    天使     魔鬼  娇嫩  婴儿  步履蹒跚   老人  
      天仙    少女  天神   男  神   能做   只有  件事 开枪  消灭  在这  片   森林  
      他人    地狱  永恒  威胁  任何  暴露  自己  存在   生命 都将  很快  被   消灭  
      宇宙    文明  图景  是对  费   米   悖   论   解释
      

      错误分词(5)
      罗 辑 //应为 罗辑(人名)
      挥 挥 //应为 挥挥
      天鹅 缄 //应为 天鹅缄
      男 神 //应为 男神
      一 件事 //应为 一件事
      费 米 悖 论 //应为 费米悖论

    • Maxword分词效果

      罗 辑   伸手  挥   挥   抚摸  天鹅  缄   感受   黑暗 质感  宇宙  一座  黑暗  森林  
      每个    文明  带枪  猎人  幽灵  潜行  林间  轻轻  拨开  挡路   树枝 竭力  不让  
      脚步    发出  一点    点儿    声音   呼吸  小心    翼    翼    必须 小心   林中 到处   
      与他    一样  潜行   猎人 发现  别的  生命   不是 猎人    天使     魔鬼  娇嫩  婴儿  步履    蹒跚   老人  
      天仙    少女  天神   男  神   能做   只有  件事 开枪  消灭  在这  片   森林  
      他人    地狱  永恒  威胁  任何  暴露  自己  存在   生命 都将  很快  被   消灭  
      宇宙    文明  图景  是对  费   米   悖   论   解释
      

      错误分词(8)
      罗 辑 //应为 罗辑(人名)
      挥 挥 //应为 挥挥
      天鹅 缄 //应为 天鹅缄
      一点 点儿 //应为 一点儿
      小心 翼 翼 //应为 小心翼翼
      是 不是 //应为 是不是
      男 神 //应为 男神
      一 件事 //应为 一件事
      费 米 悖 论 //应为 费米悖论

    • Simple分词效果

      罗 辑   伸手  挥   挥   抚摸  天鹅  缄   感受   黑暗 质感  宇宙  一座  黑暗  森林  
      每个    文明  带枪  猎人  幽灵  潜行  林间  轻轻  拨开  挡路   树枝 竭力  不让  
      脚步    发出  一点儿 声音   呼吸  小心翼翼    必须 小心   林中 到处   
      与他    一样  潜行   猎人 发现  别的  生命   是不是    猎人    天使     魔鬼  娇嫩  婴儿  步履蹒跚   老人      也不  管   
      天仙    少女  天神   男  神   能做   只有  一件    事    开枪  消灭  在这  片   森林  
      他人    地狱  永恒  威胁  任何  暴露  自己  存在   生命 都将  很快  被   消灭  
      宇宙    文明  图景  是对  费   米   悖   论   解释
      

      错误分词(5)
      罗 辑 //应为 罗辑(人名)
      挥 挥 //应为 挥挥
      天鹅 缄 //应为 天鹅缄
      男 神 //应为 男神
      一 件 事 //应为 一件事
      费 米 悖 论 //应为 费米悖论

    • 效果分析:
      这三种分词方法都无法对人名和领域专业名词正确分词,应该是词库的问题,可以通过添加词库解决。三种方法相较而言,Simple方法的效果更接近我的理解,Complex方式次之,Maxword方法尽可能多地分出了词,但无法正确分出成语和儿化音词。

    • 添加自定义词库

    • /core/conf目录下新建词库文件,文件名必须以words开头,dic结尾,如words-my.dic,保存为第一行为空行或为无 BOM 格式的 utf-8 文件。

    • 修改solrconfig.xml配置,添加以下代码:
      <requestHandler name="/mmseg4j/reloadwords" class="com.chenlb.mmseg4j.solr.MMseg4jHandler">
      <lst name="defaults">

      <str name="dicPath">E:\SA\solr-6.5.1\server\solr\test\conf</str>
      <str name="check">true</str>
      <str name="reload">true</str>
      </lst>
      </requestHandler>
      重启solr后就可以看到自定义词库已安装成功

    • 效果

    1.PNG
    ![3.PNG](https://img.haomeiwen.com/i5864824/7f28071699fff1a8.PNG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

    3.分词包背后的分词算法学习##

    通过分析MMseg源码学习分词算法。
    MMseg的两种算法:Complex和Simple都是基于正向最大匹配,其中Complex增加了4种过滤规则:最大匹配、最大平均单词长度、最小单词长度方差、最大单字单词的语素自由度和。

    规则###

    • 什么是chunk?

    它是MMSeg分词算法中一个关键的概念。Chunk中包含依据上下文分出的一组词和相关的属性,包括长度(Length)、平均长度(Average Length)、标准差的平方(Variance)和自由语素度(Degree Of Morphemic Freedom)。

    在Chunk类中,通过getLen()方法获得了长度(Length),getAvgLen()方法获得平均长度(Average Length),getVariance()方法获得方差(Variance),getSumDegree()方法获得自由语素度(Degree Of Morphemic Freedom)。

    • 划分规则

    把查询语句划分为3个word组成的chunk,每个word中存放一个词语,这个词语是字典中出现的一个字或词组(多个字),对于剩下未划分的子语句可以再使用这个规则划分。
    为什么chunk由3个word组成,而不是其它数值?
    也许是汉语句子基本结构是主谓宾3部分,而不划为更多个的word,却是在程序准确性与性能之间做一个折中。

    • 最大匹配(MaxMatchRule)
      通过调用chunk.getLen(),比较获得最大匹配长度
      MaxMatchRule.PNG
    • 最大平均单词长度(LargestAvgLenRule)
      MaxMatchRule相似,调用chunk.getAvgLen(),比较获得最大平均单词长度
    • 最小单词长度方差(SmallestVarianceRule)
      MaxMatchRule相似,调用chunk.getVariance(),比较获得最小单词长度方差
    • 最大单字单词的语素自由度和(LargestSumDegreeFreedomRule)
      MaxMatchRule相似,调用chunk.getSumDegree(),比较获得最大单字单词的语素自由度和

    Simple算法###

    算法思路:来源

    假设C1,C2,….代表一个字符串中的汉字。我们首先位于字符串的开头并想知道如何区分单词。我们首先搜索词典,看 C1是否为一个单个汉字组成的单词,然后搜索 C1C2来看是否为一个两个汉字组成的单词,以下类推。直至找到字典中最长的匹配。最可能的单词就是最长的匹配。我们取这个单词,然后继续这个过程直至字符串中的最后一个单词被识别出来。

    SimpleSeg.PNG

    Complex算法###

    我们从一个字符串的头部开始,寻找分词的方案。如果存在有歧义的分词(例如,C1是一个单词,但是C1C2也是一个单词,等等),然后我们向前再看两个单词去寻找所有可能的以 C1 或者 C1C2 开头的三词 chunks 。例如,如果有一个可能的三词chunks:
    1. C1 C2 C3C4
    2. C1C2 C3C4 C5
    3. C1C2 C3C4 C5C6
    最大长度的chunk是第三个。第一个单词,在第三个chunk中的C1C2,会被认为是正确的。我们接受这个词,并向前重复这个过程从汉字C3,直到字符串的最后一个词被识别。

    也就是先进行最大匹配,再用其他规则过滤。

    MaxWord算法###

    就是在ComplexSeg基础上把长的词再拆分。

    MaxWordSeg.PNG MaxWordSeg1.PNG

    4.分词结果##

    罗辑  伸手  挥挥   抚摸 天鹅缄  感受  黑暗  质感 宇宙   一座 
    黑暗  森林  每个  文明   带枪  猎人  幽灵  潜行  林间 轻轻  
    拨开  挡路   树枝 竭力  不让  脚步  发出  一点儿 声音   呼吸 
    小心翼翼     必须 小心   林中 到处   与他 一样  潜行   猎人  发现  
    别的  生命   是不是    猎人    天使     魔鬼  娇嫩  婴儿  步履蹒跚    
    老人  天仙   少女  天神  男神 能做   只有  一件事    开枪  消灭  在这  
    片   森林  他人   地狱  永恒  威胁 任何  暴露  自己  存在   生命 
    都将  很快  被   消灭   宇宙 文明  图景   是对 费米悖论    解释
    

    5.基于分词结果的词云分析##

    在线工具:图悦

    ciyun.PNG

    6.参考来源##

    Solr 5.x的筹建(Solr自带的Jetty Server)与mmseg4j中文分词- 行业应用
    solr 中文分词 mmseg4j 使用例子
    Solr动态加载分词器的自定义词库扩展词库解决方案
    MMseg源码
    mmseg4j 中文分词器的一些简介整理
    MMSeg中文分词算法

    相关文章

      网友评论

          本文标题:【分词实验报告】solr+MMseg4j中文分词

          本文链接:https://www.haomeiwen.com/subject/vwpbxxtx.html