前向分词最大匹配算法

分词是自然语言处理的一个基本工作,中文分词和英文不同,字词之间没有空格,可以将中文分词方法简单归纳为:

 

  1. 基于词表的分词方法
  2. 基于统计的分词方法
  3. 基于序列标记的分词方法

其中,基于词表的分词方法最为简单,根据起始匹配位置不同可以分为:

  1. 前向最大匹配算法
  2. 后向最大匹配算法
  3. 双向最大匹配算法

三种方法思想都很简单,今天我们用python实现前向最大匹配算法。

前向最大匹配算法,顾名思义,就是从待分词句子的左边向右边搜索,寻找词的最大匹配。我们需要规定一个词的最大长度,每次扫描的时候寻找当前开始的这个长度的词来和字典中的词匹配,如果没有找到,就缩短长度继续寻找,直到找到字典中的词或者成为单字。

下面是我的代码。

 

word_dict = ['中国', '政府', '基本', '大量', '赌博', '和谐', '菲律宾', '人民', '游客', '菲律宾', '机械', '大量', '活动', '从事', '然后', '他们', '追捕',
'进入']
test_str = '''在中国政府的支持下菲律宾宣布对大量中国人进行追捕,他们基本上以游客身份进入菲律宾,然后从事中国禁止的网络赌博活动。'''


# 获取分词
def getSeg(text):
# 句子为空
if not text:
return ''

# 句子成为一个词
if len(text) == 1:
return text

# 此处写了一个递归方法
if text in word_dict:
return text
else:
small = len(text) - 1
text = text[0:small]
return getSeg(text)


def main():
global test_str, word_dict
test_str = test_str.strip()
# 正向最大匹配分词测试 最大长度5
max_len = max(len(word) for word in word_dict)
result_str = [] # 保存分词结果
result_len = 0
print('input :', test_str)
while test_str:
tmp_str = test_str[0:max_len]
seg_str = getSeg(tmp_str)
seg_len = len(seg_str)
result_len = result_len + seg_len

if seg_str.strip():
result_str.append(seg_str)
test_str = test_str[seg_len:]

print('output :', result_str)


if __name__ == '__main__':
main()

看一下分词的结果吧!

The End


已发布

分类

,

标签:

评论

《“前向分词最大匹配算法”》 有 1 条评论

  1.  的头像
    匿名

    给思原同学点赞!

回复 匿名 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注