基本信息,背景,作用,影響,算法分類,字元匹配,理解法,統計法,技術難點,歧義識別,新詞識別,套用,常見項目,word分詞,智呈分詞,MFSOU中文分詞PHP擴展,SCWS,FudanNLP,ICTCLAS,HTTPCWS,CC-CEDICT,IK,Paoding,MMSEG4J,盤古分詞,Jcseg,friso,
基本信息
背景
存在中文
分詞技術,是由於中文在基本文法上有其特殊性,具體表現在:
1.與英文為代表的拉丁語系語言相比,英文以空格作為天然的分隔設定,而中文由於繼承自古代漢語的傳統,詞語之間沒有分隔。 古代漢語中除了連綿詞和人名地名等,詞通常就是單個漢字,所以當時沒有分詞書寫的必要。而現代漢語中雙字或多字詞居多,一個字不再等同於一個詞。
2.在中文裡,“詞”和“詞組”邊界模糊
現代漢語的基本表達單元雖然為“詞”,且以雙字或者多字詞居多,但由於人們認識水平的不同,對詞和短語的邊界很難去區分。
例如:“對隨地吐痰者給予處罰”,“隨地吐痰者”本身是一個詞還是一個短語,不同的人會有不同的標準,同樣的“海上”“酒廠”等等,即使是同一個人也可能做出不同判斷,如果漢語真的要分詞書寫,必然會出現混亂,難度很大。
中文分詞的方法其實不局限於中文套用,也被套用到英文處理,如手寫識別,單詞之間的空格就不很清楚,中文分詞方法可以幫助判別英文單詞的邊界。
作用
中文分詞是文本挖掘的基礎,對於輸入的一段中文,成功的進行中文分詞,可以達到電腦自動識別語句含義的效果。
中文
分詞技術屬於
自然語言處理技術範疇,對於一句話,人可以通過自己的知識來明白哪些是詞,哪些不是詞,但如何讓計算機也能理解?其處理過程就是分詞算法。
影響
中文分詞對於搜尋引擎來說,最重要的並不是找到所有結果,因為在上百億的網頁中找到所有結果沒有太多的意義,沒有人能看得完,最重要的是把最相關的結果排在最前面,這也稱為相關度排序。中文分詞的準確與否,常常直接影響到對搜尋結果的相關度排序。從定性分析來說,搜尋引擎的分詞算法不同,詞庫的不同都會影響頁面的返回結果。
算法分類
現有的分詞算法可分為三大類:基於
字元串匹配的分詞方法、基於理解的分詞方法和基於統計的分詞方法。按照是否與詞性標註過程相結合,又可以分為單純分詞方法和分詞與標註相結合的一體化方法。
字元匹配
這種方法又叫做機械分詞方法,它是按照一定的策略將待分析的漢字串與一個“充分大的”機器詞典中的詞條進行匹配,若在詞典中找到某個字元串,則匹配成功(識別出一個詞)。按照掃描方向的不同,串匹配分詞方法可以分為正向匹配和逆向匹配;按照不同長度優先匹配的情況,可以分為最大(最長)匹配和最小(最短)匹配;常用的幾種機械分詞方法如下:
1)正向最大匹配法(由左到右的方向);
2)逆向最大匹配法(由右到左的方向);
3)最少切分(使每一句中切出的詞數最小);
4)雙向最大匹配法(進行由左到右、由右到左兩次掃描)
還可以將上述各種方法相互組合,例如,可以將正向最大匹配方法和逆向最大匹配方法結合起來構成雙向匹配法。由於漢語單字成詞的特點,正向最小匹配和逆向最小匹配一般很少使用。一般說來,逆向匹配的切分精度略高於正向匹配,遇到的歧義現象也較少。統計結果表明,單純使用正向最大匹配的錯誤率為1/169,單純使用逆向最大匹配的錯誤率為1/245。但這種精度還遠遠不能滿足實際的需要。實際使用的分詞系統,都是把機械分詞作為一種初分手段,還需通過利用各種其它的語言信息來進一步提高切分的準確率。
一種方法是改進
掃描方式,稱為特徵掃描或標誌切分,優先在待分析字元串中識別和切分出一些帶有明顯特徵的詞,以這些詞作為
斷點,可將原字元串分為較小的串再來進機械分詞,從而減少匹配的錯誤率。另一種方法是將分詞和詞類標註結合起來,利用豐富的詞類信息對分詞決策提供幫助,並且在標註過程中又反過來對分詞結果進行檢驗、調整,從而極大地提高切分的準確率。
對於機械分詞方法,可以建立一個一般的模型,在這方面有專業的學術論文,這裡不做詳細論述。
理解法
這種分詞方法是通過讓計算機模擬人對句子的理解,達到識別詞的效果。其基本思想就是在分詞的同時進行句法、
語義分析,利用句法信息和語義信息來處理歧義現象。它通常包括三個部分:分詞子系統、句法語義子系統、總控部分。在總控部分的協調下,分詞子系統可以獲得有關詞、句子等的句法和語義信息來對分詞歧義進行判斷,即它模擬了人對句子的理解過程。這種分詞方法需要使用大量的語言知識和信息。由於漢語語言知識的籠統、複雜性,難以將各種語言信息組織成機器可直接讀取的形式,因此目前基於理解的分詞系統還處在試驗階段。
統計法
從形式上看,詞是穩定的字的組合,因此在上下文中,相鄰的字同時出現的次數越多,就越有可能構成一個詞。因此字與字相鄰共現的頻率或機率能夠較好的反映成詞的可信度。可以對語料中相鄰共現的各個字的組合的頻度進行統計,計算它們的互現信息。定義兩個字的互現信息,計算兩個漢字X、Y的相鄰共現機率。互現信息體現了漢字之間結合關係的緊密程度。當緊密程度高於某一個閾值時,便可認為此字組可能構成了一個詞。這種方法只需對語料中的字組頻度進行統計,不需要切分詞典,因而又叫做無詞典分詞法或統計取詞方法。但這種方法也有一定的局限性,會經常抽出一些共現頻度高、但並不是詞的常用字組,例如“這一”、“之一”、“有的”、“我的”、“許多的”等,並且對常用詞的識別精度差,時空開銷大。實際套用的統計分詞系統都要使用一部基本的分詞詞典(常用詞詞典)進行串匹配分詞,同時使用統計方法識別一些新的詞,即將串頻統計和串匹配結合起來,既發揮匹配分詞切分速度快、效率高的特點,又利用了無詞典分詞結合上下文識別生詞、自動消除歧義的優點。
另外一類是基於統計機器學習的方法。首先給出大量已經分詞的文本,利用統計機器學習模型學習詞語切分的規律(稱為訓練),從而實現對未知文本的切分。我們知道,漢語中各個字單獨作詞語的能力是不同的,此外有的字常常作為前綴出現,有的字卻常常作為後綴(“者”“性”),結合兩個字相臨時是否成詞的信息,這樣就得到了許多與分詞有關的知識。這種方法就是充分利用漢語組詞的規律來分詞。這種方法的最大缺點是需要有大量預先分好詞的語料作支撐,而且訓練過程中時空開銷極大。
到底哪種分詞算法的準確度更高,目前並無定論。對於任何一個成熟的分詞系統來說,不可能單獨依靠某一種算法來實現,都需要綜合不同的算法。例如,海量科技的分詞算法就採用“複方分詞法”,所謂複方,就是像中西醫結合般綜合運用機械方法和知識方法。對於成熟的中文分詞系統,需要多種算法綜合處理問題。
技術難點
有了成熟的分詞算法,是否就能容易的解決中文分詞的問題呢?事實遠非如此。中文是一種十分複雜的語言,讓計算機理解中文語言更是困難。在中文分詞過程中,有兩大難題一直沒有完全突破。
歧義識別
歧義是指同樣的一句話,可能有兩種或者更多的切分方法。主要的歧義有兩種:交集型歧義和組合型歧義,例如:表面的,因為“表面”和“面的”都是詞,那么這個短語就可以分成“表面 的”和“表 面的”。這種稱為交集型歧義(交叉歧義)。像這種交集型歧義十分常見,前面舉的“和服”的例子,其實就是因為交集型歧義引起的錯誤。“化妝和服裝”可以分成“化妝 和 服裝”或者“化妝 和服 裝”。由於沒有人的知識去理解,計算機很難知道到底哪個方案正確。
交集型歧義相對組合型歧義來說是還算比較容易處理,組合型歧義就必須根據整個句子來判斷了。例如,在句子“這個門把手壞了”中,“把手”是個詞,但在句子“請把手拿開”中,“把手”就不是一個詞;在句子“將軍任命了一名中將”中,“中將”是個詞,但在句子“產量三年中將增長兩倍”中,“中將”就不再是詞。這些詞計算機又如何去識別?
如果交集型歧義和組合型歧義計算機都能解決的話,在歧義中還有一個難題,是真歧義。真歧義意思是給出一句話,由人去判斷也不知道哪個應該是詞,哪個應該不是詞。例如:“桌球拍賣完了”,可以切分成“桌球 球拍 賣 完 了”、也可切分成“桌球 拍賣 完 了”,如果沒有上下文其他的句子,恐怕誰也不知道“拍賣”在這裡算不算一個詞。
新詞識別
命名實體(人名、地名)、新詞,專業術語稱為未登錄詞。也就是那些在分詞詞典中沒有收錄,但又確實能稱為詞的那些詞。最典型的是人名,人可以很容易理解。句子“王軍虎去廣州了”中,“王軍虎”是個詞,因為是一個人的名字,但要是讓計算機去識別就困難了。如果把“王軍虎”做為一個詞收錄到字典中去,全世界有那么多名字,而且每時每刻都有新增的人名,收錄這些人名本身就是一項既不划算又巨大的工程。即使這項工作可以完成,還是會存在問題,例如:在句子“王軍虎頭虎腦的”中,“王軍虎”還能不能算詞?
除了人名以外,還有機構名、地名、產品名、商標名、簡稱、省略語等都是很難處理的問題,而且這些又正好是人們經常使用的詞,因此對於搜尋引擎來說,分詞系統中的新詞識別十分重要。新詞識別準確率已經成為評價一個分詞系統好壞的重要標誌之一。
套用
在
自然語言處理技術中,中文處理技術比西文處理技術要落後很大一段距離,許多西文的處理方法中文不能直接採用,就是因為中文必需有分詞這道工序。中文分詞是其他
中文信息處理的基礎,搜尋引擎只是中文分詞的一個套用。其他的比如
機器翻譯(MT)、
語音合成、自動分類、自動摘要、自動校對等等,都需要用到分詞。因為中文需要分詞,可能會影響一些研究,但同時也為一些企業帶來機會,因為國外的計算機處理技術要想進入中國市場,首先也是要解決中文分詞問題。
分詞準確性對搜尋引擎來說十分重要,但如果分詞速度太慢,即使準確性再高,對於搜尋引擎來說也是不可用的,因為搜尋引擎需要處理數以億計的網頁,如果分詞耗用的時間過長,會嚴重影響搜尋引擎內容更新的速度。因此對於搜尋引擎來說,分詞的準確性和速度,二者都需要達到很高的要求。研究中文分詞的大多是科研院校,清華、北大、哈工大、中科院、北京語言大學、山西大學、
東北大學、IBM研究院、微軟中國研究院等都有自己的研究隊伍,而真正專業研究中文分詞的商業公司除了海量以外,幾乎沒有了。科研院校研究的技術,大部分不能很快產品化,而一個專業公司的力量畢竟有限,看來中文
分詞技術要想更好的服務於更多的產品,還有很長一段路。
常見項目
word分詞
word分詞是一個Java實現的分散式的中文分詞組件,提供了多種基於詞典的分詞算法,並利用ngram模型來消除歧義。能準確識別英文、數字,以及日期、時間等數量詞,能識別人名、地名、組織機構名等未登錄詞。能通過自定義配置檔案來改變組件行為,能自定義用戶詞庫、自動檢測詞庫變化、支持大規模分散式環境,能靈活指定多種分詞算法,能使用refine功能靈活控制分詞結果,還能使用詞性標註、同義標註、反義標註、拼音標註等功能。同時還無縫和
Lucene、
Solr、
ElasticSearch、
Luke集成。
智呈分詞
功能性能
功能描述: | 1.新詞自動識別 對詞典中不存在的詞,可以自動識別,對詞典的依賴較小。 2.詞性輸出 分詞結果中帶有豐富的詞性。 3.動態詞性輸出 分詞結果中的詞性並非固定,會根據不同的語境,賦予不同的詞性。 4.特殊詞識別 比如化學、藥品等行業辭彙,地名、品牌、媒體名等。 5.智慧型歧義解決 根據內部規則,智慧型解決常見分詞歧義問題。 6.多種編碼識別 自動識別各種單一編碼,並支持混合編碼。 7.數詞量詞最佳化 自動識別數量詞。 |
性能介紹: | 處理器:AMD Athlon II x2 250 3GHZ 單執行緒大於833KB/s,多執行緒安全。 |
MFSOU中文分詞PHP擴展
一個PHP函式實現中文分詞。使分詞更容易,使用如下圖:
SCWS
Hightman開發的一套基於詞頻詞典的機械中文分詞引擎,它能將一整段的漢字基本正確的切分成詞。採用的是採集的詞頻詞典,並輔以一定的專有名稱,人名,地名,數字年代等規則識別來達到基本分詞,經小範圍測試大概準確率在 90% ~ 95% 之間,已能基本滿足一些小型搜尋引擎、關鍵字提取等場合運用。45Kb左右的文本切詞時間是0.026秒,大概是1.5MB文本/秒,支持PHP4和PHP 5。
FudanNLP
FudanNLP主要是為中文
自然語言處理而開發的工具包,也包含為實現這些任務的機器學習算法和數據集。本工具包及其包含數據集使用LGPL3.0許可證。開發語言為Java。功能包括中文分詞等,不需要字典支持。
ICTCLAS
這是最早的中文開源分詞項目之一,ICTCLAS在國內973專家組組織的評測中活動獲得了第一名,在第一屆國際中文處理研究機構SigHan組織的評測中都獲得了多項第一名。ICTCLAS3.0分詞速度單機996KB/s,分詞精度98.45%,API不超過200KB,各種詞典數據壓縮後不到3M.ICTCLAS全部採用C/C++編寫,支持Linux、FreeBSD及Windows系列作業系統,支持C/C++、C#、Delphi、Java等主流的開發語言。
HTTPCWS
HTTPCWS 是一款基於
HTTP協定的開源中文分詞系統,目前僅支持Linux系統。HTTPCWS 使用“ICTCLAS 3.0 2009共享版中文分詞算法”的API進行分詞處理,得出分詞結果。HTTPCWS 將取代之前的 PHPCWS 中文分詞擴展。
CC-CEDICT
一個中文詞典開源項目,提供一份以漢語拼音為中文輔助的漢英辭典,截至2009年2月8日,已收錄82712個單詞。其詞典可以用於中文分詞使用,而且不存在著作權問題。Chrome中文版就是使用的這個詞典進行中文分詞的。
IK
IKAnalyzer是一個開源的,基於
java語言開發的輕量級的中文分詞工具包。從2006年12月推出1.0版開始,IKAnalyzer已經推出了3個大版本。最初,它是以開源項目Luence為套用主體的,結合詞典分詞和文法分析算法的中文分詞組件。新版本的IKAnalyzer3.0則發展為面向Java的公用分詞組件,獨立於Lucene項目,同時提供了對Lucene的默認最佳化實現。
Paoding
Paoding(庖丁解牛分詞)基於Java的開源中文分詞組件,提供lucene和solr 接口,具有極
高效率和
高擴展性。引入隱喻,採用完全的
面向對象設計,構思先進。
高效率:在PIII 1G記憶體個人機器上,1秒可準確分詞 100萬漢字。
採用基於 不限制個數的詞典檔案對文章進行有效切分,使能夠將對辭彙分類定義。
能夠對未知的辭彙進行合理解析。
MMSEG4J
MMSEG4J基於Java的開源中文分詞組件,提供lucene和solr 接口:
1.mmseg4j 用 Chih-Hao Tsai 的 MMSeg 算法實現的中文分詞器,並實現 lucene 的 analyzer 和 solr 的TokenizerFactory 以方便在Lucene和Solr中使用。
2.MMSeg 算法有兩種分詞方法:Simple和Complex,都是基於正向最大匹配。Complex 加了四個規則過慮。官方說:詞語的正確識別率達到了 98.41%。
mmseg4j 已經實現了這兩種分詞算法。
盤古分詞
盤古分詞是一個基於.net 平台的開源中文分詞組件,提供lucene(.net 版本) 和HubbleDotNet的接口
高效:Core Duo 1.8 GHz 下單執行緒 分詞速度為 390K 字元每秒
準確:盤古分詞採用字典和統計結合的分詞算法,分詞準確率較高。
功能:盤古分詞提供中文人名識別,簡繁混合分詞,多元分詞,英文詞根化,強制一元分詞,詞頻優先分詞,
停用詞過濾,英文專名提取等一系列功能。
Jcseg
jcseg是使用Java開發的一個中文分詞器,使用流行的mmseg算法實現。
1。mmseg四種過濾算法,分詞準確率達到了98.4%以上。
2。支持自定義詞庫。在lexicon資料夾下,可以隨便添加/刪除/更改詞庫和詞庫內容,並且對詞庫進行了分類,詞庫整合了《現代漢語詞典》和cc-cedict辭典。
3。詞條拼音和同義詞支持,jcseg為所有詞條標註了拼音,並且詞條可以添加同義詞集合,jcseg會自動將拼音和同義詞加入到分詞結果中。
4。中文數字和分數識別,例如:"四五十個人都來了,三十分之一。"中的"四五十"和"三十分之一",並且jcseg會自動將其轉換為對應的阿拉伯數字。
5。支持中英混合詞的識別。例如:B超,x射線。
6。支持基本單字單位的識別,例如2012年。
7。良好的英文支持,自動識別電子郵件,網址,分數,小數,百分數……。
8。智慧型圓角半角轉換處理。
9。特殊字母識別:例如:Ⅰ,Ⅱ
10。特殊數字識別:例如:①,⑩
11。配對標點內容提取:例如:最好的Java書《java編程思想》,‘暢想杯黑客技術大賽’,被《,‘,“,『標點標記的內容。
12。智慧型中文人名識別。中文人名識別正確率達94%以上。
jcseg佩帶了jcseg.properties配置文檔,使用文本編輯器就可以自主的編輯其選項,配置適合不同套用場合的分詞套用。例如:最大匹配分詞數,是否開啟中文人名識別,是否載入詞條拼音,是否載入詞條同義詞……。
friso
friso是使用c語言開發的一個中文分詞器,使用流行的mmseg算法實現。完全基於模組化設計和實現,可以很方便的植入到其他程式中,例如:MySQL,PHP等。並且提供了一個php中文分詞擴展robbe。
1。只支持UTF-8編碼。【源碼無需修改就能在各種平台下編譯使用,載入完20萬的詞條,記憶體占用穩定為14M。】。
2。mmseg四種過濾算法,分詞準確率達到了98.41%。
3。支持自定義詞庫。在dict資料夾下,可以隨便添加/刪除/更改詞庫和詞庫詞條,並且對詞庫進行了分類。
4。詞庫使用了friso的Java版本jcseg的簡化詞庫。
5。支持中英混合詞的識別。例如:c語言,IC卡。
7。很好的英文支持,電子郵件,網址,小數,分數,百分數。
8。支持阿拉伯數字基本單字單位的識別,例如2012年,5噸,120斤。
9。自動英文圓角/半角,大寫/小寫轉換。
並且具有很高的分詞速度:簡單模式:3.7M/秒,複雜模式:1.8M/秒。