一.
1.1.1正向最大匹配算法
从左到右将待分词文本中的几个连续字符与词表匹配,如果匹配上,则切分出一个词。但这里有一个问题:要做到最大匹配,并不是第一次匹配到就可以切分的 。我们来举个例子:
待分词文本: sentence[]={“计”,“算”,“语”,“言”,“学”,“课”,“程”,“有”,“意”,“思”}
词表: dict[]={“计算”, “计算语言学”, “课程”, “有”, “意思”} (真实的词表中会有成千上万个已经平时我们使用的分好的词语)
(1) 从sentence[1]开始,当扫描到sentence[2]的时候,发现"计算"已经在词表dict[]中了。但还不能切分出来,因为我们不知道后面的词语能不能组成更长的词(最大匹配)。
(2) 继续扫描content[3],发现"计算语"并不是dict[]中的词。但是我们还不能确定是否前面找到的"计算语"已经是最大的词了。因为"计算语"是dict[2]的前缀。
(3) 扫描content[4],发现"计算语言"并不是dict[]中的词。但是是dict[2]的前缀。继续扫描:
(3) 扫描content[5],发现"计算语言学"是dict[]中的词。继续扫描下去:
(4) 当扫描content[6]的时候,发现"计算语言学课"并不是词表中的词,也不是词的前缀。因此可以切分出前面最大的词——“计算语言学”。
1.1.2逆向最大
与正相反左从右到左匹配词表就行
1.1.3双向最大匹配法
比较正向最大匹配和逆向最大匹配结果
如果分词数量结果不同,那么取分词数量较少的那个
如果分词数量结果相同
分词结果相同,可以返回任何一个
分词结果不同,返回单字数比较少的那个
#这里用的jieba的精确模式分词,还可以用全模式,或者指定词库
def print_word_count(string_data):
seg_list_exact = jb.cut(string_data, cut_all=False) # 精确模式分词
object_list = []
for word in seg_list_exact: # 循环读出每个分词
object_list.append(word