資源描述:
《搜索引擎中文分詞原理與實(shí)現(xiàn)》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、搜索引擎中文分詞原理與實(shí)現(xiàn)因?yàn)橹形奈谋局?,詞和詞之間不像英文一樣存在邊界,所以中文分詞是一個專業(yè)處理中文信息的搜索引擎首先面對的問題,需要靠程序來切分出詞。一、Lucene中的中文分詞????????Lucene在中處理中文的常用方法有三種,以“咬死獵人的狗”為例說明之:??????單???字:【咬】【死】【獵】【人】【的】【狗】??????二元覆蓋:【咬死】【死獵】【獵人】【人的】【的狗】??????分???詞:【咬】【死】【獵人】【的】【狗】????????Lucene中的StandardTokenizer采用單
2、子分詞方式,CJKTokenizer采用二元覆蓋方式。1、Lucene切分原理????????Lucene中負(fù)責(zé)語言處理的部分在org.apache.lucene.analysis包,其中,TokenStream類用來進(jìn)行基本的分詞工作,Analyzer類是TokenStream的包裝類,負(fù)責(zé)整個解析工作,Analyzer類接收整段文本,解析出有意義的詞語。??????通常不需要直接調(diào)用分詞的處理類analysis,而是由Lucene內(nèi)存內(nèi)部來調(diào)用,其中:??????(1)在索引階段,調(diào)用addDocument(do
3、c)時,Lucene內(nèi)部使用Analyzer來處理每個需要索引的列,具體如下圖:???????圖1Lucene對索引文本的處理??????IndexWriterindex=newIndexWriter(indexDirectory,??????????????????????????????????????????????????newCnAnalyzer(),??????//用于支持分詞的分析器??????????????????????????????????????????????????!incrementa
4、l,??????????????????????????????????????????????????IndexWriter.MaxFieldLength.UNLIMITED);??????(2)在搜索階段,調(diào)用QueryParser.parse(queryText)來解析查詢串時,QueryParser會調(diào)用Analyzer來拆分查詢字符串,但是對于通配符等查詢不會調(diào)用Analyzer。??????Analyzeranalyzer=newCnAnalyzer();??????????????????????//支
5、持中文的分詞??????QueryParserparser=newQueryParser(Version.LUCENE_CURRENT,"title",analyzer);??????因?yàn)樵谒饕退阉麟A段都調(diào)用了分詞過程,索引和搜索的切分處理要盡量一致,所以分詞效果改變后需要重建索引。??????為了測試Lucene的切分效果,下面是直接調(diào)用Analysis的例子:??????Analyzeranalyzer=newCnAnalyzer();??????????????????????//創(chuàng)建一個中文分析器?????
6、?TokenStreamts=analyzer.tokenStream("myfield",newStringReader("待切分文本"));??//取得Token流??????while(ts.incrementToken()){??????????????????????????????????//取得下一個詞??????????????System.out.println("token:?"+ts);??????}2、Lucene中的Analyzer??????為了更好地搜索中文,通過下圖來了解一下在Luce
7、ne中通過WhitespaceTokenizer、WordDelimiterFilter、LowercaseFilter處理英文字符串的流程:圖2Lucene處理英文字符串流程二、查找詞典算法??????詞典格式可以是方便人工查看和編輯的文本文件格式,也可以是方便機(jī)器讀入的二進(jìn)制格式。詞典的最基本文本文件格式就是每行一個詞。在基于詞典的中文分詞方法中,詞典匹配算法是基礎(chǔ)。一般詞典規(guī)模都在幾十萬詞以上,所以為了保證切分速度,需要選擇一個好的查找詞典算法。1、標(biāo)準(zhǔn)Trie樹??????一個數(shù)字搜索Trie樹的一個節(jié)點(diǎn)只保
8、留一個字符,如果一個單詞比一個字符長,則包含第一個字符的節(jié)點(diǎn)有指針指向下一個字符的節(jié)點(diǎn),依次類推。這樣組成一個層次結(jié)構(gòu)的樹,樹的第一層包括所有單詞的第一個字符,樹的第二層包括所有單詞的第二個字符,依次類推,數(shù)字搜索樹的最大高度是詞典中最長單詞的長度。比如:如下單詞序列組成的詞典(asatbebyheinisitofonorto)會生成如下圖所示