1. 程式人生 > >中文分詞學習整理

中文分詞學習整理

存儲 常用 rip har 開發 ict github erb 數據

主要分為兩大類

1. 字符串匹配(掃描字符串),發現子串與詞匹配,就算是匹配

這類分詞通常加入一些啟發式規則,比如“正向/反向最大匹配”,“長詞優先”等策略。

優點:速度快、O(n)時間復雜度。

缺點:歧義和未登陸詞處理不好。

歧義的例子很簡單"長春市/長春/藥店" "長春/市長/春藥/店".

未登錄詞即詞典中沒有出現的詞,當然也就處理不好。

ikanalyzer,paoding 等就是基於字符串匹配的分詞

2. 基於統計及機器學習

這類分詞基於人工標註的詞性和統計特征,對中文進行建模,即根據觀測到的數據(標註好的語料)對模型參數進行估計,即訓練。 在分詞階段再通過模型計算各種分詞出現的概率,將概率最大的分詞結果作為最終結果。常見的序列標註模型有HMM和CRF。

這類分詞算法能很好處理歧義和未登錄詞問題,效果比前一類效果好,但是需要大量的人工標註數據,以及較慢的分詞速度。

ICTCLAS是基於HMM的分詞庫。

我們在重構知乎搜索的時候,權衡標註工作量和性能,以及代碼實現的復雜程度,我們考慮采用基於字符串匹配的分詞方法

B. 除了標註量,準確率和效果的考量,分詞粒度也是一個需要考慮的指標,


這裏有一個真實的例子,即
"團購網站的本質是什麽?"
這是一個知乎的問題,如果使用單一粒度的分詞,如果我們有


團購
團購網
網站
團購網站
本質

什麽

這些詞在詞典中,按最大匹配分詞結果是
“團購網站/的/本質/是/什麽”


當用戶輸入
團購網的本質


分詞結果是
團購網/的/本質
團購網這個詞顯然是沒有匹配的。

同樣,如果按最小匹配分詞,會有類似的問題。

因此,我們考慮基於字符串匹配的分詞方法最好能夠匹配出多粒度的結果,即
能分出
“團購網站/團購/團購網/網站/的/本質/是/什麽”
這樣多粒度的結果。

最終我們采用了ikanalyzer,
基於文本匹配,不需要投入大量人力進行訓練和標註
可以自定詞典,方便加入domain specific的詞語
能分出多粒度的結果。

作者:Logician
鏈接:https://www.zhihu.com/question/19578687/answer/15143584

作者:竹間智能 Emotibot
鏈接:https://www.zhihu.com/question/19578687/answer/190569700
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。

中文分詞是中文文本處理的一個基礎步驟,也是中文人機自然語言交互的基礎模塊。不同於英文的是,中文句子中沒有詞的界限,因此在進行中文自然語言處理時,通常需要先進行分詞,分詞效果將直接影響詞性、句法樹等模塊的效果。當然分詞只是一個工具,場景不同,要求也不同。

在人機自然語言交互中,成熟的中文分詞算法能夠達到更好的自然語言處理效果,幫助計算機理解復雜的中文語言。竹間智能在構建中文自然語言對話系統時,結合語言學不斷優化,訓練出了一套具有較好分詞效果的算法模型,為機器更好地理解中文自然語言奠定了基礎。

在此,對於中文分詞方案、當前分詞器存在的問題,以及中文分詞需要考慮的因素及相關資源竹間智能 自然語言與深度學習小組 做了些整理和總結,希望能為大家提供一些參考。


中文分詞根據實現原理和特點,主要分為以下2個類別:

1、基於詞典分詞算法

也稱字符串匹配分詞算法。該算法是按照一定的策略將待匹配的字符串和一個已建立好的“充分大的”詞典中的詞進行匹配,若找到某個詞條,則說明匹配成功,識別了該詞。常見的基於詞典的分詞算法分為以下幾種:正向最大匹配法、逆向最大匹配法雙向匹配分詞法等。

基於詞典的分詞算法是應用最廣泛、分詞速度最快的。很長一段時間內研究者都在對基於字符串匹配方法進行優化,比如最大長度設定、字符串存儲和查找方式以及對於詞表的組織結構,比如采用TRIE索引樹、哈希索引等。

2、基於統計的機器學習算法

這類目前常用的是算法是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就得到標註結果。


分詞器當前存在問題:

目前中文分詞難點主要有三個:

1、分詞標準:比如人名,在哈工大的標準中姓和名是分開的,但在Hanlp中是合在一起的。這需要根據不同的需求制定不同的分詞標準。

2、歧義:對同一個待切分字符串存在多個分詞結果。

歧義又分為組合型歧義、交集型歧義和真歧義三種類型。

1) 組合型歧義:分詞是有不同的粒度的,指某個詞條中的一部分也可以切分為一個獨立的詞條。比如“中華人民共和國”,粗粒度的分詞就是“中華人民共和國”,細粒度的分詞可能是“中華/人民/共和國”

2) 交集型歧義:在“鄭州天和服裝廠”中,“天和”是廠名,是一個專有詞,“和服”也是一個詞,它們共用了“和”字。

3) 真歧義:本身的語法和語義都沒有問題, 即便采用人工切分也會產生同樣的歧義,只有通過上下文的語義環境才能給出正確的切分結果。例如:對於句子“美國會通過對臺售武法案”,既可以切分成“美國/會/通過對臺售武法案”,又可以切分成“美/國會/通過對臺售武法案”。

一般在搜索引擎中,構建索引時和查詢時會使用不同的分詞算法。常用的方案是,在索引的時候使用細粒度的分詞以保證召回,在查詢的時候使用粗粒度的分詞以保證精度。

3、新詞:也稱未被詞典收錄的詞,該問題的解決依賴於人們對分詞技術和漢語語言結構的進一步認識。


另外,我們收集了如下部分分詞工具,供參考:

中科院計算所NLPIR

ansj分詞器

哈工大的LTP

清華大學THULAC

斯坦福分詞器

Hanlp分詞器

結巴分詞

KCWS分詞器(字嵌入+Bi-LSTM+CRF)

ZPar

IKAnalyzer


以及部分分詞器的簡單說明:

哈工大的分詞器:主頁上給過調用接口,每秒請求的次數有限制。

清華大學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分詞器,其速度相對較慢。另外,開源項目 曾對多款分詞器速度和效果進行過對比,可供大家參考。


最後附上公開的分詞數據集

測試數據集

1、SIGHAN Bakeoff 2005 MSR,560KB

2、SIGHAN Bakeoff 2005 PKU, 510KB

3、人民日報 2014, 65MB

分詞算法不重要,重要的是詞典。參考:《 語義分析相關應用的實作要點》『
分詞算法用誰家的都無所謂,開源的、能拿到手的、靠譜的有不少。主要是一套專用詞典。需要(自動地)與時俱進,而不是拿一個許多年前的不更新的舊詞典就搞定的。
也就是說整個應用的主要問題是詞典和算法。

1. 好詞典很重要

不論什麽樣的分詞方法, 優秀的詞典必不可少, 越拿老掉牙的詞典對越新的文本進行分詞, 就越會分成一團糟.
怎樣構建一個優秀的詞典, 快速發現新新詞匯? 可以看 @M67 前兩天寫的文章, 講的非常透徹明白 : 互聯網時代的社會語言學:基於SNS的文本數據挖掘 ( )

2. 算法跟著需求走

建議根據不同的需求選用不同的算法, 例如, 類似知乎頭部搜索的 AutoComplete 部分, 講究的是速度快, 興趣相關( 優先找和你賬戶相關, 和可能感興趣的內容 ), 分詞算法反而在其次了. 而像全文搜索這樣大段大段的長文字. 我覺得則更註重的是精準, 應該選一個像CRF這樣的算法.

中文分詞學習整理