前一段時間用lucene做一個搜索程序,找了好長時間的中文分詞程序,都沒找到合適的,最后自己弄了一個.現(xiàn)在共享出來.希望對大家有用.
分詞算法: 基于詞庫的正向最大匹配算法.
分詞詞庫用的是網(wǎng)上一個叫 segmenter 的分詞程序使用的詞庫.
地址:www.mandarintools.com/segmenter.html
這個segmenter分詞程序是把文件按行讀取出來,然后把一行假設(shè)為一個詞,從庫中匹配,如果匹配不成功,則去掉一個字,再繼續(xù)匹配.這樣的分詞程序,其一,不便在lucene中使用,因為lucene的analyzer是通過Tokenizer分詞的,而Tokenizer中一般是對字符流進(jìn)行處理,每次next返回一個Token,并不是一次性把內(nèi)容讀取進(jìn)來,處理后再返回結(jié)果.其二,按行讀取會有個缺點,就是如果文本中恰好把一個詞用換行符隔開了,這樣這個詞也就被切開了,沒有被當(dāng)作一個詞處理.
我的程序?qū)崿F(xiàn)方式:把詞庫讀進(jìn)內(nèi)存后構(gòu)建一個詞語樹.樹的每個節(jié)點包含一個字. 比方 中國 中國人 中華民族 中華人民共和國 幾個詞,構(gòu)成的樹的結(jié)構(gòu):
中
國^ 華
人^ 人 民
民 族^
共
和
國^
懶得上傳圖片,所以將就著這樣表示了.^表示該節(jié)點可以構(gòu)成一個詞.分詞的過程類似于輸入法的聯(lián)想功能.讀取一個字,然后聯(lián)想,直到聯(lián)想到不能為止.如果當(dāng)前可以構(gòu)成詞,便返回一個Token.如果當(dāng)前不能構(gòu)成詞語,便回溯到最近的可以構(gòu)成詞語的節(jié)點,返回.最差的情況就是返回第一個單字.然后從返回結(jié)果的下一個字重新開始聯(lián)想.
lucene自帶的幾個分詞程序中,ChineseAnalyzer是按字分的,與StandardAnalyzer對中文的分詞沒有大的區(qū)別.CJKAnalyzer是按兩字切分的,比較武斷,并且會產(chǎn)生垃圾Token,影響索引大小.
本分詞程序的效果取決與詞庫.您可以用自己的詞庫替換程序自帶的詞庫.詞庫是一個文本文件,名稱為word.txt. 每一行一個詞語,以#開頭表示跳過改行.最后保存為UTF-8的文本.
程序的缺陷:
沒有加入識別人名和地名的功能
該分詞的一個應(yīng)用案例:http://www.cyonline.net
這個網(wǎng)站是我給學(xué)校做的,用lucene對pdf ,word,excel,html等多種格式的文檔進(jìn)行解析,索引,提供全文搜索,并實現(xiàn)摘要高亮.這個網(wǎng)站在教育網(wǎng)上,公網(wǎng)用戶可能訪問起來比較慢.
安徽新華電腦學(xué)校專業(yè)職業(yè)規(guī)劃師為你提供更多幫助【在線咨詢】
自己寫的一個基于詞庫的lucene分詞程序--ThesaurusAnalyzer
2010-01-13 23:04:14 作者: 來源: