目錄##
- 1.安裝solr并整合MMseg4j分詞包
- 2.分詞方法與分詞效果分析
- 3.分詞包背后的分詞算法學習
- 4.分詞結果
- 5.基于分詞結果的詞云分析
- 6.參考來源
1.安裝solr并整合MMseg4j分詞包##
- 基礎環境要求:jdk1.8
- 下載solr最新版本:官網solr-6.5.1
下載MMseg4j分詞包
mmseg4j 2.3 jar包- 下載頻道- CSDN.NETsolr無需安裝,直接解壓solr-6.5.1.zip。用cmd啟動服務,用瀏覽器能打開http://localhost:8983/solr 則說明安裝成功。
- 將MMseg4j中
mmseg4j-core-1.10.0.jar
和mmseg4j-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服務
solr restart -p 端口號
后,可以在控制臺剛才新建的core中看到新加入的field
2.分詞方法與分詞效果分析###
mmseg4j 四個 analyzer:SimpleAnalyzer、ComplexAnalyzer、MaxWordAnalyzer、MMSegAnalyzer。前面三個都是繼承 MMSegAnalyzer,MMSegAnalyzer 默認使用 max-word 方式分詞。
MMSeg 算法有兩種分詞方法:Simple 和 Complex,都是基于正向最大匹配。
下面分別用maxword、simple、complex三種方式對下段文字進行分詞:
羅輯伸手揮揮,像撫摸天鵝緘般感受著黑暗的質感,宇宙就是一座黑暗森林,每個文明都是帶槍的獵人,像幽靈般潛行于林間,輕輕撥開擋路的樹枝,竭力不讓腳步發出一點兒聲音,連呼吸都小心翼翼他必須小心,因為林中到處都有與他一樣潛行的獵人。如果他發現了別的生命,不管是不是獵人,不管是天使還是魔鬼,不管是嬌嫩的嬰兒還是步履蹣跚的老人,也不管是天仙般的少女還是天神般的男神,能做的只有一件事:開槍消滅之?在這片森林中,他人就是地獄,就是永恒的威脅,任何暴露自己存在的生命都將很快被消滅。這就是宇宙文明的圖景,這就是對費米悖論的解釋。
- 先設置停用詞
-- 配置schema:在新加入的MMseg4j的field中加入stopwords。
-- 在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后就可以看到自定義詞庫已安裝成功效果
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來看是否為一個兩個漢字組成的單詞,以下類推。直至找到字典中最長的匹配。最可能的單詞就是最長的匹配。我們取這個單詞,然后繼續這個過程直至字符串中的最后一個單詞被識別出來。
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基礎上把長的詞再拆分。
4.分詞結果##
羅輯 伸手 揮揮 撫摸 天鵝緘 感受 黑暗 質感 宇宙 一座
黑暗 森林 每個 文明 帶槍 獵人 幽靈 潛行 林間 輕輕
撥開 擋路 樹枝 竭力 不讓 腳步 發出 一點兒 聲音 呼吸
小心翼翼 必須 小心 林中 到處 與他 一樣 潛行 獵人 發現
別的 生命 是不是 獵人 天使 魔鬼 嬌嫩 嬰兒 步履蹣跚
老人 天仙 少女 天神 男神 能做 只有 一件事 開槍 消滅 在這
片 森林 他人 地獄 永恒 威脅 任何 暴露 自己 存在 生命
都將 很快 被 消滅 宇宙 文明 圖景 是對 費米悖論 解釋
5.基于分詞結果的詞云分析##
在線工具:圖悅
6.參考來源##
Solr 5.x的籌建(Solr自帶的Jetty Server)與mmseg4j中文分詞- 行業應用
solr 中文分詞 mmseg4j 使用例子
Solr動態加載分詞器的自定義詞庫擴展詞庫解決方案
MMseg源碼
mmseg4j 中文分詞器的一些簡介整理
MMSeg中文分詞算法