【分詞實驗報告】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閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容

  • 目錄: 1、認識中文分詞包(下載、安裝與運行)2、分詞方法與效果分析3、分詞包背后的分詞算法學習4、分詞結果提交5...
    Echo真二閱讀 1,837評論 0 2
  • 目錄 1.認識中文分詞包2.分詞方法與效果分析3.分詞包背后的分詞算法學習4.分詞結果提交5.基于分詞結果的詞云分...
    不明生物lei閱讀 1,325評論 0 1
  • 目錄 1.mmseg4j中文分詞包(下載、安裝與運行)2.分詞方法與效果分析3.分詞包算法學習4.分詞結果5.詞云...
    belief_8f6c閱讀 5,758評論 0 1
  • 如墨般黑的夜, 倆顆星星簇擁著孤獨, 一會兒低吟, 一會兒高亢, 是痛苦,還是歡快, 漆黑夜晚看不清晰, 廣漠的宇...
    枯藤殘鴉閱讀 183評論 1 2
  • 初三的時候,女生圍在一起講女生的小秘密,男生常常在打籃球,我常常和劉大為一起投籃,這個時候我也長高了一些,劉大為已...
    廢狗李子閱讀 372評論 0 0