逆向最大匹配分词算法

逆向最大匹配分词算法

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

     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)个字,如图

逆向最大匹配分词算法_第1张图片

,然后把"北京天安门"五个字与字典匹配,字典中没有这个词,然后就去掉"北"字,把剩下的"京天安门"与字典匹配,字典中还是没有这个词,再去掉"京",然后再把"天安门"与字典匹配,发现匹配到了这个词,于是就把"天安门"划为一个词语,然后指针向前移动三个字,如图再截取k个字,这里因为就剩下4个字了,所以就截取4个字,把"我爱北京"与字典匹配,没成功,去掉"我",再把"爱北京"与字典匹配,还是没成功,再去掉"爱",然后发现"北京"匹配成功,把"北京"划为一个词语,再把指针向前移动两个字,......下面的我就不复述了,最后就剩下,所以再把"我"划为一个词。综上,最后的分词结果为:"我 爱  北京  天安门"。

前面讲到,逆向最大匹配算法虽然简单,但分词效果不是非常好。来看下面一个例子。假如要对"中国人真爱面子"这条语句进行分词。用上面的程序分好词的结果是:

。可以看到,它把"中国人"这个词分成了"中"和"国人"两个词。这样,这条语句读起来就不顺了。所以,现在的分词算法都不用逆向最大匹配或正向最大匹配,而是采用基于统计概率模型的分词算法。比如 maxent  或  CRF++ 等,这些算法通常都比较复杂,但是在分词效果上比逆向最大匹配和正向最大匹配好。

关于上面用到的例子,先说明一下,其实这个例子并不能解释逆向最大匹配分词算法的不准确性,因为,如果观察上面的代码里的字典就能发现,里面没有"中国人"这个词,要是有这个词的话,分词结果还是正确的。我这里举这个例子只是起一个抛砖引玉的效果。前面的代码也只是一个雏形,还存在着很多问题,比如,它不能实现对中英文语句进行分词,而且也没有词干提取方法。

你可能感兴趣的:(算法,科研,算法,中文分词)