目錄
- 認識中文分詞包(下載、安裝及運行)
- 分詞方法與效果分析
- 分詞算法學習
- 分詞結果提交(2017/5/24完善方法2)
- 基于分詞結果的詞云分析
1.認識中文分詞包(下載、安裝及運行)
1.1 簡介
mmseg4j 用 Chih-Hao Tsai 的 MMSeg 算法實現的中文分詞器,并實現 lucene 的 analyzer 和 solr 的TokenizerFactory 以方便在Lucene和Solr中使用。
1.2 下載
mmseg4j的相關jar包已經提交到Maven倉庫,可以在mmseg4j的Maven倉庫中找到需要的jar包,以及對應的pom文件代碼。
下載鏈接:
mmseg4j-core-1.10.0.jar下載
mmseg4j-analysis-1.9.1.jar下載
mmseg4j-solr-2.4.0.jar下載
1.3 運行(windows系統cmd中)
檢查java環境
f:
java -version
javac
運行mmseg4j-core-1.10.0.jar
java -cp mmseg4j-core-1.10.0.jar com.chenlb.mmseg4j.example.MaxWord 字符串
可以看到,jar包啟動之后,系統加載了 ./data 目錄下的三個字典文件,分別是
chars.dic
words.dic
units.dic
分詞結果如下
2. 分詞方法與效果分析
mmseg4j分詞包提供了三種分詞方法
- Complex方法
- Simple方法
- MaxWord方法
分別使用三種方法進行分析下面這段新聞:
2017年5月11日下午,美國亞利桑那州立大學圖書館資深館員Dan Stanton來訪我院,并于三教406教室為我院師生作了題為“美國政府信息服務”的學術報告。出席本次學術報告的有我院信息資源管理專業、圖書館學專業、檔案學專業的本科生、研究生,以及李桂華教授、楊峰副教授等教師。本次報告會由李桂華教授主持。 Stanton 先生曾任美國亞利桑那圖書館協會主席,并歷任亞利桑那州立大學人文與社會科學服務館員、政府信息服務館員、本地文獻館員等職位,對美國研究型圖書館的運營有深刻理解。
Complex方法
Simple方法
MaxWord方法
對比分析:
Simple方法的分詞錯誤共有兩處:
正確分詞 錯誤分詞
李/桂/華/教授 李/桂/華教/授
為/我院 為/我院
MaxWord方法的分詞錯誤共有5處
正確分詞 錯誤分詞
圖書館 圖書/書館
美國政府 美國/國政/政府
學術報告 學術/報告
本科生 本科/生
研究生 研究/生
沒有適當分析的特殊詞
亞利桑那州立大學(學校名)
三教(地名)
信息服務(專業術語)
信息資源管理專業(專業名)
圖書館學專業(專業名)
檔案學專業(專業名)
李桂華(人名)
楊峰(人名)
研究型(專業術語)
對比可知,分詞正確率最高的方法是Complex方法。
提高分詞正確率的方法有:增加自定義詞庫;算法優化。這里主要介紹自定義詞庫。
友情鏈接:
搜狗細胞詞庫
詞庫scel格式轉txt工具(不打廣告親測可用,轉換之后需要記事本打開再手動轉utf-8,再改成dic)
自定義詞庫并打包成jar
這里還有其他方法比如配置mmseg4j solr的環境來修改詞庫等
下載mmseg4j-core源碼
我把自定義分詞放進了words.dic
加入的自定義詞庫有:
編譯項目并測試
mvn clean
mvn compile
mvn test-compile
mvn test
打包成jar
mvn jar:jar
運行jar包,成功
友情鏈接:
mvn常用命令
maven的安裝和配置
3. 分詞算法學習
mmseg4j分詞包采用的主要算法是MMSEG正向最大匹配算法,基于詞典,運行速度快,以正向最大匹配為主,多種消除歧義的規則為輔。
匹配算法分類:
- Simple
在一串字符串中從開頭匹配子串,找到所有可能的匹配。舉例:
中國
中國人
中國人的
- Complex
在一串字符中,找到所有可能的三字塊開始匹配,尋找最大長度的字塊。舉例:
研_究_生
研_究_生命
研究生_命_起源
研究_生命_起源
消除歧義的規則:
- 最大匹配。 簡單的最大匹配:選擇這個詞的最大長度。 復雜最大匹配:選擇第一個詞塊的最大長度。
- 最大平均單詞長度
- 單詞長度的最小方差
- 最大的語素和自由的單字單詞
4. 分詞結果提交
由于mmseg4j源碼中沒有提供把分詞結果保存成文件的方法,可以選擇自己在源碼中修改,然后打包成jar。也可以選擇采用其他方法。
需要分詞的文件需要自行轉換txt純文本。
------------------------------2017/5/23 15:00完善---------------------------------------
完善后的代碼把讀取到的文件逐行輸入到控制臺,進行分詞后寫入mmseg4j.txt文件中,我放在了c盤下。
修改的代碼:
在控制臺編譯打包,具體方法和之前一樣。
運行jar包生成txt文件部分內容如下
-----------------------------------2017/5/24補充方法2-------------------------------------
新建一個java項目,引入mmseg4j-core-1.10.0.jar和tika-app-1.14.jar
編寫test.java
import com.chenlb.mmseg4j.*;
import com.chenlb.mmseg4j.example.*;
import org.apache.tika.*;
import java.io.*;
public class test {
public static void main(String[] args) throws Exception{
String fnread = "c:/ggnews.xml";
String fnread2 = "c:/change.txt";
String fnwrite = "c:/mmseg4j.txt";
Complex segW = new Complex();
Tika tika = new Tika();
//這里是格式轉換
File fchange = new File(fnread);
String filecontent = tika.parseToString(fchange);
//讀取的文件路徑
File readf = new File(fnread2);
try{
if(!fchange.exists()){
fchange.createNewFile();
}
FileWriter fw1 = new FileWriter(readf.getAbsoluteFile());
BufferedWriter bw1 = new BufferedWriter(fw1);
bw1.write(filecontent);
bw1.close();
System.out.println("Done");
}catch(IOException e){
e.printStackTrace();
}
//這里是分詞讀寫
//這里原來讀取的是在控制臺輸入的文本,現在是ggnews.txt文件內的文本
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(readf),"UTF-8"));
String inputStr = null;
//保存的文件路徑
File writef =new File(fnwrite);
if(!writef.exists()){
writef.createNewFile();
}
FileWriter fw = new FileWriter(writef.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
while((inputStr = br.readLine()) != null) {
String words = segW.segWords(inputStr, "|");
try{
//把逐行讀取的文件寫入mmseg4j.txt
bw.write(words);
}catch(IOException e){
e.printStackTrace();
}
}
br.close();
bw.close();
}
}
運行后生成change.txt和mmseg4j.txt,分詞結果與方法1相同