NLP︱中文分词技术小结、几大分词引擎的介绍与比较
NLP︱中文分詞技術小結、幾大分詞引擎的介紹與比較
筆者想說:覺得英文與中文分詞有很大的區別,畢竟中文的表達方式跟英語有很大區別,而且語言組合形式豐富,如果把國外的內容強行搬過來用,不一樣是最好的。所以這邊看到有幾家大牛都在中文分詞以及NLP上越走越遠。哈工大以及北大的張華平教授(NLPIR)的研究成果非常棒!
但是商業應用的過程中存在的以下的問題:
1、是否先利用開源的分詞平臺進行分詞后,再自己寫一些算法進行未登錄詞、歧義詞的識別?
2、或者直接調用下文介紹的分詞引擎來進行分詞呢?繳費使用固然很棒,但是是否值得?
——————————————————————————————————————————
來看一下這篇論文一些中文分詞工具的性能比較《開源中文分詞器的比較研究_黃翼彪,2013》
8款中文分詞器的綜合性能排名:
Paoding(準確率、分詞速度、新詞識別等,最棒)
mmseg4j(切分速度、準確率較高)
IKAnalyzer
Imdict-chinese-analyzer
Ansj
盤古分詞
Httpcws
jieba
——————————————————————————————————————————
一、中文分詞技術
1、常見的兩類中文分詞技術
中文分詞技術常見的有兩大類:機械分詞技術、基于統計的序列標注技術。
機械分詞技術操作簡單、方便,比較省心,但是對于歧義詞以及未登錄詞的效果并不是很好;
統計模型的序列標注方法,對于識別未登錄詞擁有較好的識別能力,而且分詞精度也比較大,同時這個方法可以不分中文、英語,著重看在語言前后順序。
以下是思維導圖的形式展示兩大區別:
2、深度學習在分詞、找詞中的應用
(1)word2vec詞向量
雖然word2vec只有三層神經網絡,但是已經取得非常好的效果。通過word2vec,可以將一個詞表示為詞向量,將文字數字化,更好的讓計算機理解。使word2vec模型,我們可以方便的找到同義詞或聯系緊密的詞,或者意義相反的詞等。
(2)RNN(Recurrent Neural Networks,循環神經網絡)——seq2seq
在自然語言處理中,上下文關系非常重要,一個句子中前后詞并不獨立,不同的組合會有不同的意義,比如”優秀”這個詞,如果前面是”不”字,則意義完全相反。RNN則考慮到網絡前一時刻的輸出對當前輸出的影響,將隱藏層內部的節點也連接起來,即當前時刻一個節點的輸入除了上一層的輸出外,還包括上一時刻隱藏層的輸出。RNN在理論上可以儲存任意長度的轉態序列,但是在不同的場景中這個長度可能不同。比如在詞的預測例子中:
?1,“他是億萬富翁,他很?”;?
2,“他的房子每平米物業費40元,并且像這樣的房子他有十幾套,他很?”。
從這兩個句子中我們已經能猜到?代表“有錢”或其他類似的詞匯,但是明顯,第一句話預測最后一個詞時的上線文序列很短,而第二段話較長。如果預測一個詞匯需要較長的上下文,隨著這個距離的增長,RNN將很難學到這些長距離的信息依賴,雖然這對我們人類相對容易。在實踐中,已被證明使用最廣泛的模型是LSTM(Long Short-Term Memory,長短時記憶)很好的解決了這個問題。
?
LSTM最早由Hochreiter及 Schmidhuber在1997年的論文中提出。首先LSTM也是一種RNN,不同的是LSTM能夠學會遠距離的上下文依賴,能夠存儲較遠距離上下文對當前時間節點的影響。
?
所有的RNN都有一串重復的神經網絡模塊。對于標準的RNN,這個模塊都比較簡單,比如使用單獨的tanh層。LSTM擁有類似的結構,但是不同的是,LSTM的每個模塊擁有更復雜的神經網絡結構:4層相互影響的神經網絡。在LSTM每個單元中,因為門結構的存在,對于每個單元的轉態,使得LSTM擁有增加或減少信息的能力。
(來源文章:基于Deep Learning的中文分詞嘗試)
(3)深度學習庫
Keras(http://keras.io)是一個非常易用的深度學習框架,使用python語言編寫,是一個高度模塊化的神經網絡庫,后端同時支持Theano和TensorFlow,而Theano和TensorFlow支持GPU,因此使用keras可以使用GPU加速模型訓練。
Keras中包括了構建模型常用的模塊,如Optimizers優化方法模塊,Activations激活函數模塊,Initializations初始化模塊,Layers多種網絡層模塊等,可以非常方便快速的搭建一個網絡模型,使得開發人員可以快速上手,并將精力放在模型設計而不是具體實現上。常見的神經網絡模型如CNN,RNN等,使用keras都可以很快搭建出來,開發人員只需要將數據準備成keras需要的格式丟進網絡訓練即可。如果對keras中自帶的layer有更多的需求,keras還可以自己定制所需的layer。
——————————————————————————————————————————
二、常見的中文分詞引擎的介紹
1、11款中文分詞引擎大比拼
測試了11家中文分詞引擎(各家分詞系統鏈接地址),同時從分詞準確度、歧義詞切分、未登陸詞(新涌現的通用詞、專業術語、專有名詞)三個方面進行論證。
BosonNLP:http://bosonnlp.com/dev/center
IKAnalyzer:http://www.oschina.net/p/ikanalyzer
NLPIR:http://ictclas.nlpir.org/docs
SCWS中文分詞:http://www.xunsearch.com/scws/docs.php
結巴分詞:https://github.com/fxsjy/jieba
盤古分詞:http://pangusegment.codeplex.com/
庖丁解牛:https://code.google.com/p/paoding/
搜狗分詞:http://www.sogou.com/labs/webservice/
騰訊文智:http://www.qcloud.com/wiki/API%E8%AF%B4%E6%98%8E%E6%96%87%E6%A1%A3
新浪云:http://www.sinacloud.com/doc/sae/python/segment.html
語言云:http://www.ltp-cloud.com/document
最終的結果顯示:
從分詞精度來看,哈工大的語言云表現的穩定一直在第二,BostonNLP分詞更好,一直在這個領域保持第一。
評測數據地址:http://bosonnlp.com/dev/resource(來源bostonNLP微信公眾號)
2、哈工大語言云
語言技術平臺(LTP)?提供包括中文分詞、詞性標注、命名實體識別、依存句法分析、語義角色標注等豐富、 高效、精準的自然語言處理技術。經過?哈工大社會計算與信息檢索研究中心?11 年的持續研發和推廣,LTP 已經成為國內外最具影響力的中文處理基礎平臺。
切分歧義是分詞任務中的主要難題。 LTP的分詞模塊基于機器學習框架,可以很好地解決歧義問題。 同時,模型中融入了詞典策略,使得LTP的分詞模塊可以很便捷地加入新詞信息。
3、張華平NLPIR
對原始語料進行分詞、自動識別人名地名機構名等未登錄詞、新詞標注以及詞性標注。并可在分析過程中,導入用戶定義的詞典。
NLPIR/ICTCLAS分詞系統,采用層疊隱馬模型(算法細節請參照:張華平,高凱,黃河燕,趙燕平,《大數據搜索與挖掘》科學出版社。2014.5?ISBN:978-7-03-040318-6),分詞準確率接近98.23%,具備準確率高、速度快、可適應性強等優勢。
它能夠真正理解中文,利用機器學習解決歧義切分與詞性標注歧義問題。張博士先后傾力打造十余年,內核升級10次,全球用戶突破30萬。(博客中科院分詞系統整理筆記)
《大數據搜索與挖掘》張華平:在線看書網址
4、bostonNLP
玻森采用的結構化預測分詞模型是傳統線性條件隨機場(Linear-chain CRF)的一個變種。
分詞與詞性標注中,新詞識別與組合切分歧義是兩個核心挑戰。玻森在這方面做了不少的優化,包括對特殊字符的處理,對比較有規律的構詞方式的特征捕捉等。
例如,近些年比較流行采用半監督的方式,通過使用在大規模無標注數據上的統計數據來改善有監督學習中的標注結果,也在我們的分詞實現上有所應用。比如通過使用Accessory Variety作為特征,能夠比較有效發現不同領域的新詞,提升泛化能力。
怎樣確定兩個詞是否是固定的搭配呢?我們通過計算兩個詞間的歸一化逐點互信息(NPMI)來確定兩個詞的搭配關系。逐點互信息(PMI),經常用在自然語言處理中,用于衡量兩個事件的緊密程度。歸一化逐點互信息(NPMI)是逐點互信息的歸一化形式,將逐點互信息的值歸一化到-1到1之間。如果兩個詞在一定距離范圍內共同出現,則認為這兩個詞共現。
篩選出NPMI高的兩個詞作為固定搭配,然后將這組固定搭配作為一個組合特征添加到分詞程序中。如“回答”和“問題”是一組固定的搭配,如果在標注“回答”的時候,就會找后面一段距離范圍內是否有“問題”,如果存在那么該特征被激活。
歸一化逐點互信息(NPMI)的計算公式
逐點互信息(PMI)的計算公式
可以看出,如果我們提取固定搭配不限制距離,會使后面偶然出現某個詞的概率增大,降低該統計的穩定性。在具體實現中,我們限定了成為固定搭配的詞對在原文中的距離必須小于一個常數。具體來看,可以采用倒排索引,通過詞找到其所在的位置,進而判斷其位置是否在可接受的區間。這個簡單的實現有個比較大的問題,即在特定構造的文本中,判斷兩個詞是否為固定搭配有可能需要遍歷位置數組,每次查詢就有O(n)的時間復雜度了,并且可以使用二分查找進一步降低復雜度為O(logn)。
其實這個詞對檢索問題有一個更高效的算法實現。我們采用滑動窗口的方法進行統計:在枚舉詞的同時維護一張詞表,保存在當前位置前后一段距離中出現的可能成詞的字符序列;當枚舉詞的位置向后移動時,窗口也隨之移動。
這樣在遍歷到“回答”的時候,就可以通過查表確定后面是否有“問題”了,同樣在遇到后面的“問題”也可以通過查表確定前面是否有“回答”。當枚舉下一個詞的時候,詞表也相應地進行調整。采用哈希表的方式查詢詞表,這樣計算一個固定搭配型時間復雜度就可以是O(1)了。
通過引入上述的上下文的信息,分詞與詞性標注的準確率有近1%的提升,而對算法的時間復雜度沒有改變。我們也在不斷迭代升級以保證引擎能夠越來越準確,改善其通用性和易用性。
——bostanNLP公眾號推文
5、NLTK——斯坦福中文分詞器
斯坦福大學自然語言處理組是世界知名的NLP研究小組,他們提供了一系列開源的Java文本分析工具,包括分詞器(Word Segmenter),詞性標注工具(Part-Of-Speech Tagger),命名實體識別工具(Named Entity Recognizer),句法分析器(Parser)等,可喜的事,他們還為這些工具訓練了相應的中文模型,支持中文文本處理。
在使用NLTK的過程中,發現當前版本的NLTK已經提供了相應的斯坦福文本處理工具接口,包括詞性標注,命名實體識別和句法分析器的接口,不過可惜的是,沒有提供分詞器的接口。在google無果和閱讀了相應的代碼后,我決定照貓畫虎為NLTK寫一個斯坦福中文分詞器接口,這樣可以方便的在Python中調用斯坦福文本處理工具,詳情可見該公眾號分享文。
(來源公眾號分享)
——————————————————————————————————————————
三、R中的JiebaR和wordseg
jiebaR是“結巴”中文分詞(Python)的R語言版本,支持最大概率法(Maximum Probability),隱式馬爾科夫模型(Hidden Markov Model),索引模型(QuerySegment),混合模型(MixSegment)共四種分詞模式,同時有詞性標注,關鍵詞提取,文本Simhash相似度比較等功能。項目使用了Rcpp和CppJieba進行開發。目前托管在GitHub上。
來自:http://cos.name/tag/jiebar/
可參考:?R語言︱文本挖掘——jiabaR包與分詞向量化的simhash算法(與word2vec簡單比較)
R語言︱文本挖掘之中文分詞包——Rwordseg包
————————————————————————————————————————————————————————————
四、參考文獻的羅列
1、張華平老師的書,還有其論文可以在百度學術找得到一些,還有一本書《大數據搜索與挖掘》
2、哈工大社會計算與信息檢索研究中心的發表論文集
總結
以上是生活随笔為你收集整理的NLP︱中文分词技术小结、几大分词引擎的介绍与比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux服务篇-DHCP服务
- 下一篇: Easyui之datagrid修改