今天终于成功的把最大正向匹配算法的代码写好啦,虽然是一个很简单的算法,但是对于我这个自然语言处理小白来说,也花费了好久呢,还是有点小开心的,哈哈。
最大正向匹配算法原理:从右到左依次匹配语料库中的词语
步骤:1、找出语料库中最长的词语长度 max_lenth 2、将max_lenth与需要划分的句子进行比较,选较小值作为句子的划分长度3、根据划分长度划分句子,并将划分后的句子与语料库进行匹配,若语料库中存在该句子,则该句子为完整语句,将该句子从需要划分的句子中剔除后,重新执行上述操作,若没有该句子,则将句子中的字从右至左依次剔除,并逐一进行匹配,直至匹配到相应的句子或匹配到句子的第一个字后,再重新执行上述操作。
相应代码
dict_list=[]
def init():
with open('中医词典.txt','r')as dict:
for iin dict:
i=i.strip()
dict_list.append(i)
print(dict_list)
def FMM(sentence,dict_list):
cut_word_list=[]
maxLenth_dict_list=max(len(word)for wordin dict_list)
while len(sentence)>0:
word_lenth =min(maxLenth_dict_list, len(sentence))
cut_word=sentence[:word_lenth]
while len(cut_word)>0:
if len(cut_word)==1:
cut_word_list.append(cut_word)
break
elif cut_wordin dict_list:
cut_word_list.append(cut_word)
break
else:
cut_word=sentence[:word_lenth-1]
word_lenth=word_lenth-1
sentence=sentence[len(cut_word):]
words='/n'.join(cut_word_list)
return words
def main():
sentence=input('请输入要分词的句子:')
init()
word=FMM(sentence,dict_list)
print(word)
if __name__ =='__main__':
main()
中医代码是本人从网站爬下来的语料库,可以更改为自己的语料库。
正向最大匹配算法,是基于词典的语料库算法,所以在使用时,需要构建相应的词典。