0

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

["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 中以编程方式完成此操作,或者仅检索所有相似的关键字并过滤误报会更容易?

4

1 回答 1

2

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

第一的。

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

第二。

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

第三。

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

第四。

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

第五。

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

希望有帮助。:-)

于 2016-03-03T15:15:38.040 回答