01 贪婪策略
今天我们调用python中的一个自然语言处理包nltk,来实现一个MaxMatch文本匹配算法。
什么是MaxMatch文本匹配算法呢?顾名思义,就是取最长的字符作为一个分词结果,比如说:“我爱中华人民共和国”这个句子,分词后,可以有很多结果,如,
- {‘我’,‘爱’,‘中华’,‘人民’,‘共和国’}
- {‘我’,‘爱’,‘中华人民共和国’}
MaxMatch文本匹配算法更倾向于后者的分词结果,因为‘中华人民共和国’显然是一个专有名词。
所以你看出来了,MaxMatch文本匹配算法其实是一种基于贪婪策略的算法。
下面我们演示针对英文的maxmatch算法(中文的逻辑相同,只是需要中文词库)
02 算法逻辑
根据前述MaxMatch算法的思想,我们可以设计出以下逻辑来实现此算法:
输入:无空格、无其他符号的英文句子
输出:用空格合理隔开的句子,使得句子有意义
算法逻辑:从字符串右侧开始逐渐减少字符串长度(-1),每次都去检查当前字符串能否匹配对应词库的词
- 若能匹配,则取出该段字符串,放入空字符串中,剩余字符串继续执行第一步操作
- 若不匹配,则将字符串长度-1,再去检查是否匹配词库的词
03 算法实现
根据算法逻辑,我们利用python的nltk模块,实现MaxMatch算法。
"""
输入:无空格、无其他符号的英文句子(否则会死循环)
输出:用空格合理隔开的句子,使得句子有意义
"""
def max_match(text):
from nltk.stem import WordNetLemmatizer
from nltk.corpus import words
import time
start_time=time.time()
wordlist=set(words.words()) #利用词汇表语料库words建立单词列表
lemmatizer=WordNetLemmatizer() #初始化词形还原函数
position=len(text)
result=""
while len(text)>0:
word=lemmatizer.lemmatize(text[:position]) #对输入的字符串进行词形还原,英文需要,中文不用
if word in wordlist:
result+=text[:position]+" "
text=text[position:]
position=len(text)
else:
position-=1 #若不匹配,则将字符串长度-1,再去重复前述步骤
print ("MaxMatch Algorithm Time Taken:{0}s".format(time.time()-start_time))
print ("MaxMatch result:",result)
return result
下面我们来测试一下这个算法
告诉我,你是不是看不懂下面这个text在说什么?别急,MaxMatch算法来拯救你~
text="Indiapolicementoldtoslimdownorlosejob"
max_match(text)
输出
原来text说的是印度警察被要求减肥,否则就丢掉工作。
可以发现,算法处理后,有的词汇识别还是有些误差,比如or lose job 被判断为了orlo se job,原因很简单:nltk.corpus.words词库中包含大量词汇,orlo和or都在词库中,而我们的算法选择了更长的词(这也是算法核心),导致它最终分为了orlo而不是or
所以这也是最大匹配算法的一个缺点,它虽然保证了快速高效匹配文本,但准确率可能不够高。
04 总结
本文利用python的nltk模块实现了文本最大匹配算法,通过算法我们可以快速匹配句子中的文本,帮助我们快速理解语义,但最大匹配算法虽然保证了快速高效匹配文本,但准确率可能不够高。
希望对你有帮助~~