庖丁系統的分詞原理


庖丁系統是個完全基於lucene的中文分詞系統,因而它就是重新了一個analyer,
叫做PaodingAnalyzer,這個analyer的核心任務就是生成一個可以切詞的TokenStream
這些都是lucene的結構設計,如果要和lucene一起使用就要這么寫。
    庖丁系統中的TokenStream就是PaodingTokenizer,它提供了我們用於分詞的核心方法
next,它每次調用的時候返回切好的一個詞。它采用了一個迭代器來進行的緩存,因而它不
是每次調用都會去拿出一堆刀來進行切詞,它一般會一次切一堆然后將它保存下來,然后等
取完了再切第二次。
    切詞的時候它是直接調用了knifebox的dissect方法來進行切詞的
    knifebox是個刀盒子,它有一個刀的數組,它的dissect方法會調用刀的assignable方法
來決定是否可以用這個刀來切,如果用一個刀切了,但是沒有切出任何詞,即刀返回的最后切詞的位置
與開始位置一樣則換下把刀切,如果切出了詞,那么就直接返回最后切的位置,再不換刀切了,同時等
待下一次切詞。
    在這個系統中還有paoding和SmartKnifeBox兩個子類他們都是繼承knifebox,但是它們只是
做了一些簡單的檢查工作,主要工作還是由這個基類來完成。

 

分詞策略的問題,我們在代碼中看見庖丁系統的分詞,它在分詞的時候盡量
將多的詞語分出來,但是在PaodingAnalyzer發現它是有兩種mode,一種是MOST_WORDS_MODE,
一種是MAX_WORD_LENGTH_MODE,從字面上就可以看出它們的策略,前者是表示盡可
能多的分詞,即“華中科技大學”直接分為“華中/華中科技/華中科技大學/科技/大學/”,在CJKKnife中
當它遇到“華中”的時候就會開始collect,然后它將移動結尾,在分出“華中科技”和“華中科技大學”,這樣
“華”開頭的就切完了,然后它將跳出小循環,進入下一輪大循環,移動開頭位置,即“中”字,繼續采用
這個策略來切詞,這樣可以分出像上面那么多的詞來,而這種方式用在索引的時候最好,可以保證索引中有
盡可能多的關鍵詞,這樣找到的機會就大些。如果采用后一種mode,它將直接將上面分出的“華中/華中科技
/華中科技大學/科技/大學/”只將最長的一個collect了,而前者會將它們全部collect。

 

前一節簡單的提到了分詞時候的兩種策略,這兩種策略的實現實際上是采用使用不同
的collect來實現的,MostWordsTokenCollector對應於最多詞策略,MaxWordLengthTokenCollector
對應於最長詞的策略。在最長詞策略中,它是采用將前詞分解的詞先不要記錄下來(保存在list中)
而是將它作為候選,如果后面的詞與它有一樣的開頭並且比它長,就替換它,如果和它有一樣頭的所有
詞都沒有它長則將它記錄下來(加入List中)。
   至於這個mode策略的選擇,它是在PaodingAnalyzerBean中進行的,它在PaodingAnalyzer的init
函數中調用了父類PaodingAnalyzerBean中的setmode方法設置mode,同時它產生了一個相應的classtype,最后
根據這個classtype來通過反射生成一個collect傳入PaodingTokenizer,供它使用。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com