逆向最大匹配分词算法
逆向最大匹配分詞算法
By?Jorbe?2014/03/13?計算機科學?No Comments
中文分詞是所有中文信息處理的基礎。在數據挖掘、搜索引擎、自然語言處理等領域都起著至關重要的作用。中文分詞算法大概可以分為三類:正向最大匹配、逆向最大匹配以及基于統計概率模型的算法。這篇博文講的就是逆向最大匹配分詞算法。其實正向最大匹配和逆向最大匹配算法類似。逆向最大匹配算法雖然簡單,但在處理一些語句上面還是不能準確地分詞,后面會具體講到。
逆向最大匹配分詞算法:
事先設置一個k值,下面的程序k值設為5,然后從最后一個字開始向前截取k個字,先把這k個字和字典匹配,看能否找到匹配的詞語,若不能,則剔除這k個字最左邊的字,然后再把這k-1個字與字典匹配...一直到匹配成功,或者前k-1個字都沒匹配成功,那就把第k個字當成一個獨立的詞,然后再向前移動分出來的詞的長度,再截取k個字......一直到全部分好詞為止。
Codes:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #!/usr/bin/env python # -*- coding: utf-8 -*- def get_k_words(text,i,k): ?if i+1<k: ?????return text[0:i+1],i+1 ?else: ?????return text[i-(k-1):i+1],k def segment_words(text,dict_words,k=5): ?seg_words="" ?i=len(text)-1 ?while i>=0: ?????tmp_words,length=get_k_words(text,i,k) ?????tmp_len=0 ?????for j in range(length): ?????????if dict_words.has_key(tmp_words[j:length]): ?????????????seg_words+=(tmp_words[j:length]+" ") ?????????????tmp_len=length-j ?????????????break ?????????if j==length-1 and not dict_words.has_key(tmp_words[j:length]): ?????????????seg_words+=(tmp_words[j:length]+" ") ?????????????tmp_len=length-j ?????i=i-tmp_len ?return seg_words ################################################ if __name__=="__main__": ?text=u"我愛北京天安門" ?seg_words="" ?dict_words={u"愛":1,u"北京":1,u"天安門":1,u"研究":1,u"研究生":1,u"中國":1,u"國人":1,u"一件":1,u"面子":1,u"一個":1} ?seg_words=segment_words(text,dict_words) ?words_list=seg_words.strip().split() ?words_list.reverse() ?seg_words=" ".join(words_list) ?print seg_words.encode('utf-8') |
輸出:
下面就拿上面的例子一步一步來分析逆向最大匹配法是怎么來進行分詞的。首先從后面開始截取k(這里是5)個字,如圖
,然后把"北京天安門"五個字與字典匹配,字典中沒有這個詞,然后就去掉"北"字,把剩下的"京天安門"與字典匹配,字典中還是沒有這個詞,再去掉"京",然后再把"天安門"與字典匹配,發現匹配到了這個詞,于是就把"天安門"劃為一個詞語,然后指針向前移動三個字,如圖再截取k個字,這里因為就剩下4個字了,所以就截取4個字,把"我愛北京"與字典匹配,沒成功,去掉"我",再把"愛北京"與字典匹配,還是沒成功,再去掉"愛",然后發現"北京"匹配成功,把"北京"劃為一個詞語,再把指針向前移動兩個字,......下面的我就不復述了,最后就剩下,所以再把"我"劃為一個詞。綜上,最后的分詞結果為:"我 愛 ?北京 ?天安門"。
前面講到,逆向最大匹配算法雖然簡單,但分詞效果不是非常好。來看下面一個例子。假如要對"中國人真愛面子"這條語句進行分詞。用上面的程序分好詞的結果是:
??梢钥吹?#xff0c;它把"中國人"這個詞分成了"中"和"國人"兩個詞。這樣,這條語句讀起來就不順了。所以,現在的分詞算法都不用逆向最大匹配或正向最大匹配,而是采用基于統計概率模型的分詞算法。比如?maxent??或??CRF++?等,這些算法通常都比較復雜,但是在分詞效果上比逆向最大匹配和正向最大匹配好。
關于上面用到的例子,先說明一下,其實這個例子并不能解釋逆向最大匹配分詞算法的不準確性,因為,如果觀察上面的代碼里的字典就能發現,里面沒有"中國人"這個詞,要是有這個詞的話,分詞結果還是正確的。我這里舉這個例子只是起一個拋磚引玉的效果。前面的代碼也只是一個雛形,還存在著很多問題,比如,它不能實現對中英文語句進行分詞,而且也沒有詞干提取方法。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的逆向最大匹配分词算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 双向最大匹配算法(含完整代码实现,ui界
- 下一篇: 双向最大匹配算法