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

目录##

  • 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](http://upload-images.jianshu.io/upload_images/5864824-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中文分词算法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容

  • 目录: 1、认识中文分词包(下载、安装与运行)2、分词方法与效果分析3、分词包背后的分词算法学习4、分词结果提交5...
    Echo真二阅读 1,676评论 0 2
  • 目录 1.认识中文分词包2.分词方法与效果分析3.分词包背后的分词算法学习4.分词结果提交5.基于分词结果的词云分...
    不明生物lei阅读 1,287评论 0 1
  • 目录 1.mmseg4j中文分词包(下载、安装与运行)2.分词方法与效果分析3.分词包算法学习4.分词结果5.词云...
    belief_8f6c阅读 5,586评论 0 1
  • 如墨般黑的夜, 俩颗星星簇拥着孤独, 一会儿低吟, 一会儿高亢, 是痛苦,还是欢快, 漆黑夜晚看不清晰, 广漠的宇...
    枯藤残鸦阅读 171评论 1 2
  • 初三的时候,女生围在一起讲女生的小秘密,男生常常在打篮球,我常常和刘大为一起投篮,这个时候我也长高了一些,刘大为已...
    废狗李子阅读 350评论 0 0