主要分爲兩大類html
1. 字符串匹配(掃描字符串),發現子串與詞匹配,就算是匹配git
這類分詞一般加入一些啓發式規則,好比「正向/反向最大匹配」,「長詞優先」等策略。github
優勢:速度快、O(n)時間複雜度。算法
缺點:歧義和未登錄詞處理很差。網絡
歧義的例子很簡單"長春市/長春/藥店" "長春/市長/春藥/店".框架
未登陸詞即詞典中沒有出現的詞,固然也就處理很差。dom
ikanalyzer,paoding 等就是基於字符串匹配的分詞機器學習
2. 基於統計及機器學習工具
這類分詞基於人工標註的詞性和統計特徵,對中文進行建模,即根據觀測到的數據(標註好的語料)對模型參數進行估計,即訓練。 在分詞階段再經過模型計算各類分詞出現的機率,將機率最大的分詞結果做爲最終結果。常見的序列標註模型有HMM和CRF。性能
這類分詞算法能很好處理歧義和未登陸詞問題,效果比前一類效果好,可是須要大量的人工標註數據,以及較慢的分詞速度。
ICTCLAS是基於HMM的分詞庫。
咱們在重構知乎搜索的時候,權衡標註工做量和性能,以及代碼實現的複雜程度,咱們考慮採用基於字符串匹配的分詞方法
B. 除了標註量,準確率和效果的考量,分詞粒度也是一個須要考慮的指標,
這裏有一個真實的例子,即
"團購網站的本質是什麼?"
這是一個知乎的問題,若是使用單一粒度的分詞,若是咱們有
團購
團購網
網站
團購網站
本質
是
什麼
這些詞在詞典中,按最大匹配分詞結果是
「團購網站/的/本質/是/什麼」
當用戶輸入
「團購網的本質」
分詞結果是
「團購網/的/本質」
團購網這個詞顯然是沒有匹配的。
一樣,若是按最小匹配分詞,會有相似的問題。
所以,咱們考慮基於字符串匹配的分詞方法最好可以匹配出多粒度的結果,即
能分出
「團購網站/團購/團購網/網站/的/本質/是/什麼」
這樣多粒度的結果。
中文分詞是中文文本處理的一個基礎步驟,也是中文人機天然語言交互的基礎模塊。不一樣於英文的是,中文句子中沒有詞的界限,所以在進行中文天然語言處理時,一般須要先進行分詞,分詞效果將直接影響詞性、句法樹等模塊的效果。固然分詞只是一個工具,場景不一樣,要求也不一樣。
在人機天然語言交互中,成熟的中文分詞算法可以達到更好的天然語言處理效果,幫助計算機理解複雜的中文語言。竹間智能在構建中文天然語言對話系統時,結合語言學不斷優化,訓練出了一套具備較好分詞效果的算法模型,爲機器更好地理解中文天然語言奠基了基礎。
在此,對於中文分詞方案、當前分詞器存在的問題,以及中文分詞須要考慮的因素及相關資源,竹間智能 天然語言與深度學習小組 作了些整理和總結,但願能爲你們提供一些參考。
中文分詞根據實現原理和特色,主要分爲如下2個類別:
一、基於詞典分詞算法
也稱字符串匹配分詞算法。該算法是按照必定的策略將待匹配的字符串和一個已創建好的「充分大的」詞典中的詞進行匹配,若找到某個詞條,則說明匹配成功,識別了該詞。常見的基於詞典的分詞算法分爲如下幾種:正向最大匹配法、逆向最大匹配法和雙向匹配分詞法等。
基於詞典的分詞算法是應用最普遍、分詞速度最快的。很長一段時間內研究者都在對基於字符串匹配方法進行優化,好比最大長度設定、字符串存儲和查找方式以及對於詞表的組織結構,好比採用TRIE索引樹、哈希索引等。
二、基於統計的機器學習算法
這類目前經常使用的是算法是HMM、CRF、SVM、深度學習等算法,好比stanford、Hanlp分詞工具是基於CRF算法。以CRF爲例,基本思路是對漢字進行標註訓練,不只考慮了詞語出現的頻率,還考慮上下文,具有較好的學習能力,所以其對歧義詞和未登陸詞的識別都具備良好的效果。
Nianwen Xue在其論文《Combining Classifiers for Chinese Word Segmentation》中首次提出對每一個字符進行標註,經過機器學習算法訓練分類器進行分詞,在論文《Chinese word segmentation as character tagging》中較爲詳細地闡述了基於字標註的分詞法。
常見的分詞器都是使用機器學習算法和詞典相結合,一方面可以提升分詞準確率,另外一方面可以改善領域適應性。
隨着深度學習的興起,也出現了基於神經網絡的分詞器,例若有人員嘗試使用雙向LSTM+CRF實現分詞器,其本質上是序列標註,因此有通用性,命名實體識別等均可以使用該模型,據報道其分詞器字符準確率可高達97.5%。算法框架的思路與論文《Neural Architectures for Named Entity Recognition》相似,利用該框架能夠實現中文分詞,以下圖所示:
首先對語料進行字符嵌入,將獲得的特徵輸入給雙向LSTM,而後加一個CRF就獲得標註結果。
分詞器當前存在問題:
目前中文分詞難點主要有三個:
一、分詞標準:好比人名,在哈工大的標準中姓和名是分開的,但在Hanlp中是合在一塊兒的。這須要根據不一樣的需求制定不一樣的分詞標準。
二、歧義:對同一個待切分字符串存在多個分詞結果。
歧義又分爲組合型歧義、交集型歧義和真歧義三種類型。
1) 組合型歧義:分詞是有不一樣的粒度的,指某個詞條中的一部分也能夠切分爲一個獨立的詞條。好比「中華人民共和國」,粗粒度的分詞就是「中華人民共和國」,細粒度的分詞多是「中華/人民/共和國」
2) 交集型歧義:在「鄭州天和服裝廠」中,「天和」是廠名,是一個專有詞,「和服」也是一個詞,它們共用了「和」字。
3) 真歧義:自己的語法和語義都沒有問題, 即使採用人工切分也會產生一樣的歧義,只有經過上下文的語義環境才能給出正確的切分結果。例如:對於句子「美國會經過對臺售武法案」,既能夠切分紅「美國/會/經過對臺售武法案」,又能夠切分紅「美/國會/經過對臺售武法案」。
通常在搜索引擎中,構建索引時和查詢時會使用不一樣的分詞算法。經常使用的方案是,在索引的時候使用細粒度的分詞以保證召回,在查詢的時候使用粗粒度的分詞以保證精度。
三、新詞:也稱未被詞典收錄的詞,該問題的解決依賴於人們對分詞技術和漢語語言結構的進一步認識。
另外,咱們收集了以下部分分詞工具,供參考:
中科院計算所NLPIR http://ictclas.nlpir.org/nlpir/
ansj分詞器 https://github.com/NLPchina/ansj_seg
哈工大的LTP https://github.com/HIT-SCIR/ltp
清華大學THULAC https://github.com/thunlp/THULAC
斯坦福分詞器 https://nlp.stanford.edu/software/segmenter.shtml
Hanlp分詞器 https://github.com/hankcs/HanLP
結巴分詞 https://github.com/yanyiwu/cppjieba
KCWS分詞器(字嵌入+Bi-LSTM+CRF) https://github.com/koth/kcws
ZPar https://github.com/frcchang/zpar/releases
IKAnalyzer https://github.com/wks/ik-analyzer
以及部分分詞器的簡單說明:
哈工大的分詞器:主頁上給過調用接口,每秒請求的次數有限制。
清華大學THULAC:目前已經有Java、Python和C++版本,而且代碼開源。
斯坦福分詞器:做爲衆多斯坦福天然語言處理中的一個包,目前最新版本3.7.0, Java實現的CRF算法。能夠直接使用訓練好的模型,也提供訓練模型接口。
Hanlp分詞:求解的是最短路徑。優勢:開源、有人維護、能夠解答。原始模型用的訓練語料是人民日報的語料,固然若是你有足夠的語料也能夠本身訓練。
結巴分詞工具:基於前綴詞典實現高效的詞圖掃描,生成句子中漢字全部可能成詞狀況所構成的有向無環圖 (DAG);採用了動態規劃查找最大機率路徑, 找出基於詞頻的最大切分組合;對於未登陸詞,採用了基於漢字成詞能力的 HMM 模型,使用了 Viterbi 算法。
字嵌入+Bi-LSTM+CRF分詞器:本質上是序列標註,這個分詞器用人民日報的80萬語料,聽說按照字符正確率評估標準能達到97.5%的準確率,各位感興趣能夠去看看。
ZPar分詞器:新加坡科技設計大學開發的中文分詞器,包括分詞、詞性標註和Parser,支持多語言,聽說效果是公開的分詞器中最好的,C++語言編寫。
關於速度:
因爲分詞是基礎組件,其性能也是關鍵的考量因素。一般,分詞速度跟系統的軟硬件環境有相關外,還與詞典的結構設計和算法複雜度相關。好比咱們以前跑過字嵌入+Bi-LSTM+CRF分詞器,其速度相對較慢。另外,開源項目 https://github.com/ysc/cws_evaluation 曾對多款分詞器速度和效果進行過對比,可供你們參考。
最後附上公開的分詞數據集
測試數據集
一、SIGHAN Bakeoff 2005 MSR,560KB
http://sighan.cs.uchicago.edu/bakeoff2005/
二、SIGHAN Bakeoff 2005 PKU, 510KB
http://sighan.cs.uchicago.edu/bakeoff2005/
三、人民日報 2014, 65MB
1. 好詞典很重要
不論什麼樣的分詞方法, 優秀的詞典必不可少, 越拿老掉牙的詞典對越新的文本進行分詞, 就越會分紅一團糟.
怎樣構建一個優秀的詞典, 快速發現新新詞彙? 能夠看 @M67 前兩天寫的文章, 講的很是透徹明白 : 互聯網時代的社會語言學:基於SNS的文本數據挖掘 ( http://www.matrix67.com/blog/archives/5044/trackback )