NLP | 文本匹配算法

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模块实现了文本最大匹配算法,通过算法我们可以快速匹配句子中的文本,帮助我们快速理解语义,但最大匹配算法虽然保证了快速高效匹配文本,但准确率可能不够高。

希望对你有帮助~~

推荐阅读更多精彩内容

  • BF算法(Brute Force) 暴力匹配算法,在主串和模式串每次比较都只前进一个位置,进行比较。 code 时...
    乙腾阅读 69评论 0 3
  • 说起算法,相信大家普遍都听过数学算法,例如:口算,心算等,这些都属于数学算法。不过,今天给大家介绍的算法不是数学算...
    孤独猦阅读 286评论 10 2
  • 1. 字符串为空或者空格判断 (1) 使用字符串长度判断 len(s) ==0 字符串为空 (2) Isspace...
    Alyna_C阅读 102评论 0 3
  • grep 只要出现gene字眼都查找出 精确查找,一个单词一个单词的搜索 用于找文件前缀 到file文件里面查找关...
    呆呱呱阅读 1,924评论 0 41
  • Python有非常多有趣使用的技巧,下面列举20个短小精炼的用法,其中既包含常规语法,又有第三方库的妙用,体现了p...
    python大数据分析阅读 1,529评论 4 35