【问题标题】:Identifying similar strings in a database in Python在 Python 中识别数据库中的相似字符串
【发布时间】:2016-03-02 17:28:16
【问题描述】:

我有一个包含超过一百万个字符串的数据库表。每个字符串都是一个词,长度可以从两个词到五个或六个不等。

["big giant cars", "zebra videos", "hotels in rio de janeiro".......]

我还有一个 csv 文件中包含数千个较小术语的黑名单。我想要做的是识别数据库中与我的 csv 文件中列入黑名单的术语相似的术语。这种情况下的相似性可以解释为黑名单术语的拼写错误。

我熟悉 python 中的库,例如 fuzzywuzzy,它可以使用 Levensthein 距离评估字符串相似度并返回相似度的整数表示。本教程中的一个示例是:

fuzz.ratio("NEW YORK METS", "NEW YORK MEATS") ⇒ 96

这种方法的一个缺点是它可能会错误地识别可能在不同上下文中表示某事的术语。

一个简单的例子是“big butt”,一个列入黑名单的字符串,与“big but”这样的更无辜的字符串混淆。

我的问题是,是否可以在 python 中以编程方式实现这一点,还是只检索所有看起来相似的关键字并过滤误报会更容易?

【问题讨论】:

    标签: python string csv similarity fuzzywuzzy


    【解决方案1】:

    我不确定这个问题是否有任何明确的答案,所以我能做的最好的就是解释我将如何解决这个问题,希望你能从我的漫谈中得到任何想法。 :-)

    首先。

    从不相关的角度来看,模糊字符串匹配可能还不够。人们将使用外观相似的字符和非字符符号来绕过任何文本匹配,以至于黑名单单词和实际文本之间的匹配几乎为零,但它仍然是可读的。因此,也许您需要对字典和搜索文本进行一些规范化,例如将所有“0”(零)转换为“O”(大写 O)、“>

    第二个。

    我认为您无法一次性区分列入黑名单的单词和外观相似的合法变体。所以是的,很可能您必须搜索可能的黑名单匹配项,然后检查您找到的内容是否也与某些合法词匹配。这意味着您不仅需要列入黑名单的字典,还需要列入白名单的字典。更积极的一点是,可能没有必要对列入白名单的词典进行规范化,因为编写可接受文本的人可能会用可接受的语言编写它,而无需使用上述任何技巧。或者,如果您感到偏执,可以将其正常化。 :-)

    第三个。

    但是问题在于,将单词/表达式与黑白名单进行匹配实际上并不能为您提供可靠的答案。使用您的示例,一个人可能会将“big butt”写为一个诚实的错字,这在上下文中很明显(反之亦然,故意写一个“big but”以获得与白名单单词的更高匹配,即使上下文使它相当很明显真正的含义是什么)。因此,您可能必须实际检查上下文,以防有足够好的匹配黑名单和白名单。这是一个我不太熟悉的领域。可能可以为各种单词(来自两个词典)构建相关图,以确定哪些单词更多(或更少)经常与它们结合使用,并使用它们来检查您的具体示例。以本段为例,如果单词“black”与“list”一起使用,则可能会被列入白名单,但在其他情况下会被列入黑名单。

    第四个。

    即使将所有这些措施一起应用,您也可能希望留下一定数量的灰色区域。也就是说,除非在任一方向上都具有足够高的确定性,否则将最终决定权留给人类(筛选 cmets/帖子一段时间,自动将它们放入审核队列,或者您的项目要求的任何其他内容)。

    第五个。

    您可以尝试学习算法,从上一步收集人工输入,并使用它随着时间的推移自动微调您的算法。

    希望对您有所帮助。 :-)

    【讨论】:

    • 是的,我认为机器学习是可行的方法,但我一直在摸索着想弄清楚。我在 Cross Validated 上提出了一个问题,问了同样的问题,看起来无论哪种方式都很难。 stats.stackexchange.com/questions/199311/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 2016-07-15
    • 2015-07-28
    • 1970-01-01
    • 2020-03-30
    • 2021-10-15
    相关资源
    最近更新 更多