原做者:http://www.cnblogs.com/I-Tegulia/category/706685.htmlphp
分詞算法在20世紀80年代就有研究,不過基於當時的技術條件所限,大多數就是原始的機械分詞算法。好比,最大匹配算法,mmseg等。關於原始的機械分詞算法 http://www.cnblogs.com/alic/articles/1215001.html 這篇blog有很詳細的介紹。html
以後隨着統計算法在天然語言處理領域地位的奠基以及機器學習的興起,基於統計和機器學習的分詞算法逐漸成爲主流。根據機器學習方法的分類,分詞算法也能夠分紅無監督分詞,半監督分詞以及有監督的分詞。目前有監督的分詞以及半監督的分詞已經研究的比較成熟。對於這種分詞算法,大體能夠分爲四類:前端
此外,分詞算法還能夠根據在天然預言處理中的步驟來分,好比純分詞,就是除了分詞以外什麼都不作,大多數基於字的分詞算法都屬於這一類。此外將分詞和詞性標註結合在一塊兒完成,好比ICTCLAS。還有基於語義網絡分詞的算法。總的來講,結合額外信息越多,對於分詞結果就越好。好比ICTCLAS將分詞與詞性標註結果結合起來,效果就比光光使用一元機率模型(ICTCLAS)效果要好。java
分詞模型大體能夠分爲判別式和生成式,以及基於詞和基於字的方法。主要使用到的模型爲: n-Gram,Percepton,HMM,SVM,ME,CRF。判別式和生成式的區別就是判別式是計算P(Y|X)的條件機率,可是生成式則是計算P(X1, X2)的聯合機率,一般來講判別式的效果要比生成式的要好,這一分類比較複雜,很差解釋,涉及到不少數學模型,詳情能夠去看看相關資料。git
基於詞和基於字的分詞的區別就是基於詞的算法將詞當作算法中最小單元,好比這句話github
結合/成/分子/時web
在基於詞的分詞算法中,主要用到一個詞典,「結合」、「成」、「分子」在詞典中,它們是分詞中的最小單元,不可拆分,一旦拆分就會出現分詞錯誤。可是基於字的分詞算法則不一樣,它將每一個字當作是一個單元,一般和序列標註相結合,對每一個字進行標註,而後得出分詞結果。好比正則表達式
結合成分子時算法
使用CRF等序列標註模型得出的序列標註結果是編程
B E S B E S
其中B表示一個詞的開頭,E表示一個詞的結尾,S表示單個字做爲詞。而後分詞的結果通過一些小處理就能夠得出了。
一般來講基於詞的分詞算法在詞典比較全,文章比較正式的時候效果比較好。可是老是會碰見一些比較變態的詞典中沒有的詞,其中最有表明的就是人名地名還有商標名等等。因此通常這些基於詞分詞軟件還必需要加上識別人名地名的功能。
基於字的分詞算法主要是依賴於某些字在構詞方面的特徵,好比「的」字一般就是單個字出現,有很大的概率是標註S,「化」字比較喜歡出如今詞的末尾,好比現代化,工業化等等。根據這些信息進行標註分詞,它對於詞典中不存在的詞效果識別概率比較大,可是對於詞典中的詞可能會識別錯誤,另外還會出現千奇百怪的分詞錯誤,好比「沙把」等等。 所以,如今多數的分詞軟件在基於字的基於上,或多或少的結合了一點基於詞的特徵。
因爲中文文本詞與詞之間沒有像英文那樣有空格分隔,所以不少時候中文文本操做都涉及切詞,這裏整理了一些。通常來講用CRF實現的分詞工具的處理速度是比較慢的(訓練CRF模型是很是耗時的),可是精度高,涉及CRF的分詞工具備CRF++,Stanford分詞工具。
Bakeoff是一個國際中文處理比賽,有多個語料,因此每一個語料都有排名。只有部分優秀的Bakeoff工具開源,如下介紹如下18種分詞工具(大部分是基於java語言):
Stanford 漢語分詞工具
官網:http://nlp.stanford.edu/software/segmenter.shtmlStanford 漢語分詞工具的成績:2005年Bakeoff2兩個語料的測試第一。Stanford 漢語分詞工具
一篇使用介紹:http://hi.baidu.com/liheming333/item/585fba1f898838623e87ce18
斯坦福天然語言小組直接使用CRF 的方法,特徵窗口爲5。
哈工大語言云(LTP -cloud)
項目網址:http://www.ltp-cloud.com/download/#ltp_cloud_sdk
HIT的ITNLP Lab, HIT Wei JIANG在Bakeoff 2005的open語料MSR上得到測評第一名。語言云曾獲CoNLL2009七國語言句法語義分析評測總成績第一名,使用方式爲web service。
語言云(語言技術平臺雲 LTP-Cloud)是由哈工大社會計算與信息檢索研究中心研發的雲端天然語言處理服務平臺。 後端依託於語言技術平臺,語言云爲用戶提供了包括分詞、詞性標註、依存句法分析、命名實體識別、語義角色標註在內的豐富高效的天然語言處理服務。
做爲基於雲端的服務,語言云具備以下一些優點:
ICTCLAS: 漢語詞法分析系統
官網:http://ictclas.nlpir.org/ Author:中國科學院計算技術研究所
ICTCLAS(Institute of Computing Technology, Chinese Lexical Analysis System)獲取Bakeoff 1兩項第一。這是最先的中文開源分詞項目之一,ICTCLAS在國內973專家組組織的評測中活動得到了第一名,在第一屆(2003)國際中文處理研究機構SigHan組織的評測中都得到了多項第一名。
性能:分詞速度單機996KB/s, API 不超過 200KB ,各類詞典數據壓縮後不到 3M.
準確率:分詞精度98.45%
語言和平臺:ICTCLAS所有采用 C/C++ 編寫,支持 Linux 、 FreeBSD 及 Windows 系列操做系統,支持 C/C++ 、 C# 、 Delphi、 Java 等主流的開發語言。
主要功能:中文分詞;詞性標註;命名實體識別;新詞識別;同時支持用戶詞典;支持繁體中文;支持GBK 、 UTF-8 、 UTF-7 、 UNICODE 等多種編碼格式。
算法:完美PDAT 大規模知識庫管理技術( 200510130690.3 ),在高速度與高精度之間取得了重大突破,該技術能夠管理百萬級別的詞典知識庫,單機每秒能夠查詢 100 萬詞條,而內存消耗不到知識庫大小的 1.5 倍。層疊隱馬爾可夫模型( Hierarchical Hidden Markov Model ) ,該分詞系統的主要是思想是先經過 CHMM( 層疊形馬爾可夫模型 ) 進行分詞 , 經過分層 , 既增長了分詞的準確性 , 又保證了分詞的效率 . 共分五層, 以下圖所示。基本思路是進行原子切分 , 而後在此基礎上進行N- 最短路徑粗切分 , 找出前 N 個最符合的切分結果 , 生成二元分詞表 , 而後生成分詞結果 , 接着進行詞性標註並完成主要分詞步驟 .
Ansj(ICTCLAS的java實現)
項目網址:https://github.com/ansjsun/ansj_seg
做者網址:http://www.ansj.org/
ansj分詞.ict的真正java實現.分詞效果速度都超過開源版的ict.中文分詞,人名識別,詞性標註,用戶自定義詞典增長了對lucene的支持.若是不想編譯文件能夠直接到 https://github.com/ansjsun/mvn-repo/tree/gh-pages/org/ansj這裏下載jar包!
這是一個ictclas的java實現.基本上重寫了全部的數據結構和算法.詞典是用的開源版的ictclas所提供的.而且進行了部分的人工優化。
性能:內存中中文分詞每秒鐘大約100萬字(速度上已經超越ictclas),文件讀取分詞每秒鐘大約30萬字
正確率:準確率能達到96%以上
功能:目前實現了.中文分詞. 中文姓名識別 . 用戶自定義詞典能夠應用到天然語言處理等方面,適用於對分詞效果要求搞的各類項目.
庖丁解牛分詞
官網:http://code.google.com/p/paoding/
語言和平臺:Java,提供 lucence 3.0 接口,僅支持 Java 語言。
性能:在PIII 1G 內存我的機器上, 1 秒 可準確分詞 100 萬 漢字。
算法:採用基於 不限制個數 的詞典文件對文章進行有效切分
主要功能:使可以將對詞彙分類定義。可以對未知的詞彙進行合理解析
盤古分詞
官網:http://pangusegment.codeplex.com
博客:http://www.cnblogs.com/eaglet/
是一箇中英文分詞組件。Pan Gu Segment is alibrary that can segment Chinese and English words from sentence.盤古分詞是一箇中英文分詞組件。做者eaglet 曾經開發過KTDictSeg 中文分詞組件,擁有大量用戶。做者基於以前分詞組件的開發經驗,結合最新的開發技術從新編寫了盤古分詞組件。
主要功能:中文分詞功能,中文未登陸詞識別,詞頻優先, 盤古分詞能夠根據詞頻來解決分詞的歧義問題, 多元分詞, 盤古分詞提供多重輸出解決分詞粒度和分詞精度權衡的問題, 中文人名識別, 強制一元分詞, 繁體中文分詞, 同時輸出簡體和繁體 中文詞性輸出 盤古分詞能夠將以登陸詞的中文詞性輸出給用戶,以方便用戶作進一步處理, 全角字符支持, 盤古分詞能夠識別全角的字母和數字, 英文分詞, 英文專用詞識別(一些英文簡寫是字母符號混合,或者是字母數字混合,這個分詞起來就不能按照空格符號這樣分割了,對於字母符號混合的如 U.S.A ,只要將這個詞錄入到字典中,盤古分詞就能夠分出整詞。對於字母和數字混合的,盤古分詞會自動做爲整詞輸出),英文原詞輸出,英文大小寫同時輸出。
其餘功能:
停用詞過濾:對於一些標點符號,連詞,助詞等有時候須要在分詞時過濾掉,盤古分詞提供一個 StopWord.txt 文件,用戶只要將須要過濾的詞加入到這個文件中,並將停用詞過濾開發打開,就能夠過濾掉這些詞。
設置分詞權值:盤古分詞可讓用戶對以下特性設置自定義權值,1 未登陸詞權值 2 最匹配詞權值 3 次匹配詞權值 4 再次匹配詞權值 5 強行輸出的單字的權值 6 數字的權值 7 英文詞彙權值 8 符號的權值 9 強制同時輸出簡繁漢字時,非原來文本的漢字輸出權值。
用戶自定義規則:
字典管理,盤古分詞提供一個字典管理工具 DictManage 經過這個工具,你能夠增長,修改,和刪除字典中的單詞
動態加載字典,經過字典工具增長,修改,和刪除字典中的單詞後,保持字典,盤古分詞會自動將新的字典文件加載進去,而不須要從新啓動。
關鍵詞高亮組件,Lucene 提供了一個關鍵詞高亮組件,但這個組件對中文的支持不是特別好,特別是若是還有多元分詞的狀況,處理的就更很差。盤古分詞提供了一個針對中文和英文的關鍵詞高亮組件 PanGu.HighLight ,其對中文的支持要好於Lucene 那個高亮組件。
同義詞輸出( 後續版本提供 ),Lucene.net 接口及示例等在PanGu4Lucene 這個包裏面有我作的一個盤古 +Lucene 的簡單新聞搜索 Web 示例程序, Release 包裏面有使用說明。
性能:Core Duo 1.8 GHz 下單線程 分詞速度爲 390K 字符每秒, 2 線程分詞速度爲 690K 字符每秒。
算法:盤古分詞提供的字典包括17萬個中文經常使用單詞,但這個字典依然不夠完整,若是要分詞更準確,須要適當維護一下這個字典。中文人名的識別能力取決於 ChsSingleName.txt , ChsDoubleName1.txt , ChsDoubleName2.txt 這三個文件,它們分別表示單子人名,雙字人名的首字和雙字人名的尾字。
IKAnalyzer
官網:http://code.google.com/p/ik-analyzer/
做者博客:http://linliangyi2007.iteye.com/
從2006年12月推出1.0版開始。開源輕量級的包語言和平臺:基於java 語言開發 , 最初,它是以開源項目Luence爲應用主體的,結合詞典分詞和文法分析算法的中文分詞組件。新版本的 IKAnalyzer3.0 則發展爲面向 Java 的公用分詞組件,獨立於 Lucene 項目,同時提供了對 Lucene 的默認優化實現。
算法:採用了特有的「 正向迭代最細粒度切分算法 「 。採用了多子處理器分析模式,支持:英文字母( IP 地址、 Email 、 URL )、數字(日期,經常使用中文數量詞,羅馬數字,科學計數法),中文詞彙(姓名、地名處理)等分詞處理。優化的詞典存儲,更小的內存佔用。支持用戶詞典擴展定義。針對 Lucene 全文檢索優化的查詢分析器 IKQueryParser ;採用歧義分析算法優化查詢關鍵字的搜索排列組合,能極大的提升 Lucene 檢索的命中率。
性能:在系統環境:Core2i7 3.4G雙核,4G內存,window 7 64位, Sun JDK 1.6_29 64位 普通pc環境測試,IK2012具備160萬字/秒(3000KB/S)的高速處理能力
imdict-chinese-analyzer
官網:http://code.google.com/p/imdict-chinese-analyzer/是imdict 智能詞典的智能中文分詞模塊,ictclas4j中文分詞系統是 sinboy 在中科院張華平和劉羣老師的研製的 FreeICTCLAS 的基礎上完成的一個 java 開源分詞項目,簡化了原分詞程序的複雜度,旨在爲廣大的中文分詞愛好者一個更好的學習機會。
算法 :基於隱馬爾科夫模型(Hidden Markov Model, HMM) ,是中國科學院計算技術研究所的 ictclas 中文分詞程序的從新實現(基於 Java ),能夠直接爲lucene搜索引擎提供簡體中文分詞支持 。
主要功能:
1, 徹底 Unicode 支持,分詞核心模塊徹底採用Unicode 編碼,無須各類漢字編碼的轉換,極大的提高了分詞的效率。2. 提高搜索效率,根據imdict 智能詞典的實踐,在有智能中文分詞的狀況下,索引文件比沒有中文分詞的索引文件小 1/3
3. 提升搜索準確度,imdict-chinese-analyzer採用了 HHMM 分詞模型,極大的提升了分詞的準確率,在此基礎上的搜索,比對漢字逐個切分要準確得多!
4. 更高效的數據結構,爲了提升效率,針對經常使用中文檢索的應用場景,imdict-chinese-analyzer 對一些沒必要要的功能進行了刪減,例如詞性標註、人名識別、時間識別等等。另外還修改了算法的數據結構,在內存佔用量縮減到 1/3 的狀況下把效率提高了數倍。imdict-chinese-analyzer的分詞效率與 C ++實現的 ICTCLAS 3.0的分詞效率在同一個數量級,是 ictclas4j 的 36 倍!
mmseg4j
項目網址:(舊)http://code.google.com/p/mmseg4j/
(新)https://github.com/chenlb/mmseg4j-solr
做者博客:http://blog.chenlb.com/ http://chenlb.iteye.com/
算法:
一、mmseg4j 用 Chih-Hao Tsai 的 MMSeg 算法(http://technology.chtsai.org/mmseg/)實現的中文分詞器,並實現 lucene 的 analyzer和 solr 的TokenizerFactory 以方便在Lucene和Solr中使用。
二、MMSeg 算法有兩種分詞方法:Simple和Complex,都是基於正向最大匹配。Complex 加了四個規則過慮。官方(指mmseg論文的做者)說:詞語的正確識別率達到了 98.41%。
mmseg4j 已經實現了這兩種分詞算法。
Jcseg
官網:http://code.google.com/p/jcseg/
jcseg是使用Java開發的一箇中文分詞器,使用mmseg算法實現。目前最高版本:jcseg1.9.0。兼容最高版本lucene-4.x和最高版本solr-4.x
主要特性:
mmseg四種過濾算法,分詞準確率達到了98.41%。
支持自定義詞庫。在lexicon文件夾下,能夠隨便添加/刪除/更改詞庫和詞庫內容,而且對詞庫進行了分類。如何給jcseg添加詞庫/新詞。
中英文同義詞追加/同義詞匹配 + 中文詞條拼音追加.詞庫整合了《現代漢語詞典》和cc-cedict辭典中的詞條,而且依據cc-cedict詞典爲詞條標上了拼音,依據《中華同義詞詞 典》爲詞條標上了同義詞(還沒有完成)。更改jcseg.properties配置文檔能夠在分詞的時候加入拼音和同義詞到分詞結果中。
中文數字和中文分數識別,例如:」一百五十我的都來了,四十分之一的人。」中的」一百五十」和」四十分之一」。而且jcseg會自動將其轉換爲阿拉伯數字加入到分詞結果中。如:150, 1/40。
支持中英混合詞和英中混合詞的識別(維護詞庫能夠識別任何一種組合)。例如:B超, x射線, 卡拉ok, 奇都ktv, 哆啦a夢。
更好的英文支持,電子郵件,網址,小數,分數,百分數,字母和標點組合詞(例如C++, c#)的識別。(這個對購物網址來講很重要)。
支持阿拉伯數字/小數/中文數字基本單字單位的識別,例如2012年,1.75米,38.6℃,五折,而且jcseg會將其轉換爲「5折」加入分詞結果中。
智能圓角半角, 英文大小寫轉換;特殊字母識別:例如:Ⅰ,Ⅱ;特殊數字識別:例如:①,⑩
配對標點內容提取:例如:最好的Java書《java編程思想》,‘暢想杯黑客技術大賽’,被《,‘,「,『標點標記的內容。(1.6.8版開始支持)。
智能中文人名識別。中文人名識別正確率達94%以上。(能夠維護lex-lname.lex,lex-dname-1.lex,lex-dname-2.lex來提升準確率),(引入規則和詞性後會達到98%以上的識別正確率)。
自動中英文中止詞過濾功能(須要在jcseg.properties中開啓該選項,lex-stopwords.lex爲中止詞詞庫)。
詞庫更新自動加載功能, 開啓一個守護線程隨時檢測詞庫的更新而且加載。
自動詞性標註。
分詞速度:
測試環境:2.8GHZ/2G/Ubuntu
Simple 模式: 1366058字/秒 3774.5KB/秒
Complex 模式: 479338字/秒 1324.4KB/秒
分詞正確率98%以上,請參考本算法的原做:http://technology.chtsai.org/mmseg/
測試文章,「世界與和平」 簡易模式830msec,複雜模式2461msec。
SCWS
算法:基於詞頻詞典的機械中文分詞引擎,採用的是採集的詞頻詞典,並輔以必定的專有名稱,人名,地名,數字年代等規則識別來達到基本分詞
準確率:經小範圍測試大概準確率在 90% ~ 95% 之間,已能基本知足一些小型搜索引擎、關鍵字提取等場合運用。
性能:45Kb左右的文本切詞時間是 0.026 秒,大概是 1.5MB 文本 / 秒,
語言和平臺:SCWS 採用純 C 代碼開發,以 Unix-Like OS 爲主要平臺環境,提供共享函數庫,方便植入各類現有軟件系統。此外它支持 GBK , UTF-8 ,BIG5 等漢字編碼。支持 PHP4 和PHP 5 。
版本列表
Friso
官網http://code.google.com/p/friso/
friso是使用c語言開發的一箇中文分詞器,使用流行的mmseg算法實現。徹底基於模塊化設計和實現,能夠很方便的植入到其餘程序中,例如:MySQL,PHP等。而且提供了一個php中文分詞擴展robbe。
特性:
只支持UTF-8編碼。【源碼無需修改就能在各類平臺下編譯使用,加載完20萬的詞條,內存佔用穩定爲14M。】。
mmseg四種過濾算法,分詞準確率達到了98.41%。
支持自定義詞庫。在dict文件夾下,能夠隨便添加/刪除/更改詞庫和詞庫詞條,而且對詞庫進行了分類。
詞庫使用了friso的Java版本jcseg的簡化詞庫。
支持中英混合詞的識別。例如:c語言,IC卡。
很好的英文支持,電子郵件,網址,小數,分數,百分數。
支持阿拉伯數字基本單字單位的識別,例如2012年,5噸,120斤。
自動英文圓角/半角,大寫/小寫轉換。而且具備很高的分詞速度:簡單模式:3.7M/秒,複雜模式:1.8M/秒。
HTTPCWS:
PHPCWS 是一款開源的 PHP 中文分詞擴展,目前僅支持 Linux/Unix 系統。
算法:PHPCWS 先使用「ICTCLAS 3.0 共享版中文分詞算法 」 的 API 進行初次分詞處理,再使用自行編寫的 「 逆向最大匹配算法 」 對分詞和進行詞語合併處理,並增長標點符號過濾功能,得出分詞結果。 ICTCLAS 3.0 商業版是收費的,而免費提供的 ICTCLAS 3.0 共享版不開源,詞庫是根據人民日報一個月的語料得出的,不少詞語不存在。因此本人對 ICTCLAS 分詞後的結果,再採用逆向最大匹配算法,根據本身補充的一個 9 萬條詞語的自定義詞庫(與 ICTCLAS 詞庫中的詞語不重複),對 ICTCLAS 分詞結果進行合併處理,輸出最終分詞結果。因爲 ICTCLAS 3.0 共享版只支持 GBK 編碼,所以,若是是 UTF-8 編碼的字符串,能夠先用 PHP 的 iconv 函數轉換成 GBK 編碼,再用 phpcws_split 函數進行分詞處理,最後轉換回 UTF-8 編碼。
性能:5 8字節的一句話 ——「2009 年 2 月 13 日,我編寫了一款PHP 中文分詞擴展: PHPCWS 1.0.0。 」 ,分詞速度只需 0.0003 秒。對於那些採用二元交叉切分的搜索引擎, PHPCWS 用在前端搜索層對用戶輸入的搜索關鍵字、短語進行分詞處理,一樣適合。 PHPCWS 開發的目的正在於此,對於短句、小文本中文分詞切分,速度很是之快。
libmmseg
語言和平臺: 用C++ 編寫的開源的中文分詞軟件, libmmseg 主要被做者用來實現 Sphinx 全文檢索軟件的中文分詞功能,所以做者給 Sphinx 提供了一個補丁文件,可讓 Sphinx 集成 libmmseg ,從而支持對於中文文章的全文檢索功能。 libmmseg 從 0.7.2版本開始,做者提供了 ruby 調用的接口,因此咱們能夠直接在ruby 程序裏面調用 libmmseg 進行分詞了。特別是咱們能夠用 ferret 去調用 libmmseg 分詞功能,從而讓 ruby 原生支持中文的全文檢索。
算法 :「基於詞庫的最大匹配算法 」
性能:分詞速度爲每秒300KB左右。
OpenCLAS
是一個開源的中文詞法分析庫。
主要功能:其中包括了中文分詞、詞性標註等功能。系統使用基於機率的多層HMM 。能夠對已登陸詞和未登陸詞進行識別分析。OpenCLAS是對原有的 ICTCLAS ( 中科院中文詞法分析系統 ) 進行的重寫。 OpenCLAS 將不包含任何 ICTCLAS 中的源代碼,而且以 BSD 協議發佈。所以其代碼能夠在知足 BSD 協議的前提下,用於包括商用在內的各類場合。OpenCLAS將包含三個語言分支,C++, Java 和 C# 。 ( 目前只實現了 C++ 的版本 ) 。
CRF++(上海交大)
項目網址:http://code.google.com/p/crfpp/
詳細介紹:http://crfpp.googlecode.com/svn/trunk/doc/index.html
我的主頁:http://bcmi.sjtu.edu.cn/~zhaohai/index.ch.html
參考原文地址:
http://ling0322.info/2013/02/13/cws-intro.html
http://www.onexin.net/to-achieve-the-18-chinese-word-segmentation-tool/