在Python中识别数据库中的类似字符串

时间:2016-03-02 17:28:16

标签: python string csv similarity fuzzywuzzy

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

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

我还在csv文件中有一个超过几千个较小术语的黑名单。我想要做的是将数据库中的类似术语标识为我的csv文件中列入黑名单的术语。在这种情况下的相似性可以被解释为列入黑名单的术语的错误拼写。

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

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

这种方法的缺点是它可能错误地识别可能意味着在不同背景下的某些术语。

一个简单的例子就是“大屁股”,一个列入黑名单的字符串,与一个更加无辜的字符串混淆,比如“大而”。

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

1 个答案:

答案 0 :(得分:2)

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

首先

在不相关的角度上,模糊字符串匹配可能还不够。人们将会使用外观相似的字符和非字符符号来绕过任何文本匹配,以至于黑名单和实际文本之间几乎没有匹配,但它仍然可以读取它的内容。所以也许你需要对字典和搜索文本进行一些规范化,比如将所有'0'(零)转换为'O'(大写字母O),'><'到'X'等我认为有这个目的的库和/或转换引用。非拉丁符号也是一种独特的可能性,应予以考虑。

第二

我认为您无法在一次通过中区分列入黑名单的单词和具有相似外观的法律变体。所以是的,很可能你将不得不搜索可能的黑名单匹配,然后检查你发现的是否与某些合法的词匹配。这意味着您不仅需要列入黑名单的字典,还需要列入白名单的字典。从更积极的角度来看,可能没有必要对白名单字典进行规范化,因为正在编写可接受文本的人可能会用可接受的语言编写它而不需要上面列出的任何技巧。或者,如果你感到偏执,你可以将它标准化。 : - )

第三

然而问题是,对黑白名单匹配单词/表达实际上并没有给你一个可靠的答案。使用你的例子,一个人可能会写一个“大屁股”作为一个诚实的错字,这在上下文中是显而易见的(反之亦然,写一个“大但有意”以获得更高的匹配白名单词,即使上下文使它相当显而易见的是真正的意义)。因此,如果对黑名单和白名单都有足够好的匹配,您可能必须实际检查上下文。这是一个我不太熟悉的领域。可能可以为各种单词(来自两个词典)构建相关性映射,以识别哪些单词与它们结合使用的次数更多(或更少),并使用它们来检查您的具体示例。使用这一段作为示例,如果“黑色”与“列表”一起使用但在其他一些情况下被列入黑名单,则可将其列入白名单。

即使将所有这些措施结合在一起,您也可能希望留下一定数量的灰色区域。也就是说,除非在任何一个方向都有足够的确定性,否则为人类做出最终决定(一段时间筛选评论/帖子,自动将它们放入审核队列,或者你的项目所指示的任何其他内容)。

第五

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

希望有所帮助。 : - )