正向最大匹配算法(FMM)
正向最大匹配算法(FMM)是一种基于词典的分词方法,思想很简单就是从左向右扫描寻找词的最大匹配,比如词典中同时含有“钓鱼”和“钓鱼岛”,那“钓鱼岛属于中国”就会被分词成“钓鱼岛/属于/中国”
过程
限定词的最大长度(例如5)从最大的长度开始在词库中进行匹配,直到匹配成功更新起点的位置继续上一步骤直到全部完成实验
代码
# -*- coding: utf-8 -*-# 中文正向最大匹配(FMM)分词import sysreload(sys)#动态重新加载sys模块sys.setdefaultencoding('utf8')word_dict = ['新华网', '东京', '记者', '吴谷丰', '日本共同社', '28', '报道']test_str = ' 新华网东京电记者吴谷丰据日本共同社28日报道'# 获取分词def getSeg(text):if not text:return ''if len(text) == 1:return textif text in word_dict:return textelse:small = len(text) - 1text = text[0:small]return getSeg(text)def main():global test_strtest_str = test_str.decode('utf8').strip()max_len = 5# 正向最大匹配分词测试,最大长度5result_str = '' # 保存要输出的分词结果result_len = 0print 'input :', test_strwhile test_str:tmp_str = test_str[0:max_len]seg_str = getSeg(tmp_str)seg_len = len(seg_str)result_len = result_len + seg_lenif seg_str.strip():result_str = result_str + seg_str + ' / 'test_str = test_str[seg_len:]print 'output :', result_strif __name__ == '__main__':main()
结果
input : 新华网东京电记者吴谷丰据日本共同社28日报道output : 新华网 / 东京 / 电 / 记者 / 吴谷丰 / 据 / 日本共同社 / 28 / 日 / 报道 /
分词词典可以自定义或者从此网页下载,然后将word_dict代码更换成下面这行
word_dict = [line.strip() for line in open('dict.txt')]