分词是自然语言处理的一个基本工作,中文分词和英文不同,字词之间没有空格,可以将中文分词方法简单归纳为:
- 基于词表的分词方法
- 基于统计的分词方法
- 基于序列标记的分词方法
其中,基于词表的分词方法最为简单,根据起始匹配位置不同可以分为:
- 前向最大匹配算法
- 后向最大匹配算法
- 双向最大匹配算法
三种方法思想都很简单,今天我们用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()
看一下分词的结果吧!
给思原同学点赞!