逆向最大匹配分词算法
逆向最大匹配分詞算法
By?Jorbe?2014/03/13?計(jì)算機(jī)科學(xué)?No Comments
中文分詞是所有中文信息處理的基礎(chǔ)。在數(shù)據(jù)挖掘、搜索引擎、自然語言處理等領(lǐng)域都起著至關(guān)重要的作用。中文分詞算法大概可以分為三類:正向最大匹配、逆向最大匹配以及基于統(tǒng)計(jì)概率模型的算法。這篇博文講的就是逆向最大匹配分詞算法。其實(shí)正向最大匹配和逆向最大匹配算法類似。逆向最大匹配算法雖然簡單,但在處理一些語句上面還是不能準(zhǔn)確地分詞,后面會(huì)具體講到。
逆向最大匹配分詞算法:
事先設(shè)置一個(gè)k值,下面的程序k值設(shè)為5,然后從最后一個(gè)字開始向前截取k個(gè)字,先把這k個(gè)字和字典匹配,看能否找到匹配的詞語,若不能,則剔除這k個(gè)字最左邊的字,然后再把這k-1個(gè)字與字典匹配...一直到匹配成功,或者前k-1個(gè)字都沒匹配成功,那就把第k個(gè)字當(dāng)成一個(gè)獨(dú)立的詞,然后再向前移動(dòng)分出來的詞的長度,再截取k個(gè)字......一直到全部分好詞為止。
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"一個(gè)":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') |
輸出:
下面就拿上面的例子一步一步來分析逆向最大匹配法是怎么來進(jìn)行分詞的。首先從后面開始截取k(這里是5)個(gè)字,如圖
,然后把"北京天安門"五個(gè)字與字典匹配,字典中沒有這個(gè)詞,然后就去掉"北"字,把剩下的"京天安門"與字典匹配,字典中還是沒有這個(gè)詞,再去掉"京",然后再把"天安門"與字典匹配,發(fā)現(xiàn)匹配到了這個(gè)詞,于是就把"天安門"劃為一個(gè)詞語,然后指針向前移動(dòng)三個(gè)字,如圖再截取k個(gè)字,這里因?yàn)榫褪O?個(gè)字了,所以就截取4個(gè)字,把"我愛北京"與字典匹配,沒成功,去掉"我",再把"愛北京"與字典匹配,還是沒成功,再去掉"愛",然后發(fā)現(xiàn)"北京"匹配成功,把"北京"劃為一個(gè)詞語,再把指針向前移動(dòng)兩個(gè)字,......下面的我就不復(fù)述了,最后就剩下,所以再把"我"劃為一個(gè)詞。綜上,最后的分詞結(jié)果為:"我 愛 ?北京 ?天安門"。
前面講到,逆向最大匹配算法雖然簡單,但分詞效果不是非常好。來看下面一個(gè)例子。假如要對"中國人真愛面子"這條語句進(jìn)行分詞。用上面的程序分好詞的結(jié)果是:
。可以看到,它把"中國人"這個(gè)詞分成了"中"和"國人"兩個(gè)詞。這樣,這條語句讀起來就不順了。所以,現(xiàn)在的分詞算法都不用逆向最大匹配或正向最大匹配,而是采用基于統(tǒng)計(jì)概率模型的分詞算法。比如?maxent??或??CRF++?等,這些算法通常都比較復(fù)雜,但是在分詞效果上比逆向最大匹配和正向最大匹配好。
關(guān)于上面用到的例子,先說明一下,其實(shí)這個(gè)例子并不能解釋逆向最大匹配分詞算法的不準(zhǔn)確性,因?yàn)?#xff0c;如果觀察上面的代碼里的字典就能發(fā)現(xiàn),里面沒有"中國人"這個(gè)詞,要是有這個(gè)詞的話,分詞結(jié)果還是正確的。我這里舉這個(gè)例子只是起一個(gè)拋磚引玉的效果。前面的代碼也只是一個(gè)雛形,還存在著很多問題,比如,它不能實(shí)現(xiàn)對中英文語句進(jìn)行分詞,而且也沒有詞干提取方法。
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的逆向最大匹配分词算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 双向最大匹配算法(含完整代码实现,ui界
- 下一篇: 双向最大匹配算法