![a7a25db957feec58a5ec421d10c91932.png](https://i-blog.csdnimg.cn/blog_migrate/f1bf34b19eaf33977c7b38c00775d6a8.jpeg)
分词简介
分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。我们知道,在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符,虽然英文也同样存在短语的划分问题,不过在词这一层上,中文比之英文要复杂得多、困难得多。
现在的分词方法大概可以分为三个类别:基于字符串匹配的分词方法、基于统计的分词方法和基于理解的分词方法。
基于字符串匹配的分词方法
基于字符串匹配的方法我们又可以称之为机械分词方法,它是按照一定的扫描方式将待分词的句子中的词条与语料库中的词进行匹配,然后返回相应的结果。这种匹配的算法按照扫描的方式又可以分成
- 正向最大匹配法(由左到右的方向)
- 逆向最大匹配法(由右到左的方向)
- 最少切分(使每一句中切出的词数最小)
- 双向最大匹配法(进行由左到右、由右到左两次扫描)
语料库(词库):[我们,我,今天,特别,特别想,非常,非常想,吃,芒果]
待分词的句子:我今天特别想吃芒果
正向最大匹配算法:首先需要给定一个最大的词条长度,假设定义最大词条长度(滑动窗口的长度)为max_num=3,我们首先取出句子的前3个字符,看前3个字符是否存在于词库中,如果存在,则返回第一个分词,滑动窗口向后滑动3个位置;如果不存在,我们把滑动窗口从右向左缩小1,判断前两个字符是否存在于词库,如果存在,则返回这个分词,滑动窗口向后滑动2,不存在则继续缩小滑动窗口......直至将整个句子遍历完,就得到了最后的分词结果。
一开始滑动窗口的位置在“我今天”,这个词不存在词库里面,我们将滑动窗口缩小1,此时位置在“我今”,仍然不存在词库里,窗口再缩小1,“我”存在词库里,则返回第一个分词结果,将滑动窗口向后滑动1个距离;此时窗口的位置在“今天特”,我们如此重复第一个过程直至遍历完整个句子即可,按照这个方法我们最后的到的分词结果应该是:“我 今天 特别想 吃 芒果”
corpus = ['我们', '我', '今天', '特别', '特别想', '非常', '非常想', '吃', '芒果']
sentence = '我今天特别想吃芒果啊'
max_num = 3
def word_segment1(sentence, corpus, max_num):
result = []
start = 0
end = min(start + max_num,len(sentence))
while(start!=len(sentence)):
if start==end:
result.append(sentence[start])
if sentence[start] not in corpus:
corpus.append(sentence[start]) #假如词库中找不到单词,则返回这个单词,并往词库中添加;看具体的场景,如果词库中没有这个词则也可以直接返回空值,表示分词失败
start +=1
end = min(start + max_num, len(sentence))
if sentence[start:end] in corpus:
result.append(sentence[start:end])
start += len(result[-1])
end = min(start + max_num,len(sentence))
else:
end -=1
return corpus, r