英文文本詞與詞之間以空格分隔,方便計算機識別,但是中文以字為單位,句子所有字連起來才能表達一個完整的意思。如英文“I am writing a blog”,英文詞與詞之間有空格進行隔開,而對應的中文“我在寫博客”,所有的詞連在一起,計算機能很容易的識別“blog”是一個單詞,而很難知道“博”、“客”是一個詞,因此對中文文本序列進行切分的過程稱為“分詞”。中文分詞算法是自然語言處理的基礎,常用於搜索引擎、廣告、推薦、問答等系統中。
一、分詞的算法
中文分詞算法屬於自然語言處理范疇,對於一句話,人類可以通過自己的經驗知識知道哪些字組成一個詞,哪些字又是獨立的,但是如何讓計算機理解這些信息並作出正確處理的過程叫做分詞,中文分詞算法分成三大類:一、基於詞典的分詞算法,二、基於機器學習的分詞算法,三、基於神經網絡的分詞算法。
1、基於詞典的分詞算法
基於詞典的分詞算法又稱為機械分詞,它是按照一定的策略將待分詞的文本切分成一個個小片段在已知的詞典中進行查找,如果某字符串能在詞典中找到,則匹配成功,這種分詞思想簡單、高效,在實際分詞系統中很常用。
1.1 字符串匹配算法
字符串匹配算法按照其掃描方向的不同分成正向匹配和逆向匹配,按照其匹配長度的不同可以分成最大匹配和最小匹配。由於中文“單字成詞”的特點,很少利用到最小匹配來作為字符串匹配算法。一般來說,正向匹配分詞算法的准確度略低於逆向匹配算法,據統計單純使用正向最大匹配算法的錯誤率為1/169,而單純使用逆向最大匹配算法的錯誤率為1/245。即使如此,單純的字符串匹配算法也不能滿足系統的要求,通常需要利用這種算法對文本進行粗分,在此基礎上結合其他的方法一起使用,提高系統分詞的准確率。
以逆向最大匹配為例,首先從待分詞的文本中選取最后m(字典中詞條的最大長度)個字,如果能在詞典匹配到,則將匹配的詞切分出來,並以未切分的文本中重新選取m個字進行匹配,如果沒有在詞典中匹配到,則去掉最后一個字,對m-1個字在字典中進行匹配,反復上述操作,直到選取的字組能在詞典中匹配到為止,待匹配的所有字都在切分完成,就得到該文本的分詞結果。
1.2 N-最短路徑分詞算法
N-最短路徑分詞算法的基本思想是根據詞典匹配首先找出所有匹配的字符串,並且給每一個詞賦予不同的權值,構成有向無環圖,然后根據該圖求出從起點到終點的前N條最短路徑,如果兩條或兩條以上路徑長度相等,那么他們的長度並列第 i,都要列入粗分結果集,而且不影響其他路徑的排列序號,最后的粗分結果集合大小大於或等於N。N-最短路徑可以看成是最短路徑方法和全切分的結合,其出發點是盡量使得切分出來的詞最少,跟尋找最短路徑的方法一致,同時有盡可能考慮包含最終結果,跟全切分方法相似。通過這種綜合,一方面避免了最短路徑分詞方法大量舍棄正確結果的可能,另一方面又大大解決了全切分搜索空間過大,運行效率差的弊端。
《基於N-最短路徑方法的中文詞語粗分模型》論文中有個例子,是對“他說的確實在理”這句話的圖模型
圖的定點是0、1、2….7,這些頂點其實沒有什么實際含義,不是詞,也不是字,只是一個編號。有n個詞的句子就會產生n+1個定點。圖中的每條邊都是一個詞,邊都可以是有權重的(默認為1),這個權重可以是概率,詞頻之類的。
2、基於機器學習的分詞算法
基於詞典的分詞算法簡單、高效,但是不能很好解決歧義問題,更對新詞無能為力。人們很自然地把目光轉向到機器學習上,分詞問題轉化成機器學習問題,需要解決兩個問題:一、特征工程,怎么設計特征,選取哪些特征訓練模型,特征的好壞直接決定分詞的效果,二、訓練目標,機器學習的優化目標是什么。分詞特征的選取一般會考慮詞本身,當然也可以整理部分字典信息,作為機器學習模型的特征。分詞問題可以看成是序列標注問題,設置標簽集合{S、B、M、E},其中S表示單個字,B表示某個詞的開始,M表示某個詞的中間,E表示某個詞的結束。常用於分詞的機器學習算法有HMM(隱馬爾可夫模型)和CRF(條件隨機場)。
3、基於神經網絡的分詞算法
近幾年隨着深度學習在自然語言處理領域如火如荼的應用,並取得不錯的效果。目前比較常用的BiLSTM+CRF模型,相關論文也比較豐富,本文簡單介紹一下原理,LSTM擅長捕捉序列的相關信息,對於待分詞文本,以每個字作為輸入,經過embedding層,得到對應的輸入向量,通過LSTM層編碼,把前向和后向得到編碼拼接在一起,獲得該字bi-lstm層向量,通過全連接層,生成相應的輸出向量,並通過CRF得到最終的預測目標。除了常用的{S、B、M、E}標簽集外,還有一些嘗試把分詞和詞性標注結合在一起,通過深度學習模型同時輸出分詞和詞性標注的結果。
二、分詞的難點
雖然分詞算法相對比較成熟,但是在實際應用中很少用某一種方法得到比較好的效果,而是通過多種方法組合而得到一個相對比較好的結果。中文是一種十分復雜的語言,讓計算機理解中文語言更是困難,分詞算法還是有兩大難題亟待解決。
1、歧義識別
歧義是指同一段文本,有兩種或者多種切詞方法。例如:結合成分子,因為“結合”和“合成”都是詞,那么這個短語就可以分成“結合 成 分子”和“結 合成 分子”。這種稱為交叉歧義。交叉歧義在中文分詞中非常常見,由於沒有人的知識去理解,計算機很難識別哪一種是正確答案。根據語義信息交叉歧義相對來說還是比較容易解決,還有一個歧義屬於真歧義,所謂真歧義,就是指給出一段人也無法判斷到底哪一種分詞屬於正確的分詞,如“乒乓球拍賣完了”,可以分成“乒乓球 拍賣 完了” 和“乒乓 球拍 賣 完了”,如果沒有上下文其他的句子,恐怕誰也不知道“拍賣”在這里算不算一個詞。
2、新詞發現
新詞又稱為未登錄詞,即詞典中沒有出現過的詞,常見的未登錄詞包括人名、機構名、地名、產品名、商標名、簡稱、省略語等,針對未登錄詞,因為時時刻刻都在產生新的,同時體量也十分龐大,沒法收錄到字典中。一般分詞系統對會有專門的模塊來處理未登錄詞,同時評價一個系統的好壞程度,對新詞識別的准確率和召回都是重要度的評價指標。知乎專欄《新詞發現》通過大量歷史數據統計某個詞是否是新詞的方法介紹得很詳細,方法也比較通用。它認為判斷一個詞是否是新詞,主要從三方面來考慮,一、歷史數據中出現的次數是不是足夠多,二、新詞的凝固度高,主要通過熵來衡量,通俗來說新詞組成的字,需要經常一起出現,三、新詞的自由度高,主要通過左右熵來衡量,一個新詞的左鄰字集合和右鄰字集合有多隨機,隨機組合越多,越可能成為新詞。