中文分词学习总结
中文分詞
中文分詞(Chinese Word Segmentation) 指的是將一個(gè)漢字序列切分成一個(gè)一個(gè)單獨(dú)的詞。分詞就是將連續(xù)的字序列按照一定的規(guī)范重新組合成詞序列的過(guò)程。我們知道,在英文的行文中,單詞之間是以空格作為自然分界符的,而中文只是字、句和段能通過(guò)明顯的分界符來(lái)簡(jiǎn)單劃界,唯獨(dú)詞沒(méi)有一個(gè)形式上的分界符,雖然英文也同樣存在短語(yǔ)的劃分問(wèn)題,不過(guò)在詞這一層上,中文比之英文要復(fù)雜的多、困難的多。中文名 中文分詞
外文名 Chinese Word Segmentation
目錄
1 基本信息
2 算法分類
3 技術(shù)難點(diǎn)
4 應(yīng)用
5 常見(jiàn)項(xiàng)目
基本信息
背景
存在中文分詞技術(shù),是由于中文在基本文法上有其特殊性,具體表現(xiàn)在:
1.與英文為代表的拉丁語(yǔ)系語(yǔ)言相比,英文以空格作為天然的分隔符,而中文由于繼承自古代漢語(yǔ)的傳統(tǒng),詞語(yǔ)之間沒(méi)有分隔。 古代漢語(yǔ)中除了連綿詞和人名地名等,詞通常就是單個(gè)漢字,所以當(dāng)時(shí)沒(méi)有分詞書寫的必要。而現(xiàn)代漢語(yǔ)中雙字或多字詞居多,一個(gè)字不再等同于一個(gè)詞。
2.在中文里,“詞”和“詞組”邊界模糊
現(xiàn)代漢語(yǔ)的基本表達(dá)單元雖然為“詞”,且以雙字或者多字詞居多,但由于人們認(rèn)識(shí)水平的不同,對(duì)詞和短語(yǔ)的邊界很難去區(qū)分。
例如:“對(duì)隨地吐痰者給予處罰”,“隨地吐痰者”本身是一個(gè)詞還是一個(gè)短語(yǔ),不同的人會(huì)有不同的標(biāo)準(zhǔn),同樣的“海上”“酒廠”等等,即使是同一個(gè)人也可能做出不同判斷,如果漢語(yǔ)真的要分詞書寫,必然會(huì)出現(xiàn)混亂,難度很大。
中文分詞的方法其實(shí)不局限于中文應(yīng)用,也被應(yīng)用到英文處理,如手寫識(shí)別,單詞之間的空格就不很清楚,中文分詞方法可以幫助判別英文單詞的邊界。
作用
中文分詞是文本挖掘的基礎(chǔ),對(duì)于輸入的一段中文,成功的進(jìn)行中文分詞,可以達(dá)到電腦自動(dòng)識(shí)別語(yǔ)句含義的效果。
中文分詞技術(shù)屬于自然語(yǔ)言處理技術(shù)范疇,對(duì)于一句話,人可以通過(guò)自己的知識(shí)來(lái)明白哪些是詞,哪些不是詞,但如何讓計(jì)算機(jī)也能理解?其處理過(guò)程就是分詞算法。
影響
中文分詞對(duì)于搜索引擎來(lái)說(shuō),最重要的并不是找到所有結(jié)果,因?yàn)樵谏习賰|的網(wǎng)頁(yè)中找到所有結(jié)果沒(méi)有太多的意義,沒(méi)有人能看得完,最重要的是把最相關(guān)的結(jié)果排在最前面,這也稱為相關(guān)度排序。中文分詞的準(zhǔn)確與否,常常直接影響到對(duì)搜索結(jié)果的相關(guān)度排序。從定性分析來(lái)說(shuō),搜索引擎的分詞算法不同,詞庫(kù)的不同都會(huì)影響頁(yè)面的返回結(jié)果[1] ?。
算法分類
現(xiàn)有的分詞算法可分為三大類:基于字符串匹配的分詞方法、基于理解的分詞方法和基于統(tǒng)計(jì)的分詞方法。按照是否與詞性標(biāo)注過(guò)程相結(jié)合,又可以分為單純分詞方法和分詞與標(biāo)注相結(jié)合的一體化方法。
字符匹配
這種方法又叫做機(jī)械分詞方法,它是按照一定的策略將待分析的漢字串與一個(gè)“充分大的”機(jī)器詞典中的詞條進(jìn)行配,若在詞典中找到某個(gè)字符串,則匹配成功(識(shí)別出一個(gè)詞)。按照掃描方向的不同,串匹配分詞方法可以分為正向匹配和逆向匹配;按照不同長(zhǎng)度優(yōu)先匹配的情況,可以分為最大(最長(zhǎng))匹配和最小(最短)匹配;常用的幾種機(jī)械分詞方法如下:
1)正向最大匹配法(由左到右的方向);
2)逆向最大匹配法(由右到左的方向);
3)最少切分(使每一句中切出的詞數(shù)最小);
4)雙向最大匹配法(進(jìn)行由左到右、由右到左兩次掃描)
還可以將上述各種方法相互組合,例如,可以將正向最大匹配方法和逆向最大匹配方法結(jié)合起來(lái)構(gòu)成雙向匹配法。由于漢語(yǔ)單字成詞的特點(diǎn),正向最小匹配和逆向最小匹配一般很少使用。一般說(shuō)來(lái),逆向匹配的切分精度略高于正向匹配,遇到的歧義現(xiàn)象也較少。統(tǒng)計(jì)結(jié)果表明,單純使用正向最大匹配的錯(cuò)誤率為1/169,單純使用逆向最大匹配的錯(cuò)誤率為1/245。但這種精度還遠(yuǎn)遠(yuǎn)不能滿足實(shí)際的需要。實(shí)際使用的分詞系統(tǒng),都是把機(jī)械分詞作為一種初分手段,還需通過(guò)利用各種其它的語(yǔ)言信息來(lái)進(jìn)一步提高切分的準(zhǔn)確率。
一種方法是改進(jìn)掃描方式,稱為特征掃描或標(biāo)志切分,優(yōu)先在待分析字符串中識(shí)別和切分出一些帶有明顯特征的詞,以這些詞作為斷點(diǎn),可將原字符串分為較小的串再來(lái)進(jìn)機(jī)械分詞,從而減少匹配的錯(cuò)誤率。另一種方法是將分詞和詞類標(biāo)注結(jié)合起來(lái),利用豐富的詞類信息對(duì)分詞決策提供幫助,并且在標(biāo)注過(guò)程中又反過(guò)來(lái)對(duì)分詞結(jié)果進(jìn)行檢驗(yàn)、調(diào)整,從而極大地提高切分的準(zhǔn)確率。
對(duì)于機(jī)械分詞方法,可以建立一個(gè)一般的模型,在這方面有專業(yè)的學(xué)術(shù)論文,這里不做詳細(xì)論述。
理解法
這種分詞方法是通過(guò)讓計(jì)算機(jī)模擬人對(duì)句子的理解,達(dá)到識(shí)別詞的效果。其基本思想就是在分詞的同時(shí)進(jìn)行句法、語(yǔ)義分析,利用句法信息和語(yǔ)義信息來(lái)處理歧義現(xiàn)象。它通常包括三個(gè)部分:分詞子系統(tǒng)、句法語(yǔ)義子系統(tǒng)、總控部分。在總控部分的協(xié)調(diào)下,分詞子系統(tǒng)可以獲得有關(guān)詞、句子等的句法和語(yǔ)義信息來(lái)對(duì)分詞歧義進(jìn)行判斷,即它模擬了人對(duì)句子的理解過(guò)程。這種分詞方法需要使用大量的語(yǔ)言知識(shí)和信息。由于漢語(yǔ)語(yǔ)言知識(shí)的籠統(tǒng)、復(fù)雜性,難以將各種語(yǔ)言信息組織成機(jī)器可直接讀取的形式,因此目前基于理解的分詞系統(tǒng)還處在試驗(yàn)階段。
統(tǒng)計(jì)法
從形式上看,詞是穩(wěn)定的字的組合,因此在上下文中,相鄰的字同時(shí)出現(xiàn)的次數(shù)越多,就越有可能構(gòu)成一個(gè)詞。因此字與字相鄰共現(xiàn)的頻率或概率能夠較好的反映成詞的可信度。可以對(duì)語(yǔ)料中相鄰共現(xiàn)的各個(gè)字的組合的頻度進(jìn)行統(tǒng)計(jì),計(jì)算它們的互現(xiàn)信息。定義兩個(gè)字的互現(xiàn)信息,計(jì)算兩個(gè)漢字X、Y的相鄰共現(xiàn)概率。互現(xiàn)信息體現(xiàn)了漢字之間結(jié)合關(guān)系的緊密程度。當(dāng)緊密程度高于某一個(gè)閾值時(shí),便可認(rèn)為此字組可能構(gòu)成了一個(gè)詞。這種方法只需對(duì)語(yǔ)料中的字組頻度進(jìn)行統(tǒng)計(jì),不需要切分詞典,因而又叫做無(wú)詞典分詞法或統(tǒng)計(jì)取詞方法。但這種方法也有一定的局限性,會(huì)經(jīng)常抽出一些共現(xiàn)頻度高、但并不是詞的常用字組,例如“這一”、“之一”、“有的”、“我的”、“許多的”等,并且對(duì)常用詞的識(shí)別精度差,時(shí)空開(kāi)銷大。實(shí)際應(yīng)用的統(tǒng)計(jì)分詞系統(tǒng)都要使用一部基本的分詞詞典(常用詞詞典)進(jìn)行串匹配分詞,同時(shí)使用統(tǒng)計(jì)方法識(shí)別一些新的詞,即將串頻統(tǒng)計(jì)和串匹配結(jié)合起來(lái),既發(fā)揮匹配分詞切分速度快、效率高的特點(diǎn),又利用了無(wú)詞典分詞結(jié)合上下文識(shí)別生詞、自動(dòng)消除歧義的優(yōu)點(diǎn)。
另外一類是基于統(tǒng)計(jì)機(jī)器學(xué)習(xí)的方法。首先給出大量已經(jīng)分詞的文本,利用統(tǒng)計(jì)機(jī)器學(xué)習(xí)模型學(xué)習(xí)詞語(yǔ)切分的規(guī)律(稱為訓(xùn)練),從而實(shí)現(xiàn)對(duì)未知文本的切分。我們知道,漢語(yǔ)中各個(gè)字單獨(dú)作詞語(yǔ)的能力是不同的,此外有的字常常作為前綴出現(xiàn),有的字卻常常作為后綴(“者”“性”),結(jié)合兩個(gè)字相臨時(shí)是否成詞的信息,這樣就得到了許多與分詞有關(guān)的知識(shí)。這種方法就是充分利用漢語(yǔ)組詞的規(guī)律來(lái)分詞。這種方法的最大缺點(diǎn)是需要有大量預(yù)先分好詞的語(yǔ)料作支撐,而且訓(xùn)練過(guò)程中時(shí)空開(kāi)銷極大。
到底哪種分詞算法的準(zhǔn)確度更高,目前并無(wú)定論。對(duì)于任何一個(gè)成熟的分詞系統(tǒng)來(lái)說(shuō),不可能單獨(dú)依靠某一種算法來(lái)實(shí)現(xiàn),都需要綜合不同的算法。例如,海量科技的分詞算法就采用“復(fù)方分詞法”,所謂復(fù)方,就是像中西醫(yī)結(jié)合般綜合運(yùn)用機(jī)械方法和知識(shí)方法。對(duì)于成熟的中文分詞系統(tǒng),需要多種算法綜合處理問(wèn)題。
技術(shù)難點(diǎn)
有了成熟的分詞算法,是否就能容易的解決中文分詞的問(wèn)題呢?事實(shí)遠(yuǎn)非如此。中文是一種十分復(fù)雜的語(yǔ)言,讓計(jì)算機(jī)理解中文語(yǔ)言更是困難。在中文分詞過(guò)程中,有兩大難題一直沒(méi)有完全突破。
歧義識(shí)別
歧義是指同樣的一句話,可能有兩種或者更多的切分方法。主要的歧義有兩種:交集型歧義和組合型歧義,例如:表面的,因?yàn)椤氨砻妗焙汀懊娴摹倍际窃~,那么這個(gè)短語(yǔ)就可以分成“表面 的”和“表 面的”。這種稱為交集型歧義(交叉歧義)。像這種交集型歧義十分常見(jiàn),前面舉的“和服”的例子,其實(shí)就是因?yàn)榻患推缌x引起的錯(cuò)誤。“化妝和服裝”可以分成“化妝 和 服裝”或者“化妝 和服 裝”。由于沒(méi)有人的知識(shí)去理解,計(jì)算機(jī)很難知道到底哪個(gè)方案正確。
交集型歧義相對(duì)組合型歧義來(lái)說(shuō)是還算比較容易處理,組合型歧義就必須根據(jù)整個(gè)句子來(lái)判斷了。例如,在句子“這個(gè)門把手壞了”中,“把手”是個(gè)詞,但在句子“請(qǐng)把手拿開(kāi)”中,“把手”就不是一個(gè)詞;在句子“將軍任命了一名中將”中,“中將”是個(gè)詞,但在句子“產(chǎn)量三年中將增長(zhǎng)兩倍”中,“中將”就不再是詞。這些詞計(jì)算機(jī)又如何去識(shí)別?
如果交集型歧義和組合型歧義計(jì)算機(jī)都能解決的話,在歧義中還有一個(gè)難題,是真歧義。真歧義意思是給出一句話,由人去判斷也不知道哪個(gè)應(yīng)該是詞,哪個(gè)應(yīng)該不是詞。例如:“乒乓球拍賣完了”,可以切分成“乒乓 球拍 賣 完 了”、也可切分成“乒乓球 拍賣 完 了”,如果沒(méi)有上下文其他的句子,恐怕誰(shuí)也不知道“拍賣”在這里算不算一個(gè)詞。
新詞識(shí)別
命名實(shí)體(人名、地名)、新詞,專業(yè)術(shù)語(yǔ)稱為未登錄詞。也就是那些在分詞詞典中沒(méi)有收錄,但又確實(shí)能稱為詞的那些詞。最典型的是人名,人可以很容易理解。句子“王軍虎去廣州了”中,“王軍虎”是個(gè)詞,因?yàn)槭且粋€(gè)人的名字,但要是讓計(jì)算機(jī)去識(shí)別就困難了。如果把“王軍虎”做為一個(gè)詞收錄到字典中去,全世界有那么多名字,而且每時(shí)每刻都有新增的人名,收錄這些人名本身就是一項(xiàng)既不劃算又巨大的工程。即使這項(xiàng)工作可以完成,還是會(huì)存在問(wèn)題,例如:在句子“王軍虎頭虎腦的”中,“王軍虎”還能不能算詞?
除了人名以外,還有機(jī)構(gòu)名、地名、產(chǎn)品名、商標(biāo)名、簡(jiǎn)稱、省略語(yǔ)等都是很難處理的問(wèn)題,而且這些又正好是人們經(jīng)常使用的詞,因此對(duì)于搜索引擎來(lái)說(shuō),分詞系統(tǒng)中的新詞識(shí)別十分重要。新詞識(shí)別準(zhǔn)確率已經(jīng)成為評(píng)價(jià)一個(gè)分詞系統(tǒng)好壞的重要標(biāo)志之一。
應(yīng)用
在自然語(yǔ)言處理技術(shù)中,中文處理技術(shù)比西文處理技術(shù)要落后很大一段距離,許多西文的處理方法中文不能直接采用,就是因?yàn)橹形谋匦栌蟹衷~這道工序。中文分詞是其他中文信息處理的基礎(chǔ),搜索引擎只是中文分詞的一個(gè)應(yīng)用。其他的比如機(jī)器翻譯(MT)、語(yǔ)音合成、自動(dòng)分類、自動(dòng)摘要、自動(dòng)校對(duì)等等,都需要用到分詞。因?yàn)橹形男枰衷~,可能會(huì)影響一些研究,但同時(shí)也為一些企業(yè)帶來(lái)機(jī)會(huì),因?yàn)閲?guó)外的計(jì)算機(jī)處理技術(shù)要想進(jìn)入中國(guó)市場(chǎng),首先也是要解決中文分詞問(wèn)題。
分詞準(zhǔn)確性對(duì)搜索引擎來(lái)說(shuō)十分重要,但如果分詞速度太慢,即使準(zhǔn)確性再高,對(duì)于搜索引擎來(lái)說(shuō)也是不可用的,因?yàn)樗阉饕嫘枰幚頂?shù)以億計(jì)的網(wǎng)頁(yè),如果分詞耗用的時(shí)間過(guò)長(zhǎng),會(huì)嚴(yán)重影響搜索引擎內(nèi)容更新的速度。因此對(duì)于搜索引擎來(lái)說(shuō),分詞的準(zhǔn)確性和速度,二者都需要達(dá)到很高的要求。研究中文分詞的大多是科研院校,清華、北大、哈工大、中科院、北京語(yǔ)言學(xué)院、山西大學(xué)、東北大學(xué)、IBM研究院、微軟中國(guó)研究院等都有自己的研究隊(duì)伍,而真正專業(yè)研究中文分詞的商業(yè)公司除了海量科技以外,幾乎沒(méi)有了。科研院校研究的技術(shù),大部分不能很快產(chǎn)品化,而一個(gè)專業(yè)公司的力量畢竟有限,看來(lái)中文分詞技術(shù)要想更好的服務(wù)于更多的產(chǎn)品,還有很長(zhǎng)一段路。
常見(jiàn)項(xiàng)目
word分詞
word分詞是一個(gè)Java實(shí)現(xiàn)的分布式的中文分詞組件,提供了多種基于詞典的分詞算法,并利用ngram模型來(lái)消除歧義。能準(zhǔn)確識(shí)別英文、數(shù)字,以及日期、時(shí)間等數(shù)量詞,能識(shí)別人名、地名、組織機(jī)構(gòu)名等未登錄詞。能通過(guò)自定義配置文件來(lái)改變組件行為,能自定義用戶詞庫(kù)、自動(dòng)檢測(cè)詞庫(kù)變化、支持大規(guī)模分布式環(huán)境,能靈活指定多種分詞算法,能使用refine功能靈活控制分詞結(jié)果,還能使用詞性標(biāo)注、同義標(biāo)注、反義標(biāo)注、拼音標(biāo)注等功能。同時(shí)還無(wú)縫和Lucene、Solr、ElasticSearch、Luke集成。
智呈分詞
功能描述:
1.新詞自動(dòng)識(shí)別
對(duì)詞典中不存在的詞,可以自動(dòng)識(shí)別,對(duì)詞典的依賴較小;
2.詞性輸出
分詞結(jié)果中帶有豐富的詞性;
3.動(dòng)態(tài)詞性輸出
分詞結(jié)果中的詞性并非固定,會(huì)根據(jù)不同的語(yǔ)境,賦予不同的詞性;
4.特殊詞識(shí)別
比如化學(xué)、藥品等行業(yè)詞匯,地名、品牌、媒體名等;
5.智能歧義解決
根據(jù)內(nèi)部規(guī)則,智能解決常見(jiàn)分詞歧義問(wèn)題;
6.多種編碼識(shí)別
自動(dòng)識(shí)別各種單一編碼,并支持混合編碼;
7.數(shù)詞量詞優(yōu)化
自動(dòng)識(shí)別數(shù)量詞;
性能介紹:
處理器:AMD Athlon II x2 250 3GHZ
單線程大于833KB/s,多線程安全。
MFSOU中文分詞PHP擴(kuò)展
一個(gè)PHP函數(shù)實(shí)現(xiàn)中文分詞。使分詞更容易,使用如下圖:
SCWS調(diào)用示例
SCWS調(diào)用示例
SCWS
Hightman開(kāi)發(fā)的一套基于詞頻詞典的機(jī)械中文分詞引擎,它能將一整段的漢字基本正確的切分成詞。采用的是采集的詞頻詞典,并輔以一定的專有名稱,人名,地名,數(shù)字年代等規(guī)則識(shí)別來(lái)達(dá)到基本分詞,經(jīng)小范圍測(cè)試大概準(zhǔn)確率在 90% ~ 95% 之間,已能基本滿足一些小型搜索引擎、關(guān)鍵字提取等場(chǎng)合運(yùn)用。45Kb左右的文本切詞時(shí)間是0.026秒,大概是1.5MB文本/秒,支持PHP4和PHP 5。
FudanNLP
FudanNLP主要是為中文自然語(yǔ)言處理而開(kāi)發(fā)的工具包,也包含為實(shí)現(xiàn)這些任務(wù)的機(jī)器學(xué)習(xí)算法和數(shù)據(jù)集。本工具包及其包含數(shù)據(jù)集使用LGPL3.0許可證。開(kāi)發(fā)語(yǔ)言為Java。功能包括中文分詞等,不需要字典支持。
ICTCLAS
這是最早的中文開(kāi)源分詞項(xiàng)目之一,ICTCLAS在國(guó)內(nèi)973專家組組織的評(píng)測(cè)中活動(dòng)獲得了第一名,在第一屆國(guó)際中文處理研究機(jī)構(gòu)SigHan組織的評(píng)測(cè)中都獲得了多項(xiàng)第一名。ICTCLAS3.0分詞速度單機(jī)996KB/s,分詞精度98.45%,API不超過(guò)200KB,各種詞典數(shù)據(jù)壓縮后不到3M.ICTCLAS全部采用C/C++編寫,支持Linux、FreeBSD及Windows系列操作系統(tǒng),支持C/C++、C#、Delphi、Java等主流的開(kāi)發(fā)語(yǔ)言。
HTTPCWS
HTTPCWS 是一款基于HTTP協(xié)議的開(kāi)源中文分詞系統(tǒng),目前僅支持Linux系統(tǒng)。HTTPCWS 使用“ICTCLAS 3.0 2009共享版中文分詞算法”的API進(jìn)行分詞處理,得出分詞結(jié)果。HTTPCWS 將取代之前的 PHPCWS 中文分詞擴(kuò)展。
CC-CEDICT
一個(gè)中文詞典開(kāi)源項(xiàng)目,提供一份以漢語(yǔ)拼音為中文輔助的漢英辭典,截至2009年2月8日,已收錄82712個(gè)單詞。其詞典可以用于中文分詞使用,而且不存在版權(quán)問(wèn)題。Chrome中文版就是使用的這個(gè)詞典進(jìn)行中文分詞的。
IK
IKAnalyzer是一個(gè)開(kāi)源的,基于java語(yǔ)言開(kāi)發(fā)的輕量級(jí)的中文分詞工具包。從2006年12月推出1.0版開(kāi)始,IKAnalyzer已經(jīng)推出了3個(gè)大版本。最初,它是以開(kāi)源項(xiàng)目Luence為應(yīng)用主體的,結(jié)合詞典分詞和文法分析算法的中文分詞組件。新版本的IKAnalyzer3.0則發(fā)展為面向Java的公用分詞組件,獨(dú)立于Lucene項(xiàng)目,同時(shí)提供了對(duì)Lucene的默認(rèn)優(yōu)化實(shí)現(xiàn)。
Paoding
Paoding(庖丁解牛分詞)基于Java的開(kāi)源中文分詞組件,提供lucene和solr 接口,具有極 高效率和 高擴(kuò)展性。引入隱喻,采用完全的面向?qū)ο笤O(shè)計(jì),構(gòu)思先進(jìn)。
高效率:在PIII 1G內(nèi)存?zhèn)€人機(jī)器上,1秒可準(zhǔn)確分詞 100萬(wàn)漢字。
采用基于 不限制個(gè)數(shù)的詞典文件對(duì)文章進(jìn)行有效切分,使能夠?qū)?duì)詞匯分類定義。
能夠?qū)ξ粗脑~匯進(jìn)行合理解析。
僅支持Java語(yǔ)言。
MMSEG4J
MMSEG4J基于Java的開(kāi)源中文分詞組件,提供lucene和solr 接口:
1.mmseg4j 用 Chih-Hao Tsai 的 MMSeg 算法實(shí)現(xiàn)的中文分詞器,并實(shí)現(xiàn) lucene 的 analyzer 和 solr 的TokenizerFactory 以方便在Lucene和Solr中使用。
2.MMSeg 算法有兩種分詞方法:Simple和Complex,都是基于正向最大匹配。Complex 加了四個(gè)規(guī)則過(guò)慮。官方說(shuō):詞語(yǔ)的正確識(shí)別率達(dá)到了 98.41%。mmseg4j 已經(jīng)實(shí)現(xiàn)了這兩種分詞算法。
盤古分詞
盤古分詞是一個(gè)基于.net 平臺(tái)的開(kāi)源中文分詞組件,提供lucene(.net 版本) 和HubbleDotNet的接口
高效:Core Duo 1.8 GHz 下單線程 分詞速度為 390K 字符每秒
準(zhǔn)確:盤古分詞采用字典和統(tǒng)計(jì)結(jié)合的分詞算法,分詞準(zhǔn)確率較高。
功能:盤古分詞提供中文人名識(shí)別,簡(jiǎn)繁混合分詞,多元分詞,英文詞根化,強(qiáng)制一元分詞,詞頻優(yōu)先分詞,停用詞過(guò)濾,英文專名提取等一系列功能。
Jcseg
jcseg是使用Java開(kāi)發(fā)的一個(gè)中文分詞器,使用流行的mmseg算法實(shí)現(xiàn)。[4]?
1。mmseg四種過(guò)濾算法,分詞準(zhǔn)確率達(dá)到了98.4%以上。
2。支持自定義詞庫(kù)。在lexicon文件夾下,可以隨便添加/刪除/更改詞庫(kù)和詞庫(kù)內(nèi)容,并且對(duì)詞庫(kù)進(jìn)行了分類,詞庫(kù)整合了《現(xiàn)代漢語(yǔ)詞典》和cc-cedict辭典。
3。詞條拼音和同義詞支持,jcseg為所有詞條標(biāo)注了拼音,并且詞條可以添加同義詞集合,jcseg會(huì)自動(dòng)將拼音和同義詞加入到分詞結(jié)果中。
4。中文數(shù)字和分?jǐn)?shù)識(shí)別,例如:"四五十個(gè)人都來(lái)了,三十分之一。"中的"四五十"和"三十分之一",并且jcseg會(huì)自動(dòng)將其轉(zhuǎn)換為對(duì)應(yīng)的阿拉伯?dāng)?shù)字。
5。支持中英混合詞的識(shí)別。例如:B超,x射線。
6。支持基本單字單位的識(shí)別,例如2012年。
7。良好的英文支持,自動(dòng)識(shí)別電子郵件,網(wǎng)址,分?jǐn)?shù),小數(shù),百分?jǐn)?shù)……。
8。智能圓角半角轉(zhuǎn)換處理。
9。特殊字母識(shí)別:例如:Ⅰ,Ⅱ
10。特殊數(shù)字識(shí)別:例如:①,⑩
11。配對(duì)標(biāo)點(diǎn)內(nèi)容提取:例如:最好的Java書《java編程思想》,‘暢想杯黑客技術(shù)大賽’,被《,‘,“,『標(biāo)點(diǎn)標(biāo)記的內(nèi)容。
12。智能中文人名識(shí)別。中文人名識(shí)別正確率達(dá)94%以上。
jcseg佩帶了jcseg.properties配置文檔,使用文本編輯器就可以自主的編輯其選項(xiàng),配置適合不同應(yīng)用場(chǎng)合的分詞應(yīng)用。例如:最大匹配分詞數(shù),是否開(kāi)啟中文人名識(shí)別,是否載入詞條拼音,是否載入詞條同義詞……。
friso
friso是使用c語(yǔ)言開(kāi)發(fā)的一個(gè)中文分詞器,使用流行的mmseg算法實(shí)現(xiàn)。完全基于模塊化設(shè)計(jì)和實(shí)現(xiàn),可以很方便的植入到其他程序中,例如:MySQL,PHP等。并且提供了一個(gè)php中文分詞擴(kuò)展robbe。
1。只支持UTF-8編碼。【源碼無(wú)需修改就能在各種平臺(tái)下編譯使用,加載完20萬(wàn)的詞條,內(nèi)存占用穩(wěn)定為14M。】。
2。mmseg四種過(guò)濾算法,分詞準(zhǔn)確率達(dá)到了98.41%。
3。支持自定義詞庫(kù)。在dict文件夾下,可以隨便添加/刪除/更改詞庫(kù)和詞庫(kù)詞條,并且對(duì)詞庫(kù)進(jìn)行了分類。
4。詞庫(kù)使用了friso的Java版本jcseg的簡(jiǎn)化詞庫(kù)。
5。支持中英混合詞的識(shí)別。例如:c語(yǔ)言,IC卡。
7。很好的英文支持,電子郵件,網(wǎng)址,小數(shù),分?jǐn)?shù),百分?jǐn)?shù)。
8。支持阿拉伯?dāng)?shù)字基本單字單位的識(shí)別,例如2012年,5噸,120斤。
9。自動(dòng)英文圓角/半角,大寫/小寫轉(zhuǎn)換。
并且具有很高的分詞速度:簡(jiǎn)單模式:3.7M/秒,復(fù)雜模式:1.8M/秒。
========
中文分詞原理
一、為什么要進(jìn)行中文分詞?詞是最小的能夠獨(dú)立活動(dòng)的有意義的語(yǔ)言成分,英文單詞之間是以空格作為自然分界符的,而漢語(yǔ)是以字為基本的書寫單位,詞語(yǔ)之間沒(méi)有明顯的區(qū)分標(biāo)記,因此,中文詞語(yǔ)分析是中文信息處理的基礎(chǔ)與關(guān)鍵。
Lucene中對(duì)中文的處理是基于自動(dòng)切分的單字切分,或者二元切分。除此之外,還有最大切分(包括向前、向后、以及前后相結(jié)合)、最少切分、全切分等等。
二、中文分詞技術(shù)的分類
我們討論的分詞算法可分為三大類:基于字典、詞庫(kù)匹配的分詞方法;基于詞頻度統(tǒng)計(jì)的分詞方法和基于知識(shí)理解的分詞方法。
第一類方法應(yīng)用詞典匹配、漢語(yǔ)詞法或其它漢語(yǔ)語(yǔ)言知識(shí)進(jìn)行分詞,如:最大匹配法、最小分詞方法等。這類方法簡(jiǎn)單、分詞效率較高,但漢語(yǔ)語(yǔ)言現(xiàn)象復(fù)雜豐富,詞典的完備性、規(guī)則的一致性等問(wèn)題使其難以適應(yīng)開(kāi)放的大規(guī)模文本的分詞處理。第二類基于統(tǒng)計(jì)的分詞方法則基于字和詞的統(tǒng)計(jì)信息,如把相鄰字間的信息、詞頻及相應(yīng)的共現(xiàn)信息等應(yīng)用于分詞,由于這些信息是通過(guò)調(diào)查真實(shí)語(yǔ)料而取得的,因而基于統(tǒng)計(jì)的分詞方法具有較好的實(shí)用性。
下面簡(jiǎn)要介紹幾種常用方法:
1).逐詞遍歷法。
逐詞遍歷法將詞典中的所有詞按由長(zhǎng)到短的順序在文章中逐字搜索,直至文章結(jié)束。也就是說(shuō),不管文章有多短,詞典有多大,都要將詞典遍歷一遍。這種方法效率比較低,大一點(diǎn)的系統(tǒng)一般都不使用。
2).基于字典、詞庫(kù)匹配的分詞方法(機(jī)械分詞法)
這種方法按照一定策略將待分析的漢字串與一個(gè)“充分大的”機(jī)器詞典中的詞條進(jìn)行匹配,若在詞典中找到某個(gè)字符串,則匹配成功。識(shí)別出一個(gè)詞,根據(jù)掃描方向的不同分為正向匹配和逆向匹配。根據(jù)不同長(zhǎng)度優(yōu)先匹配的情況,分為最大(最長(zhǎng))匹配和最小(最短)匹配。根據(jù)與詞性標(biāo)注過(guò)程是否相結(jié)合,又可以分為單純分詞方法和分詞與標(biāo)注相結(jié)合的一體化方法。常用的方法如下:
(一)最大正向匹配法 (MaximumMatchingMethod)通常簡(jiǎn)稱為MM法。其基本思想為:假定分詞詞典中的最長(zhǎng)詞有i個(gè)漢字字符,則用被處理文檔的當(dāng)前字串中的前i個(gè)字作為匹配字段,查找字典。若字典中存在這樣的一個(gè)i字詞,則匹配成功,匹配字段被作為一個(gè)詞切分出來(lái)。如果詞典中找不到這樣的一個(gè)i字詞,則匹配失敗,將匹配字段中的最后一個(gè)字去掉,對(duì)剩下的字串重新進(jìn)行匹配處理…… ?如此進(jìn)行下去,直到匹配成功,即切分出一個(gè)詞或剩余字串的長(zhǎng)度為零為止。這樣就完成了一輪匹配,然后取下一個(gè)i字字串進(jìn)行匹配處理,直到文檔被掃描完為止。
其算法描述如下:
(1)初始化當(dāng)前位置計(jì)數(shù)器,置為0;
(2)從當(dāng)前計(jì)數(shù)器開(kāi)始,取前2i個(gè)字符作為匹配字段,直到文檔結(jié)束;
(3)如果匹配字段長(zhǎng)度不為0,則查找詞典中與之等長(zhǎng)的作匹配處理。
如果匹配成功,
則,
a)把這個(gè)匹配字段作為一個(gè)詞切分出來(lái),放入分詞統(tǒng)計(jì)表中;
b)把當(dāng)前位置計(jì)數(shù)器的值加上匹配字段的長(zhǎng)度;
c)跳轉(zhuǎn)到步驟2);
否則
a) 如果匹配字段的最后一個(gè)字符為漢字字符,
則
①把匹配字段的最后一個(gè)字去掉;
②匹配字段長(zhǎng)度減2;
否則
①把匹配字段的最后一個(gè)字節(jié)去掉;
②匹配字段長(zhǎng)度減1;
b)跳轉(zhuǎn)至步驟3);
否則
a)如果匹配字段的最后一個(gè)字符為漢字字符,
則 ? 當(dāng)前位置計(jì)數(shù)器的值加2;
否則當(dāng)前位置計(jì)數(shù)器的值加1;
b)跳轉(zhuǎn)到步驟2)。
(二)逆向最大匹配法 (ReverseMaximumMatcingMethod)通常簡(jiǎn)稱為RMM法。RMM法的基本原理與MM法相同 ,不同的是分詞切分的方向與MM法相反,而且使用的分詞辭典也不同。逆向最大匹配法從被處理文檔的末端開(kāi)始匹配掃描,每次取最末端的2i個(gè)字符(i字字串)作為匹配字段,若匹配失敗,則去掉匹配字段最前面的一個(gè)字,繼續(xù)匹配。相應(yīng)地,它使用的分詞詞典是逆序詞典,其中的每個(gè)詞條都將按逆序方式存放。在實(shí)際處理時(shí),先將文檔進(jìn)行倒排處理,生成逆序文檔。然后,根據(jù)逆序詞典,對(duì)逆序文檔用正向最大匹配法處理即可。
由于漢語(yǔ)中偏正結(jié)構(gòu)較多,若從后向前匹配,可以適當(dāng)提高精確度。所以,逆向最大匹配法比正向最大匹配法的誤差要小。統(tǒng)計(jì)結(jié)果表明 ,單純使用正向最大匹配的錯(cuò)誤率為 1/16 9,單純使用逆向最大匹配的錯(cuò)誤率為 1/245。例如切分字段“碩士研究生產(chǎn)”,正向最大匹配法的結(jié)果會(huì)是“碩士研究生 / 產(chǎn)”,而逆向最大匹配法利用逆向掃描,可得到正確的分詞結(jié)果“碩士 / 研究 / 生產(chǎn)”。
當(dāng)然,最大匹配算法是一種基于分詞詞典的機(jī)械分詞法,不能根據(jù)文檔上下文的語(yǔ)義特征來(lái)切分詞語(yǔ),對(duì)詞典的依賴性較大,所以在實(shí)際使用時(shí),難免會(huì)造成一些分詞錯(cuò)誤,為了提高系統(tǒng)分詞的準(zhǔn)確度,可以采用正向最大匹配法和逆向最大匹配法相結(jié)合的分詞方案(即雙向匹配法,見(jiàn)(四)。)
(三)最少切分法:使每一句中切出的詞數(shù)最小。
(四)雙向匹配法:將正向最大匹配法與逆向最大匹配法組合。先根據(jù)標(biāo)點(diǎn)對(duì)文檔進(jìn)行粗切分,把文檔分解成若干個(gè)句子,然后再對(duì)這些句子用正向最大匹配法和逆向最大匹配法進(jìn)行掃描切分。如果兩種分詞方法得到的匹配結(jié)果相同,則認(rèn)為分詞正確,否則,按最小集處理。
3). 全切分和基于詞的頻度統(tǒng)計(jì)的分詞方法
基于詞的頻度統(tǒng)計(jì)的分詞方法是一種全切分方法。在討論這個(gè)方法之前我們先要明白有關(guān)全切分的相關(guān)內(nèi)容。
全切分
全切分要求獲得輸入序列的所有可接受的切分形式,而部分切分只取得一種或幾種可接受的切分形式,由于部分切分忽略了可能的其他切分形式,所以建立在部分切分基礎(chǔ)上的分詞方法不管采取何種歧義糾正策略,都可能會(huì)遺漏正確的切分,造成分詞錯(cuò)誤或失敗。而建立在全切分基礎(chǔ)上的分詞方法,由于全切分取得了所有可能的切分形式,因而從根本上避免了可能切分形式的遺漏,克服了部分切分方法的缺陷。
全切分算法能取得所有可能的切分形式,它的句子覆蓋率和分詞覆蓋率均為100%,但全切分分詞并沒(méi)有在文本處理中廣泛地采用,原因有以下幾點(diǎn):
1)全切分算法只是能獲得正確分詞的前提,因?yàn)槿蟹植痪哂衅缌x檢測(cè)功能,最終分詞結(jié)果的正確性和完全性依賴于獨(dú)立的歧義處理方法,如果評(píng)測(cè)有誤,也會(huì)造成錯(cuò)誤的結(jié)果。
2)全切分的切分結(jié)果個(gè)數(shù)隨句子長(zhǎng)度的增長(zhǎng)呈指數(shù)增長(zhǎng),一方面將導(dǎo)致龐大的無(wú)用數(shù)據(jù)充斥于存儲(chǔ)數(shù)據(jù)庫(kù);另一方面當(dāng)句長(zhǎng)達(dá)到一定長(zhǎng)度后,由于切分形式過(guò)多,造成分詞效率嚴(yán)重下降。
基于詞的頻度統(tǒng)計(jì)的分詞方法:
這是一種全切分方法。它不依靠詞典,而是將文章中任意兩個(gè)字同時(shí)出現(xiàn)的頻率進(jìn)行統(tǒng)計(jì),次數(shù)越高的就可能是一個(gè)詞。它首先切分出與詞表匹配的所有可能的詞,運(yùn)用統(tǒng)計(jì)語(yǔ)言模型和決策算法決定最優(yōu)的切分結(jié)果。它的優(yōu)點(diǎn)在于可以發(fā)現(xiàn)所有的切分歧義并且容易將新詞提取出來(lái)。
4).基于知識(shí)理解的分詞方法。
該方法主要基于句法、語(yǔ)法分析,并結(jié)合語(yǔ)義分析,通過(guò)對(duì)上下文內(nèi)容所提供信息的分析對(duì)詞進(jìn)行定界,它通常包括三個(gè)部分:分詞子系統(tǒng)、句法語(yǔ)義子系統(tǒng)、總控部分。在總控部分的協(xié)調(diào)下,分詞子系統(tǒng)可以獲得有關(guān)詞、句子等的句法和語(yǔ)義信息來(lái)對(duì)分詞歧義進(jìn)行判斷。這類方法試圖讓機(jī)器具有人類的理解能力,需要使用大量的語(yǔ)言知識(shí)和信息。由于漢語(yǔ)語(yǔ)言知識(shí)的籠統(tǒng)、復(fù)雜性,難以將各種語(yǔ)言信息組織成機(jī)器可直接讀取的形式。因此目前基于知識(shí)的分詞系統(tǒng)還處在試驗(yàn)階段。
5).一種新的分詞方法
并行分詞方法:這種分詞方法借助于一個(gè)含有分詞詞庫(kù)的管道進(jìn)行 ,比較匹配過(guò)程是分步進(jìn)行的 ,每一步可以對(duì)進(jìn)入管道中的詞同時(shí)與詞庫(kù)中相應(yīng)的詞進(jìn)行比較 ,由于同時(shí)有多個(gè)詞進(jìn)行比較匹配 ,因而分詞速度可以大幅度提高。這種方法涉及到多級(jí)內(nèi)碼理論和管道的詞典數(shù)據(jù)結(jié)構(gòu)。(詳細(xì)算法可以參考吳勝遠(yuǎn)的《并行分詞方法的研究》。)
常用中文分詞包
1. 庖丁解牛分詞包,適用于與Lucene整合。http://www.oschina.net/p/paoding
? ? 庖丁中文分詞庫(kù)是一個(gè)使用Java開(kāi)發(fā)的,可結(jié)合到Lucene應(yīng)用中的,為互聯(lián)網(wǎng)、企業(yè)內(nèi)部網(wǎng)使用的中文搜索引擎分詞組件。
? ? Paoding填補(bǔ)了國(guó)內(nèi)中文分詞方面開(kāi)源組件的空白,致力于此并希翼成為互聯(lián)網(wǎng)網(wǎng)站首選的中文分詞開(kāi)源組件。 Paoding中文分詞追求分詞的高效率和用戶良好體驗(yàn)。
? ? Paoding's Knives 中文分詞具有極 高效率 和 高擴(kuò)展性 。引入隱喻,采用完全的面向?qū)ο笤O(shè)計(jì),構(gòu)思先進(jìn)。
? ? 高效率:在PIII 1G內(nèi)存?zhèn)€人機(jī)器上,1秒 可準(zhǔn)確分詞 100萬(wàn) 漢字。
? ? 采用基于 不限制個(gè)數(shù)的詞典文件對(duì)文章進(jìn)行有效切分,使能夠?qū)?duì)詞匯分類定義。
? ? 能夠?qū)ξ粗脑~匯進(jìn)行合理解析
2. LingPipe,開(kāi)源自然語(yǔ)言處理的Java開(kāi)源工具包。http:/alias-i.com/lingpipe/
? ? 功能非常強(qiáng)大,最重要的是文檔超級(jí)詳細(xì),每個(gè)模型甚至連參考論文都列出來(lái)了,不僅使用方便,也非常適合模型的學(xué)習(xí)。
? ? 主題分類(Top Classification)、命名實(shí)體識(shí)別(Named Entity Recognition)、詞性標(biāo)注(Part-of Speech Tagging)、句題檢測(cè)(Sentence Detection)、查詢拼寫檢查(Query Spell Checking)、興趣短語(yǔ)檢測(cè)(Interseting Phrase Detection)、聚類(Clustering)、字符語(yǔ)言建模(Character Language Modeling)、醫(yī)學(xué)文獻(xiàn)下載/解析/索引(MEDLINE Download, Parsing and Indexing)、數(shù)據(jù)庫(kù)文本挖掘(Database Text Mining)、中文分詞(Chinese Word Segmentation)、情感分析(Sentiment Analysis)、語(yǔ)言辨別(Language Identification)等
3. JE分詞包
4. LibMMSeg http://www.oschina.net/p/libmmseg
? ? 采用C++開(kāi)發(fā),同時(shí)支持Linux平臺(tái)和Windows平臺(tái),切分速度大約在300K/s(PM-1.2G),截至當(dāng)前版本(0.7.1)。
? ? LibMMSeg沒(méi)有為速度仔細(xì)優(yōu)化過(guò),進(jìn)一步的提升切分速度應(yīng)仍有空間。
5. IKAnalyzer http://www.oschina.net/p/ikanalyzer
? ? IKAnalyzer基于lucene2.0版本API開(kāi)發(fā),實(shí)現(xiàn)了以詞典分詞為基礎(chǔ)的正反向全切分算法,是LuceneAnalyzer接口的實(shí)現(xiàn)。
? ? 該算法適合與互聯(lián)網(wǎng)用戶的搜索習(xí)慣和企業(yè)知識(shí)庫(kù)檢索,用戶可以用句子中涵蓋的中文詞匯搜索,如用"人民"搜索含"人民幣"的文章,這是大部分用戶的搜索思維;
? ? 不適合用于知識(shí)挖掘和網(wǎng)絡(luò)爬蟲(chóng)技術(shù),全切分法容易造成知識(shí)歧義,因?yàn)樵谡Z(yǔ)義學(xué)上"人民"和"人民幣"是完全搭不上關(guān)系的。
6. PHPCWS http://www.oschina.net/p/phpcws
? ? PHPCWS 是一款開(kāi)源的PHP中文分詞擴(kuò)展,目前僅支持Linux/Unix系統(tǒng)。
? ? PHPCWS 先使用“ICTCLAS 3.0 共享版中文分詞算法”的API進(jìn)行初次分詞處理,再使用自行編寫的“逆向最大匹配算法”對(duì)分詞和進(jìn)行詞語(yǔ)合并處理,并增加標(biāo)點(diǎn)符號(hào)過(guò)濾功能,得出分詞結(jié)果。
? ? ICTCLAS(Institute of Computing Technology, Chinese Lexical Analysis System)是中國(guó)科學(xué)院計(jì)算技術(shù)研究所在多年研究工作積累的基礎(chǔ)上,基于多層隱馬模型研制出的漢語(yǔ)詞法分析系統(tǒng),主要功能包括中文分詞;詞性標(biāo)注;命名實(shí)體識(shí)別;新詞識(shí)別;同時(shí)支持用戶詞典。ICTCLAS經(jīng)過(guò)五年精心打造,內(nèi)核升級(jí)6次,目前已經(jīng)升級(jí)到了ICTCLAS3.0,分詞精度 98.45%,各種詞典數(shù)據(jù)壓縮后不到3M。ICTCLAS在國(guó)內(nèi)973專家組組織的評(píng)測(cè)中活動(dòng)獲得了第一名,在第一屆國(guó)際中文處理研究機(jī)構(gòu)SigHan 組織的評(píng)測(cè)中都獲得了多項(xiàng)第一名,是當(dāng)前世界上最好的漢語(yǔ)詞法分析器。
? ? ICTCLAS 3.0 商業(yè)版是收費(fèi)的,而免費(fèi)提供的 ICTCLAS 3.0 共享版不開(kāi)源,詞庫(kù)是根據(jù)人民日?qǐng)?bào)一個(gè)月的語(yǔ)料得出的,很多詞語(yǔ)不存在。所以本人對(duì)ICTCLAS分詞后的結(jié)果,再采用逆向最大匹配算法,根據(jù)自己補(bǔ)充的一個(gè)9萬(wàn)條詞語(yǔ)的自定義詞庫(kù)(與ICTCLAS詞庫(kù)中的詞語(yǔ)不重復(fù)),對(duì)ICTCLAS分詞結(jié)果進(jìn)行合并處理,輸出最終分詞結(jié)果。
? ? 由于 ICTCLAS 3.0 共享版只支持GBK編碼,因此,如果是UTF-8編碼的字符串,可以先用PHP的iconv函數(shù)轉(zhuǎn)換成GBK編碼,再用phpcws_split函數(shù)進(jìn)行分詞處理,最后轉(zhuǎn)換回UTF-8編碼。
7、KTDictSeg 一個(gè)C#.net做的簡(jiǎn)單快速準(zhǔn)確的開(kāi)源中文分詞組件(這個(gè)分詞算法效果也不錯(cuò))
http://www.cnblogs.com/eaglet/archive/2007/05/24/758833.html
代碼下載:http://download.csdn.net/source/521857
========
中文分詞和TF-IDF
?中文分詞(Chinese Word Segmentation)指的是將一個(gè)漢字序列切分成一個(gè)一個(gè)單獨(dú)的詞。中文分詞是文本挖掘的基礎(chǔ),對(duì)于輸入的一段中文,成功的進(jìn)行中文分詞,可以達(dá)到電腦自動(dòng)識(shí)別語(yǔ)句含義的效果。
TF-IDF(term frequency–inverse document frequency)是一種用于信息搜索和信息挖掘的常用加權(quán)技術(shù)。在搜索、文獻(xiàn)分類和其他相關(guān)領(lǐng)域有廣泛的應(yīng)用。
TF-IDF的主要思想是,如果某個(gè)詞或短語(yǔ)在一篇文章中出現(xiàn)的頻率TF高,并且在其他文章中很少出現(xiàn),則認(rèn)為此詞或者短語(yǔ)具有很好的類別區(qū)分能力,適合用來(lái)分類。TF詞頻(Term Frequency)指的是某一個(gè)給定的詞語(yǔ)在該文件中出現(xiàn)的次數(shù)。IDF反文檔頻率(Inverse Document Frequency)的主要思想是:如果包含詞條的文檔越少,IDF越大,則說(shuō)明詞條具有很好的類別區(qū)分能力。
使用TF*IDF可以計(jì)算某個(gè)關(guān)鍵字在某篇文章里面的重要性,因而識(shí)別這篇文章的主要含義,實(shí)現(xiàn)計(jì)算機(jī)讀懂文章的功能。
常見(jiàn)中文分詞開(kāi)源項(xiàng)目:
SCWS:
Hightman開(kāi)發(fā)的一套基于詞頻詞典的機(jī)械中文分詞引擎,它能將一整段的漢字基本正確的切分成詞。采用的是采集的詞頻詞典,并輔以一定的專有名稱,人名,地名,數(shù)字年代等規(guī)則識(shí)別來(lái)達(dá)到基本分詞,經(jīng)小范圍測(cè)試大概準(zhǔn)確率在 90% ~ 95% 之間,已能基本滿足一些小型搜索引擎、關(guān)鍵字提取等場(chǎng)合運(yùn)用。45Kb左右的文本切詞時(shí)間是0.026秒,大概是1.5MB文本/秒,支持PHP4和PHP 5。
ICTCLAS:
這可是最早的中文開(kāi)源分詞項(xiàng)目之一,ICTCLAS在國(guó)內(nèi)973專家組組織的評(píng)測(cè)中活動(dòng)獲得了第一名,在第一屆國(guó)際中文處理研究機(jī)構(gòu)SigHan組織的評(píng)測(cè)中都獲得了多項(xiàng)第一名。ICTCLAS3.0分詞速度單機(jī)996KB/s,分詞精度98.45%,API不超過(guò)200KB,各種詞典數(shù)據(jù)壓縮后不到3M.ICTCLAS全部采用C/C++編寫,支持Linux、FreeBSD及Windows系列操作系統(tǒng),支持C/C++、C#、Delphi、Java等主流的開(kāi)發(fā)語(yǔ)言。
HTTPCWS:
HTTPCWS 是一款基于HTTP協(xié)議的開(kāi)源中文分詞系統(tǒng),目前僅支持Linux系統(tǒng)。HTTPCWS 使用“ICTCLAS 3.0 2009共享版中文分詞算法”的API進(jìn)行分詞處理,得出分詞結(jié)果。HTTPCWS 將取代之前的 PHPCWS 中文分詞擴(kuò)展。
庖丁解牛分詞:
Java 提供lucence 接口,僅支持Java語(yǔ)言。
CC-CEDICT:
一個(gè)中文詞典開(kāi)源項(xiàng)目,提供一份以漢語(yǔ)拼音為中文輔助的漢英辭典,截至2009年2月8日,已收錄82712個(gè)單詞。其詞典可以用于中文分詞使用,而且不存在版權(quán)問(wèn)題。Chrome中文版就是使用的這個(gè)詞典進(jìn)行中文分詞的。
基于VB/ASP的中文分詞
上面的開(kāi)源項(xiàng)目沒(méi)有給予VB和ASP的,這里提供一個(gè)簡(jiǎn)單的VB/ASP類,加上詞典之后就可以進(jìn)行分詞了,注意這個(gè)類只供演示,其分詞速度極慢不適合實(shí)際應(yīng)用。
類名為:WordSplit
Private rootTable As String
Private Function GetCount(ByVal s As String) As Long
? ? GetCount = InStr(1, rootTable, s)
End Function
Public Function WordCount(ByVal strString As String, ByVal strGetWord As String) As Long
? ? Dim k
? ? k = Split(strString, strGetWord)
? ? WordCount = UBound(k)
End Function
' 分析輸入的字符串,將其切割成一個(gè)個(gè)的詞語(yǔ)。
' <param name="s">待切割的字符串</param>
' <returns>所切割得到的中文詞語(yǔ)數(shù)組</returns>
Public Function ParseChinese(ByVal s As String, ByVal separator As String) As String
? ? Dim lngLength As Long
? ? Dim strTemp As String
? ? Dim ArrayList As String
? ? Dim i, j
? ? ArrayList = ""
? ? lngLength = Len(s)
? ? i = 1
? ? While i < lngLength
? ? ? ? strTemp = Mid(s, i, 1)
? ? ? ? If GetCount(strTemp) > 1 Then
? ? ? ? ? ? j = 2
? ? ? ? ? ? While i + j < lngLength + 1 And GetCount(Mid(s, i, j)) > 0
? ? ? ? ? ? ? ? j = j + 1
? ? ? ? ? ? Wend
? ? ? ? ? ? strTemp = Mid(s, i, j - 1)
? ? ? ? ? ? i = i + j - 2
? ? ? ? End If
? ? ? ? i = i + 1
? ? ? ? 'WordAdd (temp)
? ? ? ? ArrayList = ArrayList + strTemp + separator
? ? Wend
? ? ParseChinese = ArrayList
End Function
Private Sub Class_Initialize()
? ? Dim fso, templetfile, txtfile
? ? templetfile = App.Path + "\ChineseDictionary.txt"
? ? Set fso = CreateObject("Scripting.FileSystemObject")
? ? Set txtfile = fso.OpenTextFile(templetfile, 1)
? ? rootTable = txtfile.ReadAll
? ? txtfile.Close
End Sub
調(diào)用示例:
? ? strInput = "中文分詞指的是將一個(gè)漢字序列切分成一個(gè)一個(gè)單獨(dú)的詞。中文分詞是文本挖掘的基礎(chǔ),對(duì)于輸入的一段中文,成功的進(jìn)行中文分詞,可以達(dá)到電腦自動(dòng)識(shí)別語(yǔ)句含義的效果。"
? ? Dim strWordSplit As New WordSplit
? ? strSubject = strWordSplit.ParseChinese(strInput, "|")
? ? arrSubject = Split(strSubject, "|")
========
開(kāi)源 Java 中文分詞器 Ansj
Ansj 是一個(gè)開(kāi)源的 Java 中文分詞工具,基于中科院的 ictclas 中文分詞算法,比其他常用的開(kāi)源分詞工具(如mmseg4j)的分詞準(zhǔn)確率更高。?
在線演示:http://ansj.sdapp.cn/demo/seg.jsp?
官網(wǎng)地址:http://www.ansj.org/?
Github地址:https://github.com/ansjsun/ansj_seg?
Ansj中文分詞是一款純Java的、主要應(yīng)用于自然語(yǔ)言處理的、高精度的中文分詞工具,目標(biāo)是“準(zhǔn)確、高效、自由地進(jìn)行中文分詞”,可用于人名識(shí)別、地名識(shí)別、組織機(jī)構(gòu)名識(shí)別、多級(jí)詞性標(biāo)注、關(guān)鍵詞提取、指紋提取等領(lǐng)域,支持行業(yè)詞典、用戶自定義詞典。?
1. ?中文歧義的識(shí)別?
比較出名的一句話“結(jié)婚的和尚未結(jié)婚的”,如果使用正向最大匹配,容易分成“結(jié)婚/的/和尚/未/結(jié)婚的”,于是有的學(xué)者試圖倒過(guò)來(lái)識(shí)別,逆向匹配會(huì)大于正向。但是碰到這句“結(jié)合成分子時(shí)”,采用逆向最大匹配,則會(huì)分為“結(jié)合/成分/子時(shí)”,更有甚者像“咬了獵人的狗”這種語(yǔ)意不明的詞語(yǔ),就更不容易正確分詞了。這是中文分詞的軟肋。下面是些典型的歧義句:?
交叉歧義(多種切分交織在一起):內(nèi)塔內(nèi)亞胡說(shuō)的/確實(shí)/在理
組合歧義(不同情況下切分不同):這個(gè)人/手上有痣、我們公司人手
真歧義(幾種切分都可以):乒乓球拍/賣/完了、乒乓球/拍賣/完了
2. ?實(shí)體名識(shí)別?
這個(gè)是中文分詞遇到的最大的難點(diǎn),也是最最緊迫的。實(shí)體名識(shí)別包括人名識(shí)別、地名識(shí)別、機(jī)構(gòu)名識(shí)別,還包括有監(jiān)督識(shí)別和無(wú)監(jiān)督識(shí)別。有監(jiān)督的還好,無(wú)監(jiān)督基本是無(wú)解的,比如“王大力發(fā)球”是“王大力”還是“大力發(fā)球”,一般人都難以識(shí)別。?
3. ?新詞熱詞發(fā)現(xiàn)?
目前常用的新詞發(fā)現(xiàn)還是一個(gè)比較有研究性的課題,雖然有些論文在準(zhǔn)確率很高,但是大多是封閉測(cè)試,這意味著結(jié)果很難應(yīng)用到實(shí)際工程中。目前Ansj采用的新詞發(fā)現(xiàn)方式比較簡(jiǎn)單,采用了高頻詞的匹配方式,不使用規(guī)則,用統(tǒng)計(jì)重復(fù)串識(shí)別新詞,根據(jù)詞性去掉干擾詞,雖然有一定的效果,但還是差強(qiáng)人意。?
4. ?顆粒度問(wèn)題?
這個(gè)就是一個(gè)規(guī)則探討的問(wèn)題了,比如“北京大學(xué)”是“北京”+“大學(xué)”還是“北京大學(xué)”,人各有志,就連同一個(gè)人不同時(shí)間的標(biāo)注也有可能是有區(qū)別的,雖然這個(gè)問(wèn)題嚴(yán)格上來(lái)說(shuō)不屬于技術(shù)問(wèn)題,但是對(duì)分詞結(jié)果的評(píng)測(cè)卻有著很大的關(guān)系,Ansj采用“能識(shí)別就識(shí)別”的策略方針,所以在真正R值的時(shí)候偏低,總之一句話,適合學(xué)術(shù)的不一定適合工業(yè),反之亦然。
簡(jiǎn)單介紹一下Ansj分詞用到的算法,其分詞原理是什么? Top
Ansj,可以說(shuō)是一個(gè)ictclas的Java版本,基本原理一致,只不過(guò)在分詞優(yōu)化算法上做了一些改進(jìn)。?
該算法實(shí)現(xiàn)分詞有以下幾個(gè)步驟:?
全切分,原子切分;
N最短路徑的粗切分,根據(jù)隱馬爾科夫模型和viterbi算法,達(dá)到最優(yōu)路徑的規(guī)劃;
人名識(shí)別;
系統(tǒng)詞典補(bǔ)充;
用戶自定義詞典的補(bǔ)充;
詞性標(biāo)注(可選)
Ansj分詞的準(zhǔn)確率大概是多少?
這是我采用人民日?qǐng)?bào)1998年1月語(yǔ)料庫(kù)的一個(gè)測(cè)試結(jié)果,首先要說(shuō)明的是這份人工標(biāo)注的語(yǔ)料庫(kù)本身就有錯(cuò)誤。?
P(準(zhǔn)確率):0.984887218571267
R(召回率):0.9626488103178712
F(綜合指標(biāo)F值):0.9736410471396494
在歧義、未登錄詞問(wèn)題上,Ansj表現(xiàn)怎樣?
歧異方面的處理方式自我感覺(jué)還可以,基于“最佳實(shí)踐規(guī)則+統(tǒng)計(jì)”的方式,雖然還有一部分歧異無(wú)法識(shí)別,但是已經(jīng)完全能滿足工程應(yīng)用了。?
至于未登錄詞的識(shí)別,目前重點(diǎn)做了中文人名的識(shí)別,效果還算滿意,識(shí)別方式用的“字體+前后監(jiān)督”的方式,也算是目前我所知道的效果最好的一種識(shí)別方式了。
Ansj的性能如何?
在我的測(cè)試中,Ansj的效率已經(jīng)遠(yuǎn)超ictclas的其他開(kāi)源實(shí)現(xiàn)版本。?
核心詞典利用雙數(shù)組規(guī)劃,每秒鐘能達(dá)到千萬(wàn)級(jí)別的粗分。在我的MacBookAir上面,分詞速度大約在300w/字/秒,在酷睿i5+4G內(nèi)存組裝機(jī)器上,更是達(dá)到了400w+/字/秒的速度。
如何添加自定義詞典?
Ansj已經(jīng)實(shí)現(xiàn)了用戶自定義詞典的動(dòng)態(tài)添加刪除,當(dāng)然,也支持從文件加載詞典。?
從硬盤加載用戶自定義詞典的方法:?
用戶自定義詞典默認(rèn)路徑:項(xiàng)目目錄/library/userLibrary/userLibrary.dic?
格式為:[自定義詞] ?[詞性] ?[詞頻],如:csdn創(chuàng)新院 ?userDefine ?1000,中間用TAB鍵隔開(kāi)?
原分詞結(jié)果:[csdn, 創(chuàng)新, 院, 是, 一個(gè), 好, 公司]?
增加詞典后:[csdn創(chuàng)新院, 是, 一個(gè), 好, 公司]?
詳細(xì)內(nèi)容見(jiàn):用戶自定義詞典的添加?
用戶自定義詞典的動(dòng)態(tài)添加刪除方法見(jiàn):用戶自定義詞典的動(dòng)態(tài)添加刪除Demo
你
========
java中文分詞
最近由于工作原因,接觸到了JAVA的中文分詞, 現(xiàn)在來(lái)講講具體操作.
java的分詞器都是基于 lucene 核心的.
我選擇的是
ikanalyzer2.0.2的最新版本
具體調(diào)用過(guò)程如下:
[java]
import java.io.Reader; ??
import java.io.StringReader; ??
import org.apache.lucene.analysis.Analyzer; ??
import org.apache.lucene.analysis.StopFilter; ??
import org.apache.lucene.analysis.Token; ??
import org.apache.lucene.analysis.TokenFilter; ??
import org.apache.lucene.analysis.TokenStream; ??
import org.apache.lucene.analysis.cjk.CJKAnalyzer; ??
import org.apache.lucene.analysis.cn.ChineseAnalyzer; ??
import org.apache.lucene.analysis.standard.StandardAnalyzer; ??
import org.mira.lucene.analysis.MIK_CAnalyzer; ?
? ??
public class JeAnalyzer ??
{ ??
? ? //private static String testString1 = "/u4E2D/u56FD/u4EBA/u52A0/u6CB9"; ??
? ? private static String testString1 = "中國(guó)人加油"; ??
? ? public static void testStandard(String testString) ??
? ? { ?
? ? ? ? try ?
? ? ? ? { ?
? ? ? ? ? ? Analyzer analyzer = new StandardAnalyzer(); ??
? ? ? ? ? ? Reader r = new StringReader(testString); ??
? ? ? ? ? ? StopFilter sf = (StopFilter) analyzer.tokenStream("", r); ??
? ? ? ? ? ? System.err.println("=====standard analyzer===="); ??
? ? ? ? ? ? Token t; ??
? ? ? ? ? ? while ((t = sf.next()) != null) ??
? ? ? ? ? ? { ??
? ? ? ? ? ? ? ? System.out.println(t.termText()); ??
? ? ? ? ? ? } ??
? ? ? ? } ?
? ? ? ? catch(Exception e) ?
? ? ? ? { ?
? ? ? ? ? ? e.printStackTrace(); ?
? ? ? ? } ?
? ? } ?
? ? public static void testCJK(String testString) ??
? ? { ??
? ? ? ? try ?
? ? ? ? { ?
? ? ? ? ? ? Analyzer analyzer = new CJKAnalyzer(); ??
? ? ? ? ? ? Reader r = new StringReader(testString); ??
? ? ? ? ? ? StopFilter sf = (StopFilter) analyzer.tokenStream("", r); ??
? ? ? ? ? ? System.err.println("=====cjk analyzer===="); ??
? ? ? ? ? ? Token t; ??
? ? ? ? ? ? while ((t = sf.next()) != null) ??
? ? ? ? ? ? { ??
? ? ? ? ? ? ? ? System.out.println(t.termText()); ??
? ? ? ? ? ? } ??
? ? ? ? } ?
? ? ? ? catch(Exception e) ?
? ? ? ? { ?
? ? ? ? ? ? e.printStackTrace(); ?
? ? ? ? } ?
? ? } ??
? ? public static void testChiniese(String testString) ??
? ? { ??
? ? ? ? try ?
? ? ? ? { ?
? ? ? ? ? ? Analyzer analyzer = new ChineseAnalyzer(); ??
? ? ? ? ? ? Reader r = new StringReader(testString); ??
? ? ? ? ? ? TokenFilter tf = (TokenFilter) analyzer.tokenStream("", r); ??
? ? ? ? ? ? System.err.println("=====chinese analyzer===="); ??
? ? ? ? ? ? Token t; ??
? ? ? ? ? ? while ((t = tf.next()) != null) ??
? ? ? ? ? ? { ??
? ? ? ? ? ? ? ? System.out.println(t.termText()); ??
? ? ? ? ? ? } ??
? ? ? ? } ?
? ? ? ? catch(Exception e) ?
? ? ? ? { ?
? ? ? ? ? ? e.printStackTrace(); ?
? ? ? ? } ?
? ? } ??
??
? ? public static String transJe(String testString,String c1,String c2) ??
? ? { ?
? ? ? ? String result = ""; ?
? ? ? ? try ??
? ? ? ? { ?
? ? ? ? ? ? Analyzer analyzer = new MIK_CAnalyzer(); ??
? ? ? ? ? ? Reader r = new StringReader(testString); ??
? ? ? ? ? ? TokenStream ts = (TokenStream)analyzer.tokenStream("", r); ??
? ? ? ? ? ? //System.out.println("=====je analyzer===="); ??
? ? ? ? ? ? Token t; ?
? ? ? ? ? ? while ((t = ts.next()) != null) ??
? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? result += t.termText()+","; ?
? ? ? ? ? ? } ?
? ? ? ? } ?
? ? ? ? catch(Exception e) ?
? ? ? ? { ?
? ? ? ? ? ? e.printStackTrace(); ?
? ? ? ? } ?
? ? ? ? return result; ?
? ? } ??
? ? public static void main(String[] args) ??
? ? { ??
? ? ? ? try ?
? ? ? ? { ?
? ? ? ? ? ? //String testString = testString1; ?
? ? ? ? ? ? String testString = testString1; ??
? ? ? ? ? ? System.out.println(testString); ??
? ? ? ? ? ? ??
? ? ? ? ? ? //testStandard(testString); ??
? ? ? ? ? ? //testCJK(testString); ??
? ? ? ? ? ? //testPaoding(testString); ??
? ? ? ? ? ? ??
? ? ? ? ? ? //testChiniese(testString); ?
? ? ? ? ? ? //testString = new TestT().convert(testString); ?
? ? ? ? ? ? //testString = "/u636E/u8DEF/u900F/u793E/u62A5/u9053/uff0C/u5370/u5EA6/u5C3C/u897F/u4E9A/u793E/u4f1A/u4E8B/u52A1/u90E8/u4E00/u5B98/u5458/u661F/u671F/u4E8C"; ?
? ? ? ? ? ? String sResult[] = transJe(testString,"gb2312","utf-8").split(","); ??
? ? ? ? ? ? for(int i = 0 ; i< sResult.length ; i++) ?
? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? System.out.println(sResult[i]); ?
? ? ? ? ? ? } ?
? ? ? ? } ?
? ? ? ? catch(Exception e) ?
? ? ? ? { ?
? ? ? ? ? ? e.printStackTrace(); ?
? ? ? ? } ?
? ? } ?
??
} ??
?
需要 的JAR如下:
lucene-analyzers-2.4.1.jar
lucene-core-2.4.1.jar
當(dāng)然少不了
IKAnalyzer2.0.2OBF.jar
在UNIX下使用的話,注意對(duì)中文的編碼問(wèn)題.
========
使用IK Analyzer實(shí)現(xiàn)中文分詞(JAVA)
IK Analyzer是基于lucene實(shí)現(xiàn)的分詞開(kāi)源框架;
下載路徑:http://code.google.com/p/ik-analyzer/downloads/list
需要在項(xiàng)目中引入:IKAnalyzer.cfg.xml 、IKAnalyzer2012.jar 、lucene-core-3.6.0.jar 、stopword.dic
IK Analyzer 示例代碼如下:
[java]
package com.haha.test; ?
??
import java.io.IOException; ?
import java.io.StringReader; ?
import org.apache.lucene.analysis.Analyzer; ?
import org.apache.lucene.analysis.TokenStream; ?
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; ?
import org.wltea.analyzer.lucene.IKAnalyzer; ?
??
public class Test2 { ?
? ? public static void main(String[] args) throws IOException { ?
? ? ? ? String text="基于java語(yǔ)言開(kāi)發(fā)的輕量級(jí)的中文分詞工具包"; ?
? ? ? ? //創(chuàng)建分詞對(duì)象 ?
? ? ? ? Analyzer anal=new IKAnalyzer(true); ? ? ??
? ? ? ? StringReader reader=new StringReader(text); ?
? ? ? ? //分詞 ?
? ? ? ? TokenStream ts=anal.tokenStream("", reader); ?
? ? ? ? CharTermAttribute term=ts.getAttribute(CharTermAttribute.class); ?
? ? ? ? //遍歷分詞數(shù)據(jù) ?
? ? ? ? while(ts.incrementToken()){ ?
? ? ? ? ? ? System.out.print(term.toString()+"|"); ?
? ? ? ? } ?
? ? ? ? reader.close(); ?
? ? ? ? System.out.println(); ?
? ? } ?
??
} ?
?
lucene 示例代碼如下:
[java]
package com.haha.test; ?
??
import java.io.IOException; ?
import java.io.StringReader; ?
??
import org.wltea.analyzer.core.IKSegmenter; ?
import org.wltea.analyzer.core.Lexeme; ?
??
public class Test3 { ?
? ? ??
? ? public static void main(String[] args) throws IOException { ?
? ? ? ? String text="基于java語(yǔ)言開(kāi)發(fā)的輕量級(jí)的中文分詞工具包"; ?
? ? ? ? StringReader sr=new StringReader(text); ?
? ? ? ? IKSegmenter ik=new IKSegmenter(sr, true); ?
? ? ? ? Lexeme lex=null; ?
? ? ? ? while((lex=ik.next())!=null){ ?
? ? ? ? ? ? System.out.print(lex.getLexemeText()+"|"); ?
? ? ? ? } ?
? ? } ?
??
} ?
========
總結(jié)
- 上一篇: 图解VC++绘制数学曲线
- 下一篇: VC++ 绘制简单电子元件