日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

逆向最大匹配分词算法

發(fā)布時(shí)間:2025/4/16 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 逆向最大匹配分词算法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

逆向最大匹配分詞算法

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。