1. 程式人生 > >轉 中文分詞

轉 中文分詞

轉自:http://www.cnblogs.com/flish/archive/2011/08/08/2131031.html

 基於CRF(Conditional Random Field)分詞演算法 論文連結:http://nlp.stanford.edu/pubs/sighan2005.pdf

一、為什麼要進行中文分詞?

詞是最小的能夠獨立活動的有意義的語言成分,英文單詞之間是以空格作為自然分界符的,而漢語是以字為基本的書寫單位,詞語之間沒有明顯的區分標記,因此,中文詞語分析是中文資訊處理的基礎與關鍵。

Lucene中對中文的處理是基於自動切分的單字切分,或者二元切分。除此之外,還有最大切分(包括向前、向後、以及前後相結合)、最少切分、全切分等等。

二、中文分詞技術的分類

我們討論的分詞演算法可分為三大類:基於字典、詞庫匹配的分詞方法;基於詞頻度統計的分詞方法和基於知識理解的分詞方法。

第一類方法應用詞典匹配、漢語詞法或其它漢語語言知識進行分詞,如:最大匹配法、最小分詞方法等。這類方法簡單、分詞效率較高,但漢語語言現象複雜豐富,詞典的完備性、規則的一致性等問題使其難以適應開放的大規模文字的分詞處理。第二類基於統計的分詞方法則基於字和詞的統計資訊,如把相鄰字間的資訊、詞頻及相應的共現資訊等應用於分詞,由於這些資訊是通過調查真實語料而取得的,因而基於統計的分詞方法具有較好的實用性。

下面簡要介紹幾種常用方法:

1).逐詞遍歷法。

逐詞遍歷法將詞典中的所有詞按由長到短的順序在文章中逐字搜尋,

直至文章結束。也就是說,不管文章有多短,詞典有多大,都要將詞典遍歷一遍。這種方法效率比較低,大一點的系統一般都不使用。

2).基於字典、詞庫匹配的分詞方法(機械分詞法)

這種方法按照一定策略將待分析的漢字串與一個“充分大的”機器詞典中的詞條進行匹配,若在詞典中找到某個字串,則匹配成功。識別出一個詞,根據掃描方向的不同分為正向匹配和逆向匹配。根據不同長度優先匹配的情況,分為最大(最長)匹配和最小(最短)匹配。根據與詞性標註過程是否相結合,又可以分為單純分詞方法和分詞與標註相結合的一體化方法。常用的方法如下:

(一)最大正向匹配法 (MaximumMatchingMethod)通常簡稱為MM法。其基本思想為:假定分詞詞典中的最長詞有i

個漢字字元,則用被處理文件的當前字串中的前i個字作為匹配欄位,查詢字典。若字典中存在這樣的一個i字詞,則匹配成功,匹配欄位被作為一個詞切分出來。如果詞典中找不到這樣的一個i字詞,則匹配失敗,將匹配欄位中的最後一個字去掉,對剩下的字串重新進行匹配處理……如此進行下去,直到匹配成功,即切分出一個詞或剩餘字串的長度為零為止。這樣就完成了一輪匹配,然後取下一個i字字串進行匹配處理,直到文件被掃描完為止。

其演算法描述如下:

(1)初始化當前位置計數器,置為0

(2)從當前計數器開始,取前2i個字元作為匹配欄位,直到文件結束;

(3)如果匹配欄位長度不為0,則查詢詞典中與之等長的作匹配處理。

如果匹配成功,

則,

a)把這個匹配欄位作為一個詞切分出來,放入分詞統計表中;

b)把當前位置計數器的值加上匹配欄位的長度;

c)跳轉到步驟2);

否則

a) 如果匹配欄位的最後一個字元為漢字字元,

①把匹配欄位的最後一個字去掉;

②匹配欄位長度減2

否則

①把匹配欄位的最後一個位元組去掉;

②匹配欄位長度減1

b)跳轉至步驟3);

否則

a)如果匹配欄位的最後一個字元為漢字字元,

則當前位置計數器的值加2

否則當前位置計數器的值加1

b)跳轉到步驟2)

(二)逆向最大匹配法 (ReverseMaximumMatcingMethod)通常簡稱為RMM法。RMM法的基本原理與MM法相同 ,不同的是分詞切分的方向與MM法相反,而且使用的分詞辭典也不同。逆向最大匹配法從被處理文件的末端開始匹配掃描,每次取最末端的2i個字元(i字字串)作為匹配欄位,若匹配失敗,則去掉匹配欄位最前面的一個字,繼續匹配。相應地,它使用的分詞詞典是逆序詞典,其中的每個詞條都將按逆序方式存放。在實際處理時,先將文件進行倒排處理,生成逆序文件。然後,根據逆序詞典,對逆序文件用正向最大匹配法處理即可。

由於漢語中偏正結構較多,若從後向前匹配,可以適當提高精確度。所以,逆向最大匹配法比正向最大匹配法的誤差要小。統計結果表明 ,單純使用正向最大匹配的錯誤率為 1/16 9,單純使用逆向最大匹配的錯誤率為 1/245。例如切分欄位“碩士研究生產”,正向最大匹配法的結果會是“碩士研究生 / 產”,而逆向最大匹配法利用逆向掃描,可得到正確的分詞結果“碩士 / 研究 / 生產”。

當然,最大匹配演算法是一種基於分詞詞典的機械分詞法,不能根據文件上下文的語義特徵來切分詞語,對詞典的依賴性較大,所以在實際使用時,難免會造成一些分詞錯誤,為了提高系統分詞的準確度,可以採用正向最大匹配法和逆向最大匹配法相結合的分詞方案(即雙向匹配法,見(四)。)

(三)最少切分法:使每一句中切出的詞數最小。

(四)雙向匹配法:將正向最大匹配法與逆向最大匹配法組合。先根據標點對文件進行粗切分,把文件分解成若干個句子,然後再對這些句子用正向最大匹配法和逆向最大匹配法進行掃描切分。如果兩種分詞方法得到的匹配結果相同,則認為分詞正確,否則,按最小集處理。

3). 全切分和基於詞的頻度統計的分詞方法

基於詞的頻度統計的分詞方法是一種全切分方法。在討論這個方法之前我們先要明白有關全切分的相關內容。

全切分

全切分要求獲得輸入序列的所有可接受的切分形式,而部分切分只取得一種或幾種可接受的切分形式,由於部分切分忽略了可能的其他切分形式,所以建立在部分切分基礎上的分詞方法不管採取何種歧義糾正策略,都可能會遺漏正確的切分,造成分詞錯誤或失敗。而建立在全切分基礎上的分詞方法,由於全切分取得了所有可能的切分形式,因而從根本上避免了可能切分形式的遺漏,克服了部分切分方法的缺陷。

全切分演算法能取得所有可能的切分形式,它的句子覆蓋率和分詞覆蓋率均為100%,但全切分分詞並沒有在文字處理中廣泛地採用,原因有以下幾點:

1)全切分演算法只是能獲得正確分詞的前提,因為全切分不具有歧義檢測功能,最終分詞結果的正確性和完全性依賴於獨立的歧義處理方法,如果評測有誤,也會造成錯誤的結果。

2)全切分的切分結果個數隨句子長度的增長呈指數增長,一方面將導致龐大的無用資料充斥於儲存資料庫;另一方面當句長達到一定長度後,由於切分形式過多,造成分詞效率嚴重下降。

基於詞的頻度統計的分詞方法:

這是一種全切分方法。它不依靠詞典,而是將文章中任意兩個字同時出現的頻率進行統計,次數越高的就可能是一個詞。它首先切分出與詞表匹配的所有可能的詞,運用統計語言模型和決策演算法決定最優的切分結果。它的優點在於可以發現所有的切分歧義並且容易將新詞提取出來。

4).基於知識理解的分詞方法。

該方法主要基於句法、語法分析,並結合語義分析,通過對上下文內容所提供資訊的分析對詞進行定界,它通常包括三個部分:分詞子系統、句法語義子系統、總控部分。在總控部分的協調下,分詞子系統可以獲得有關詞、句子等的句法和語義資訊來對分詞歧義進行判斷。這類方法試圖讓機器具有人類的理解能力,需要使用大量的語言知識和資訊。由於漢語語言知識的籠統、複雜性,難以將各種語言資訊組織成機器可直接讀取的形式。因此目前基於知識的分詞系統還處在試驗階段。

5).一種新的分詞方法

並行分詞方法:這種分詞方法藉助於一個含有分詞詞庫的管道進行 ,比較匹配過程是分步進行的 ,每一步可以對進入管道中的詞同時與詞庫中相應的詞進行比較 ,由於同時有多個詞進行比較匹配 ,因而分詞速度可以大幅度提高。這種方法涉及到多級內碼理論和管道的詞典資料結構。(詳細演算法可以參考吳勝遠的《並行分詞方法的研究》。)

常用中文分詞包

1. 庖丁解牛分詞包,適用於與Lucene整合。http://www.oschina.net/p/paoding

庖丁中文分詞庫是一個使用Java開發的,可結合到Lucene應用中的,為網際網路、企業內部網使用的中文搜尋引擎分片語件。

Paoding填補了國內中文分詞方面開源元件的空白,致力於此並希翼成為網際網路網站首選的中文分詞開源元件。 Paoding中文分詞追求分詞的高效率和使用者良好體驗。

Paoding's Knives 中文分詞具有極 高效率 和 高擴充套件性 。引入隱喻,採用完全的面向物件設計,構思先進。

高效率:在PIII 1G記憶體個人機器上,1秒 可準確分詞 100萬 漢字。

採用基於 不限制個數的詞典檔案對文章進行有效切分,使能夠將對詞彙分類定義。

能夠對未知的詞彙進行合理解析

2. LingPipe,開源自然語言處理的Java開源工具包。http:/alias-i.com/lingpipe/

功能非常強大,最重要的是文件超級詳細,每個模型甚至連參考論文都列出來了,不僅使用方便,也非常適合模型的學習。

主題分類(Top Classification)、命名實體識別(Named Entity Recognition)、詞性標註(Part-of Speech Tagging)、句題檢測(Sentence Detection)、查詢拼寫檢查(Query Spell Checking)、興趣短語檢測(Interseting Phrase Detection)、聚類(Clustering)、字元語言建模(Character Language Modeling)、醫學文獻下載/解析/索引(MEDLINE Download, Parsing and Indexing)、資料庫文字挖掘(Database Text Mining)、中文分詞(Chinese Word Segmentation)、情感分析(Sentiment Analysis)、語言辨別(Language Identification)等

3. JE分詞包

4. LibMMSeg http://www.oschina.net/p/libmmseg

採用C++開發,同時支援Linux平臺和Windows平臺,切分速度大約在300K/sPM-1.2G),截至當前版本(0.7.1)。

LibMMSeg沒有為速度仔細優化過,進一步的提升切分速度應仍有空間。

5. IKAnalyzer http://www.oschina.net/p/ikanalyzer

IKAnalyzer基於lucene2.0版本API開發,實現了以詞典分詞為基礎的正反向全切分演算法,是LuceneAnalyzer介面的實現。

該演算法適合與網際網路使用者的搜尋習慣和企業知識庫檢索,使用者可以用句子中涵蓋的中文詞彙搜尋,如用"人民"搜尋含"人民幣"的文章,這是大部分使用者的搜尋思維;

不適合用於知識挖掘和網路爬蟲技術,全切分法容易造成知識歧義,因為在語義學上"人民""人民幣"是完全搭不上關係的。

6. PHPCWS http://www.oschina.net/p/phpcws

PHPCWS 是一款開源的PHP中文分詞擴充套件,目前僅支援Linux/Unix系統。

PHPCWS 先使用“ICTCLAS 3.0 共享版中文分詞演算法”的API進行初次分詞處理,再使用自行編寫的“逆向最大匹配演算法”對分詞和進行詞語合併處理,並增加標點符號過濾功能,得出分詞結果。

ICTCLASInstitute of Computing Technology, Chinese Lexical Analysis System)是中國科學院計算技術研究所在多年研究工作積累的基礎上,基於多層隱馬模型研製出的漢語詞法分析系統,主要功能包括中文分詞;詞性標註;命名實體識別;新詞識別;同時支援使用者詞典。ICTCLAS經過五年精心打造,核心升級6次,目前已經升級到了ICTCLAS3.0,分詞精度 98.45%,各種詞典資料壓縮後不到3MICTCLAS在國內973專家組組織的評測中活動獲得了第一名,在第一屆國際中文處理研究機構SigHan 組織的評測中都獲得了多項第一名,是當前世界上最好的漢語詞法分析器。

ICTCLAS 3.0 商業版是收費的,而免費提供的 ICTCLAS 3.0 共享版不開源,詞庫是根據人民日報一個月的語料得出的,很多詞語不存在。所以本人對ICTCLAS分詞後的結果,再採用逆向最大匹配演算法,根據自己補充的一個9萬條詞語的自定義詞庫(與ICTCLAS詞庫中的詞語不重複),對ICTCLAS分詞結果進行合併處理,輸出最終分詞結果。

由於 ICTCLAS 3.0 共享版只支援GBK編碼,因此,如果是UTF-8編碼的字串,可以先用PHPiconv函式轉換成GBK編碼,再用phpcws_split函式進行分詞處理,最後轉換回UTF-8編碼。