漫話中文分詞

AlysaB34 10年前發布 | 41K 次閱讀 中文分詞

來自: http://www.bitstech.net/2016/01/25/漫話中文分詞/

一、背景

美國小伙Tom在中國已經半年了,自認為中文已經不錯,就想測試一下自己的水平到底有多高。于是,他收到了下面這樣一份試題,請說出以下題目中兩句話的區別在哪里:

1、冬天:能穿多少穿多少;夏天:能穿多少穿多少。

2、剩女的原因主要有兩個,一個是誰都看不上,另外一個是誰都看不上。

3、單身人的來由:原來是喜歡一個人,現在是喜歡一個人。

4、地鐵里一個女孩給男友打電話,”我已經到西直門了,你也出發吧。如果你到了,我還沒到,你就等著吧。如果我到了,你還沒到,你就等著吧。”

考完試后,老外的眼角是含著淚的,不知道是不是因為他愛這片土地愛得深沉。看吧,這就是自然語言處理的魅力所在。完整的中文自然語言處理過程一般包括以下五種中文處理核心技術:分詞、詞性標注、命名實體識別、依存句法分析、語義分析。其中,分詞是中文自然語言處理的基礎,搜素引擎、文本挖掘、機器翻譯、關鍵詞提取、自動摘要生成等等技術都會用到中文分詞,可以說分詞是自然語言大廈的地基,下面就讓我們從它開始談起。

1)什么是中文分詞

中文分詞就是將中文語句中的詞匯按照使用時的含義切分出來的過程,也就是將一個漢字序列切分成一個個有單獨含義的詞語。自20世紀80年代以來,中文自動分詞就一直是一個研究熱點,由于中文語言的復雜性使之一直處于發展階段。目前,分詞主要包含細粒度分詞和粗粒度分詞兩種,在不同的應用場景需要用到不同的粒度。細粒度分詞是指將原始語句切分成最基本的詞語,而粗粒度分詞是指將原始語句中的多個基本詞組合起來切成一個詞,進而組成語義相對明確的實體。

原始串:浙江大學坐落在西湖旁邊

細粒度: 浙江 / 大學 /坐落/在/西湖/旁邊

粗粒度: 浙江大學 /坐落/在/西湖/旁邊

2)為什么要中文分詞

有人會問到:”為什么要進行中文分詞呢?”

某人答:”因為搜索引擎要用,所以很重要。”

甚至有人認為:”中國之所以沒有進行工業革命,就是因為中文沒有自動分詞。對于專業書籍來說,完全依靠人進行分詞是很慢很困難的,直接影響到了知識的傳播。”當然,最后還是要看官方給出的回答。

– 詞是最小的能夠獨立活動的有意義的語言成分。

– 漢語是以字為基本的書寫單位,詞語之間沒有明顯的區分標記。

– 正確的分詞是中文信息處理的基礎與關鍵。

對于中文而言,詞是承載語義的最小單元,由詞構成語句,又由語句構成篇章。但是,中文文本是由連續的字序列構成,詞與詞之間是沒有天然的分隔符。在自然語言處理領域,國外已經做出了很多卓有成效的研究,但是那些研究大多基于英文(存在天然的分隔符),也就是說是以正確切分出單詞為前提的。于是,NLP對于中文而言要想取得較好的科研成果,就需要準確識別詞與詞之間的邊界,也就是分詞。接下來我們就以搜索為例,具體的闡述一下分詞的重要性與必要性。大家都知道,目前的搜素引擎是基于一種叫做倒排索引的結構,以什么作為索引的key值,直接影響到整個搜索引擎的準確度、召回率以及性能。

1、如果不使用中文分詞,可以采用單個漢字索引方式。例如,”網易”,會先索引”網”字,再索引”易”字。搜索過程中,也是先尋找”網”字關聯的所有文檔,再尋找”易”字關聯的所有文檔,最后對所有被檢索出的文檔做”與”運算,同時”網”,”易”位置連續的文檔才算符合要求。這種方式存在一個非常挑戰性的問題,常用漢字總共3000左右,每次查詢過程中進行“與”操作的計算量會相當大。對于大數據量的搜索引擎來講,每天面臨億萬級別的查詢,這樣的索引結構無疑是災難性的。

2、為了優化上面提到的速度問題,還有另外一種索引結構也是可以避開中文分詞的,那就是n元組合索引方式。用2元索引來說,”中國人”,會先索引”中國”,再索引”國人”。在搜索過程中,也是對”中國”和”國人”檢索出的文章進行”與”操作。這樣的搜索過程會大大減少在搜索過程中的計算量,但是仍會面臨另外一個問題:準確度。有很多這樣的例子,搜”北大”會檢索出”東北大學”,搜”的士”會出現”不想當將軍的士兵不是好士兵”。對于大數據量的搜索引擎系統來說,這樣的用戶體驗是極差的。這個時候,就體現到分詞的重要性了,我們往往使用有意義的詞來進行代替以上兩種方法來建立索引。

3)中文分詞面臨的挑戰

在知道分詞的重要性之后,那么我們會面臨一個新的問題,如何才能把一個字序列準確的切分成詞序列,就像下面的例子會有不止一種的切分方式。

原串:結婚的和尚未結婚的

切分一:結婚/的/和尚/未/結婚/的

切分二:結婚/的/和/尚未/結婚/的

還有更極端的例子,”中外科學名著”中,”中外”、”外科”、”科學”、”學名”、”名著”都是合理的詞語。類似的例子數不勝數,”提高產品質量”,”鞭炮聲響徹夜空”。在中文分詞的世界里,最主要的挑戰有兩個: 歧義詞識別未登錄詞識別

a)歧義詞

上文提到的歧義詞例子,有學者試圖通過逆向匹配來解決。但是,碰到這句”結合成分子”時,采用逆向匹配,則會分成”結合/成分/子時”。一般當一個字可以同時作為兩個詞的組成部分,當這兩個詞按序同時出現時,就可能會出現歧義現象。目前的歧義一般分為三種:交叉歧義,組合歧義,真歧義。

交叉歧義(字符串AJB,AJ和JB都是一個漢語詞匯,會存在多種切分交叉在一起):”你說的確實在理”,”的確”和”確實”就是交叉型歧義片段。

組合歧義(字符串AB是一個詞匯,A和B同時也是詞匯,會存在不同語義下切分不同):”這個人手上有顆痣”,”目前人手緊缺”。前者是”人”/”手”兩個實體詞,后者是”人手”一個實體詞。

真歧義(怎么切分都合理):”乒乓球拍賣完了”,切分為以下兩種情況都是合理的,”乒乓球拍/賣/完了”,”乒乓球/拍賣/完了”。

b)未登錄詞

所謂的未登錄詞是指在分詞詞典中沒有收錄,并且確實是大家公認的詞語的那些詞語,一般又叫做新詞。最典型的未登錄詞就是人名詞,”李勝利喜歡唱歌”中”李勝利”是個人名詞,如果把”李勝利”這個基本詞條收錄到字典中去是能解決這個問題。但是,每時每刻都有新增的姓名,完整收錄全部人名本身就是一個不現實的工程。除了人名詞之外,還有機構名、地名等未登錄詞。在當下的互聯網時代,人們還會不斷的創造出一些新詞出來,比如:”神馬”、”不明覺厲”等。

新詞是中文分詞算法在召回層面上最主要的難題,也是評價一個分詞系統好壞的重要標志。如果一個新詞無法被分詞系統識別,會導致很多噪音數據被召回,進而會影響后面的句法分析和語義分析等相關處理。黃昌寧等在中文信息學報上的《中文分詞十年回顧》一文指出:新詞帶來的分詞問題是歧義的10倍~20倍,所以說新詞發現是分詞面臨的最大挑戰。

二、中文分詞方法

從上世紀80年代開始對中文自動分詞進行研究,在過去的近40年中,中文分詞的發展過程基本上可分為以下三個階段,如下圖所示:

1)機械分詞法

中文自動分詞第一階段,從80年代到90年代中,以基于詞典和人工規則的方法為主,典型的方法有:正向最大匹配,逆向最大匹配,最少詞切分法,雙向匹配法。以正向最大匹配為例,其分詞策略為:從左到右盡量匹配詞典中的最長詞,假設詞典中有{杭州,杭州研究院,網易,研究院},則句子”網易杭州研究院”的切分結果為”網易/杭州研究院”。

這種基于規則的機械匹配法缺乏歧義切分處理,上面提到的幾種切分方法是從不同的角度來處理歧義問題,但是任何一種方法只能解決有限類別的歧義問題。隨著詞典的增大,詞與詞之間的交叉會變得更加嚴重,歧義帶來的負面影響會更加嚴重。同時,基于規則的切分方法對于新詞的切分是完全無能為力的。

2)基于頻度統計的分詞法

中文自動分詞第二階段,從90年代中到03年,分詞算法開始引入基于語料庫的統計學習方法,最典型的方法就是基于詞典全切分加上最大概率路徑。首先,介紹一下全切分方法,它是基于詞的頻度統計的分詞方法的基礎。全切分顧名思義就是獲取原字序列的所有可能成詞的切分結果,這樣就不會遺漏可能正確的切分方式。將全切分的結構構件一個有向無環圖,比如”杭州亞運會”的全切分有向無環圖如下所示。

構成有向無環圖之后,在此圖中找到一條概率最大的路徑,即尋找下面概率公式的最大值:

其中,w值是指用全切分方法切分出來的詞語。基于全切分最大概率路徑的切分算法也是需要依賴詞典,全切分在實際使用過程,一般會通過詞典將所有成詞的切分方式找出來構成有向無環圖。第一階段的中文分詞相比,它也是無法完成識別新詞,但是歧義詞識別的問題基本被解決。在實際使用的工業分詞系統中,詞典中的詞一般會帶有詞頻屬性。同時,還會有一份詞與詞之間的跳轉頻率表,最大概率的計算往往是基于詞頻和詞之間的跳轉頻率進行的。

3)字標注統計學習法

從03年至今,中文分詞由基于詞的方法開始向基于字的方法轉變。當前的方法都是首先根據語料訓練分詞模型,然后對每一個字進行標注,最后根據標注結果來進行分詞。其實就是根據語料訓練分類模型,對每一個字進行類別標注,最后根據類別進行分詞。最典型的方法就是HMM和CRF,其中,CRF比HMM有更弱的上下文無關性假設,當然效果要好一些。

以CRF為例,它把分詞看作是對一個字序列進行標注的過程,一般會標記為4種狀態:詞首(B)、詞中(M)、詞尾(E)、單獨成詞(S)。例如,對于一個輸入序列”我來到網易杭州研究院”會標記為”我/S 來/B 到/E 網/B 易/E 杭/B 州/E 研/B 究/M 院/E”,根據標注結果就得到最終的分詞結果。CRF模型的最優函數形式如下所示:

其中,Z是歸一化函數,f是特征函數,前面是特征對應的權重。CRF分詞的過程就是找到一個標注序列使得其最優函數達到最大值。由于CRF模型不是基于詞典的,可以有效的識別新詞。同時,其分詞的準確率也已經達到工業界使用的要求。但是,CRF分詞的效率和一致性會存在一定問題。一致性問題是指同一個待切分片段會隨著上下文的不同可能做成完全不同的切分結果,所以在搜索業務中在召回層面使用是不合適的。當前CRF的主流用法是在線進行人名識別和歧義片段解析,并使用詞典來保持分詞結果的一致性,以及離線識別新詞補充至詞典。

三、分詞在考拉海淘中的應用

目前考拉海淘使用的分詞是基于ansj開源分詞進行二次開發的版本,目的是優化ansj原有的分詞策略以及增加適合電商的策略。

1)召回問題

通過日志以及用戶反饋,我們發現對于同一商品往往存在不同表述,這可能會導致某種描述無法召回結果。例如,對于商品”掃地機器人”來說,有人會用”掃地機器”這樣的query去查詢,也有人會用”掃地機”去查詢。但是按照最大概率路徑分詞策略,會把商品切分成”掃地”和”機器人”來進行建立索引。為了保證召回的準確性,底層NDIR是采用全匹配的方式來進行召回,也就是query中的所有詞都必須出現在同一個文檔中。對于上面的兩種query,分詞結果分別是”掃地/機器”,”掃地/機”,自然就無法召回用戶所希望的商品。

我們采用多路徑切分的方式,來保證所有在詞典的詞語都出現在路徑中,同時,對所有的路徑進行索引建立。我們會把”掃地機器人”切分成”掃地/機器人”、”掃地/機器/人”、”掃地機/器/人”三條路徑,這樣就解決了無法召回的問題。

2)詞性問題

當用戶輸入的query比較詳細時,可能考拉并沒有此款商品,卻有同品牌或者其他相似的商品,這個時候就需要用到關鍵詞提取。例如,query為”耐克黑色球鞋詹姆斯同款”時,因為無貨而無法召回商品,當我們提取關鍵詞”耐克黑色籃球鞋”時可能會召回商品,當然這個關鍵詞提取的粒度是需要控制的。在ansj原有詞典的基礎上,我們補充了電商品牌詞典和電商類詞典,分詞過程中會給出相應的標記為”耐克/brand 黑色/adj 球鞋/ecom 詹姆斯/nrf 同款/nz”,根據詞性是可以進行關鍵詞初步識別的。

3)分詞粒度問題

當詞典較大時,會面臨一個新的問題,那就是分詞的粒度問題。對于query為”耐克鞋”來說,詞典中是包含這個實體詞的,分詞的切分結果就是”耐克鞋”。但是,考拉用來建索引的商品描述中,這三個字是沒有連續出現的,自然就沒有”耐克鞋”對應的文檔,這個時候就無法召回結果。那么,這時候你會說那就使用最小粒度的分詞就解決這個問題了。比如,某一款商品可能有”參數表”這三個字,如果有最小粒度的分詞策略,分詞的結果為”參數/表”。很不幸,當query為”表”時,你會發現會召回莫名其妙的結果。目前,是使用詞頻表來進行粒度控制,基本可以解決絕大多數問題。

4)新詞問題

分詞器的詞表一般是由基礎詞匯和各領域常用詞匯來組成,可以應用于大多數基本的分詞場景。當分詞器專門應用于某個領域時,一份領域相關的詞典是必不可少的。例如,有很多出問題的case是由于無法識別這個詞造成的,像”馬油”、”肌研”、”極潤”這樣的詞,只能切分成單字,隨之而來的就是一些不相關的商品被召回。目前的解決方案是從相關網站獲取了一批電商詞語當做基礎電商詞語,盡量減少詞語的無法識別率。但是這種解決方案是不滿足可持續發展戰略的,只能用于分詞的初級階段。

5)未來工作的方向

根據考拉海淘搜索的現狀,接下來會針對解決關鍵詞提取/新詞發現以及實體識別所帶來的問題。打算開發一套term weight的關鍵詞識別系統,利用詞法依存關系以及詞性等知識給切分后每一個詞語進行一個打分,其應用場景會非常廣泛。另外一個方向是解決新詞發現所涉及的問題,會根據用戶日志以及新商品的信息,利用詞頻統計以及CRF序列標注等方案來定期離線自動化補充新詞。

相信我們的分詞會越來越準確,我們的搜索也會越來越完善!

</div> </div>

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