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