Java中文分詞組件:word

jopen 10年前發布 | 76K 次閱讀 word 中文分詞

Java實現的中文分詞組件,提供了多種基于詞典的分詞算法,并利用ngram模型來消除歧義。能準確識別英文、數字,以及日期、時間等數量詞,能識別人名、地名、組織機構名等未登錄詞。同時提供了Lucene、Solr、ElasticSearch插件。

分詞使用方法:

1、快速體驗
運行項目根目錄下的腳本demo-word.bat可以快速體驗分詞效果
用法: command [text] [input] [output]
命令command的可選值為:demo、text、file
demo
text 楊尚川是APDPlat應用級產品開發平臺的作者
file d:/text.txt d:/word.txt
exit

2、對文本進行分詞
移除停用詞:List<Word> words = WordSegmenter.seg("楊尚川是APDPlat應用級產品開發平臺的作者");
保留停用詞:List<Word> words = WordSegmenter.segWithStopWords("楊尚川是APDPlat應用級產品開發平臺的作者");
            System.out.println(words);

輸出:
移除停用詞:[楊尚川, apdplat, 應用級, 產品, 開發平臺, 作者]
保留停用詞:[楊尚川, 是, apdplat, 應用級, 產品, 開發平臺, 的, 作者]

3、對文件進行分詞
String input = "d:/text.txt";
String output = "d:/word.txt";
移除停用詞:WordSegmenter.seg(new File(input), new File(output));
保留停用詞:WordSegmenter.segWithStopWords(new File(input), new File(output));

4、自定義配置文件
默認配置文件為類路徑下的word.conf,打包在word-x.x.jar中
自定義配置文件為類路徑下的word.local.conf,需要用戶自己提供
如果自定義配置和默認配置相同,自定義配置會覆蓋默認配置
配置文件編碼為UTF-8

5、自定義用戶詞庫
自定義用戶詞庫為一個或多個文件夾或文件,可以使用絕對路徑或相對路徑
用戶詞庫由多個詞典文件組成,文件編碼為UTF-8
詞典文件的格式為文本文件,一行代表一個詞
可以通過系統屬性或配置文件的方式來指定路徑,多個路徑之間用逗號分隔開
類路徑下的詞典文件,需要在相對路徑前加入前綴classpath:

指定方式有三種:
    指定方式一,編程指定(高優先級):
        WordConfTools.set("dic.path", "classpath:dic.txt,d:/custom_dic");
        DictionaryFactory.reload();//更改詞典路徑之后,重新加載詞典
    指定方式二,Java虛擬機啟動參數(中優先級):
        java -Ddic.path=classpath:dic.txt,d:/custom_dic
    指定方式三,配置文件指定(低優先級):
        使用類路徑下的文件word.local.conf來指定配置信息
        dic.path=classpath:dic.txt,d:/custom_dic

如未指定,則默認使用類路徑下的dic.txt詞典文件

6、自定義停用詞詞庫
使用方式和自定義用戶詞庫類似,配置項為:
stopwords.path=classpath:stopwords.txt,d:/custom_stopwords_dic

7、自動檢測詞庫變化
可以自動檢測自定義用戶詞庫和自定義停用詞詞庫的變化
包含類路徑下的文件和文件夾、非類路徑下的絕對路徑和相對路徑
如:
classpath:dic.txt,classpath:custom_dic_dir,
d:/dic_more.txt,d:/DIC_DIR,D:/DIC2_DIR,my_dic_dir,my_dic_file.txt

classpath:stopwords.txt,classpath:custom_stopwords_dic_dir,
d:/stopwords_more.txt,d:/STOPWORDS_DIR,d:/STOPWORDS2_DIR,stopwords_dir,remove.txt

8、顯式指定分詞算法
對文本進行分詞時,可顯式指定特定的分詞算法,如:
WordSegmenter.seg("APDPlat應用級產品開發平臺", SegmentationAlgorithm.BidirectionalMaximumMatching);

SegmentationAlgorithm的可選類型為:   
正向最大匹配算法:MaximumMatching
逆向最大匹配算法:ReverseMaximumMatching
正向最小匹配算法:MinimumMatching
逆向最小匹配算法:ReverseMinimumMatching
雙向最大匹配算法:BidirectionalMaximumMatching
雙向最小匹配算法:BidirectionalMinimumMatching
雙向最大最小匹配算法:BidirectionalMaximumMinimumMatching

9、分詞效果評估
運行項目根目錄下的腳本evaluation.bat可以對分詞效果進行評估
評估采用的測試文本有253 3709行,共2837 4490個字符
評估結果位于target/evaluation目錄下:
corpus-text.txt為分好詞的人工標注文本,詞之間以空格分隔
test-text.txt為測試文本,是把corpus-text.txt以標點符號分隔為多行的結果
standard-text.txt為測試文本對應的人工標注文本,作為分詞是否正確的標準
result-text-***.txt,***為各種分詞算法名稱,這是word分詞結果
perfect-result-***.txt,***為各種分詞算法名稱,這是分詞結果和人工標注標準完全一致的文本
wrong-result-***.txt,***為各種分詞算法名稱,這是分詞結果和人工標注標準不一致的文本

Lucene插件:

1、構造一個word分析器ChineseWordAnalyzer
Analyzer analyzer = new ChineseWordAnalyzer();

2、利用word分析器切分文本
TokenStream tokenStream = analyzer.tokenStream("text", "楊尚川是APDPlat應用級產品開發平臺的作者");
while(tokenStream.incrementToken()){
    CharTermAttribute charTermAttribute = tokenStream.getAttribute(CharTermAttribute.class);
    OffsetAttribute offsetAttribute = tokenStream.getAttribute(OffsetAttribute.class);
    System.out.println(charTermAttribute.toString()+" "+offsetAttribute.startOffset());
}

3、利用word分析器建立Lucene索引
Directory directory = new RAMDirectory();
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_47, analyzer);
IndexWriter indexWriter = new IndexWriter(directory, config);

4、利用word分析器查詢Lucene索引
QueryParser queryParser = new QueryParser(Version.LUCENE_47, "text", analyzer);
Query query = queryParser.parse("text:楊尚川");
TopDocs docs = indexSearcher.search(query, Integer.MAX_VALUE);

Solr插件:

1、生成分詞組件二進制jar
執行 mvn clean install 生成word中文分詞組件target/word-1.0.jar

2、創建目錄solr-4.7.1/example/solr/lib,將target/word-1.0.jar文件復制到lib目錄

3、配置schema指定分詞器
將solr-4.7.1/example/solr/collection1/conf/schema.xml文件中所有的
<tokenizer class="solr.WhitespaceTokenizerFactory"/>和
<tokenizer class="solr.StandardTokenizerFactory"/>全部替換為
<tokenizer class="org.apdplat.word.solr.ChineseWordTokenizerFactory"/>
并移除所有的filter標簽

4、如果需要使用特定的分詞算法:
<tokenizer class="org.apdplat.word.solr.ChineseWordTokenizerFactory" segAlgorithm="ReverseMinimumMatching"/>
segAlgorithm可選值有:  
正向最大匹配算法:MaximumMatching
逆向最大匹配算法:ReverseMaximumMatching
正向最小匹配算法:MinimumMatching
逆向最小匹配算法:ReverseMinimumMatching
雙向最大匹配算法:BidirectionalMaximumMatching
雙向最小匹配算法:BidirectionalMinimumMatching
雙向最大最小匹配算法:BidirectionalMaximumMinimumMatching
如不指定,默認使用雙向最大匹配算法:BidirectionalMaximumMatching

5、如果需要指定特定的配置文件:
<tokenizer class="org.apdplat.word.solr.ChineseWordTokenizerFactory" segAlgorithm="ReverseMinimumMatching"
        conf="C:/solr-4.7.0/example/solr/nutch/conf/word.local.conf"/>
word.local.conf文件中可配置的內容見 word-1.0.jar 中的word.conf文件
如不指定,使用默認配置文件,位于 word-1.0.jar 中的word.conf文件

ElasticSearch插件:

1、執行命令: mvn clean install dependency:copy-dependencies

2、創建目錄elasticsearch-1.1.0/plugins/word

3、將中文分詞庫文件target/word-1.0.jar和依賴的日志庫文件  
    target/dependency/slf4j-api-1.6.4.jar
    target/dependency/logback-core-0.9.28.jar
    target/dependency/logback-classic-0.9.28.jar    
    復制到剛創建的word目錄

4、修改文件elasticsearch-1.1.0/config/elasticsearch.yml,新增如下配置:    
    index.analysis.analyzer.default.type : "word"
    index.analysis.tokenizer.default.type : "word"

5、啟動ElasticSearch測試效果,在Chrome瀏覽器中訪問:    
    http://localhost:9200/_analyze?analyzer=word&text=楊尚川是APDPlat應用級產品開發平臺的作者

6、自定義配置
    從word-1.0.jar中提取配置文件word.conf,改名為word.local.conf,放到elasticsearch-1.1.0/plugins/word目錄下

7、指定分詞算法
    修改文件elasticsearch-1.1.0/config/elasticsearch.yml,新增如下配置:
    index.analysis.analyzer.default.segAlgorithm : "ReverseMinimumMatching"
    index.analysis.tokenizer.default.segAlgorithm : "ReverseMinimumMatching"

    這里segAlgorithm可指定的值有:
    正向最大匹配算法:MaximumMatching
    逆向最大匹配算法:ReverseMaximumMatching
    正向最小匹配算法:MinimumMatching
    逆向最小匹配算法:ReverseMinimumMatching
    雙向最大匹配算法:BidirectionalMaximumMatching
    雙向最小匹配算法:BidirectionalMinimumMatching
    雙向最大最小匹配算法:BidirectionalMaximumMinimumMatching
    如不指定,默認使用雙向最大匹配算法:BidirectionalMaximumMatching

詞向量:

從大規模語料中統計一個詞的上下文相關詞,并用這些上下文相關詞組成的向量來表達這個詞。
通過計算詞向量的相似性,即可得到詞的相似性。
相似性的假設是建立在如果兩個詞的上下文相關詞越相似,那么這兩個詞就越相似這個前提下的。

通過運行項目根目錄下的腳本demo-word-vector-corpus.bat來體驗word項目自帶語料庫的效果

如果有自己的文本內容,可以使用腳本demo-word-vector-file.bat來對文本分詞、建立詞向量、計算相似性

項目主頁:http://www.baiduhome.net/lib/view/home/1398828555593

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!