【问题标题】:Python string similarity (with complexity)Python 字符串相似度(具有复杂性)
【发布时间】:2019-11-23 20:32:20
【问题描述】:

我有一个字符串要与候选人列表进行匹配。这是一个例子:

# ignore case
string = "The Shining" # The Stanley Kubrick Movie
candidates = ['Shining', 'The shins', 'Shining, The'] 
most_similar(string, candidates)
==> 'Shining, The'

做一个“文字字符串比较”,在这种情况下,我通常使用Levenshtein distance 或比率。但是,我想做一个更复杂的相似性测试,以便上述情况下的最佳匹配是Shining, The

我猜这是一个可能已经广泛解决的常见问题,所以我想知道什么库/工具/等。可能是获得我想要做的事情的最佳方式?

【问题讨论】:

    标签: python python-3.x string search levenshtein-distance


    【解决方案1】:

    您正在寻找gensimfuzzywuzzy 包。

    在这种特定情况下,您可能倾向于fuzzywuzzy,因为您只是尝试进行字符串匹配。

    gensim 更多地用于计算文档、段落、句子、单词、语料库等的相似度分数和向量表示,目的是捕获语义/主题含义,而不是文字字符串匹配。

    所以在你的情况下,使用模糊字符串匹配,你可能会这样做:

    from fuzzywuzzy import fuzz
    
    fuzz.partial_ratio('Shining', 'The shins')
    >>> 50 
    
    fuzz.partial_ratio('Shining', 'Shining, The')
    >>> 100
    
    fuzz.partial_ratio('Shining', 'unrelated')
    >>> 14
    

    partial_ratio 函数区分大小写,因此您可能希望将所有输​​入都小写。它将输出 0 到 100 之间的分数(100 是非常强的匹配)。由您决定如何从那里过滤掉匹配项,也许使用阈值:if score > 75: its a match

    我建议您查看 fuzzywuzzy 包中的不同功能,看看最适合您的情况。

    【讨论】:

    • 太棒了,这似乎正是我想要的。您能否使用 gensim 从上述输入/输出中显示一个基本示例,我会接受答案吗?
    • @Jar -- 完美,谢谢。出于非常高层次的好奇,fuzzy 和 gensim 之间有什么区别?对于基本字符串比较,您会建议两者中的哪一个?
    • @David542 我没有广泛使用gensim,但据我了解,它不用于字符串匹配,而是用于捕获语义含义(即catdog是相似的,因为它们都是动物)。 Fuzzywuzzy 是您将用于字符串匹配的内容。
    • 太好了,感谢您详细的撰写和建议。超级有帮助:) !!
    猜你喜欢
    • 2019-05-01
    • 2014-12-20
    • 2016-07-15
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多