2016-03-02 32 views
0

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

["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'(零)转换为'O'(大写O),'> <'等'X'等。我相信有库和/或转换引用的目的。非拉丁符号也是一个明显的可能性,应该加以考虑。

二。

我不认为你能够通过一次传递区分黑名单和类似外观的合法变体。所以是的,很可能你必须搜索可能的黑名单,然后检查你发现的是否与某些法律词语相符。这意味着您不仅需要列入黑名单的字典,还需要列入白名单的字典。更积极的一点是,可能不需要对白名单词典进行规范化处理,因为编写可接受文本的人可能会用可接受的语言编写而不需要上面列出的任何技巧。或者如果你感到偏执,你可以规范化。 :-)

三。

然而,问题是匹配单词/表达式对黑白名单实际上并没有给你一个可靠的答案。使用你的例子,一个人可能会把“大屁股”写成一个诚实的错字,这将在上下文中显而易见(反之亦然,写一个“大但有意”的名词来对抗白名单单词的更高匹配,即使上下文使得它相当明显的真正含义是什么)。所以你可能不得不实际检查上下文以防与黑名单和白名单有足够的匹配。这是我并不熟悉的领域。可以为各种词汇(来自两个词典)建立相关性映射,以确定哪些词汇经常与它们结合使用(或更少),并用它们来检查您的具体示例。以此段落为例,如果“黑名单”与“名单”一起使用,但在其他一些情况下列入黑名单,则可以列入白名单。

四,

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

五。

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

希望有所帮助。 :-)

+0

是的,我想通过机器学习会走的路,但我一直在摸索着想弄明白。我开始了一个关于交叉验证的问题,询问同一个问题,看起来它会很困难。 http://stats.stackexchange.com/questions/199311/clustering-a-database-of-strings-based-on-their-similarity-to-a-seperate-set-of/199423?noredirect=1#comment378505_199423 – GreenGodot