合并列表中的重复项? - 问题比看起来更复杂

时间:2010-01-21 15:10:51

标签: python mysql django sqlalchemy django-orm

所以我在数据库中有一个巨大的条目列表( MySql

我在创建网络应用程序时使用 Python Django

这是我正在使用的基本Django模型:

class DJ(models.Model):
    alias = models.CharField(max_length=255)
    #other fields...

在我的数据库中我现在重复

  

例如。 以上&超越超越超越 DJ超越,           Disk Jokey超越,...

这是一个问题......因为它在我的数据库和我的应用程序中造成了一个大漏洞。


我确信其他人遇到过这个问题并考虑过它。

我的想法如下:

  • 创建一组规则,以便无法创建新条目?

      

    例如。 “DJ高于和超越”不可能   因为“高于和超越”而创建   数据库

  • 以某种方式将这些别名相互关联?

      

    例如。将“DJ高于和超越”“超越和超越”

    联系起来

我几乎不知道如何继续这样做,即使有人可以指出我的方向非常有帮助。

非常感谢任何帮助!谢谢你们。

9 个答案:

答案 0 :(得分:4)

我想你可以根据Levenshtein distance做一些事情,但没有真正的方法可以自动完成这项工作 - 而无需创建一个相当复杂的基于规则的系统。

除非您可以定义可以为任何xy设置的规则系统,x是否与y重复,否则您将不得不以模糊的,人性化的方式处理这个问题。

Stack Overflow有一个相当不错的处理方法 - 警告用户,如果可能是基于Levenshtein距离(可能是某种规则引擎)之类的东西重复,然后允许如果其他用户忽略警告,则用户的一部分将事物合并为重复项。

答案 1 :(得分:3)

从您给出的示例中,您发现自然语言问题比完全匹配问题更多。鉴于自然语言匹配本质上是不精确的,你不太可能想出一个完美的解决方案。

  • 字符串距离并不真正起作用,因为算法上接近的字符串可能在语义上不接近(例如“DJ Above& Beyond”应该匹配“Above and Beyond”而不是“DJ Above& Beyond 2”,这是在Levenshtein距离更近。
  • 自然语言解析的一些便宜的替代方法是soundex,它将通过语音来匹配,而Stemming则删除前缀/后缀以对词干进行规范化。我想你可以创建一个词根的链表,但这也不是非常准确。
  • 如果这是一个用户交互程序,您可以向用户回应“近乎未命中”,例如“这是你打算进入的其中一个吗?”
  • 您可以通过某种方式对条目进行标准化,以便不同的条目映射到相同的标准化值(例如,case normalize,“&” - >“And”等等,其中一些上述建议可能是(步骤)找到几乎未命中或将多个输入映射到单个值。

添加我的经验仅适用于英语的警告,例如:一个英国人PorterStemmer不会认出你放在那里的一个法国头衔。

答案 2 :(得分:2)

我认为这更像是一个社会问题,而不是一个编程问题。任何类型的自然语言处理的程序化解决方案都会出错并且容易出错。很难区分那些接近但与你所谈论的那种不受欢迎的副本完全不同的东西。

正如Dominic所说,Stack Overflow的标记系统是一个非常好的模型。它为用户提供了一些提示,鼓励他们在适当时使用现有标签(下拉列表作为用户类型),它允许可信用户重复个人问题,并允许主持人进行大规模重拍。

这实际上是一个必须让一个人直接参与的过程。

答案 3 :(得分:1)

这不是一个完整的解决方案,但有人认为我有:

class DJ(models.Model):
    #other fields, no alias!

class DJAlias(models.Model):
    dj = models.ForeignKey(DJ)

这将允许您为同一个dj拥有多个别名。

但是你仍然需要找到一种正确的方法来确保将别名添加到正确的dj中。请参阅Dominics帖子。

但是如果你检查指向一个dj的其他几个别名的别名,算法可能会更好。

答案 4 :(得分:1)

您可以尝试仅针对此实例解决此问题(将“&”替换为“&”,将“DJ”替换为“Disk jokey”或忽略“DJ”等)。如果您的桌子只包含DJ,您可以设置一系列规则。 如果你的表包含更多不同的东西,你将不得不采用更加结构化的方法。你能给出一个数据集样本吗?

答案 5 :(得分:1)

首先,当然编程任务(如上所述的NLP等)很有趣。但正如所提到的那样,过度杀伤是为了完善它。

但另一种观点如前所述(“社交”),谁输入数据,谁查看它,它应该多长时间和多么正确?所以这是一个命名约定问题,并让我想起了伟大的项目musicbrainz.org - 如果你的网站“正常工作”或者你更喜欢遵循标准,在后一种情况下我将自己定位于mb项目 - 如果你没有'做到了,没有听说过。 即。在这里看到 Above&超越:他们定义了别名,他们使用它来匹配用户搜索。 http://musicbrainz.org/show/artist/aliases.html?artistid=58438 查看wiki中的Artist_Alias页面。

数据模型值得一看,甚至还有几个API绑定来同步数据,也是在python中。

答案 6 :(得分:1)

如何更改模型,使“别名”成为其他表格的键列表(跳过“the”,“and”等小字): 1 =>以上; 2 =>超越; 3 =>盘; 4 =>诙谐;

然后,当您想要插入新记录时,只需检查标题中已有多少重要单词已存在于表中并匹配当前现有的模型实体。如果超过50%(例如)你可能有巧合,你可以向访问者显示它们的列表并询问“你的意思是这一部分”。

答案 7 :(得分:0)

看起来fuzzywuzzy完全符合您的需求。

This article解释了它的设置原因,它非常符合你的要求 - 基本上,处理两种不同的东西命名略有不同的情况:

  

我们最令人沮丧的问题之一就是试图弄清楚两张门票是否属于同一个真实事件(也就是说,没有得到我们实习生团队的帮助)。   ...
  为实现这一目标,我们建立了一个“模糊”字符串匹配例程库,以帮助我们。

答案 8 :(得分:0)

如果你只是在艺术家名字或一般媒体相关的名字之后,那么使用last.fm或echonest的API可能会好得多,因为他们已经拥有庞大的规则集和庞大的数据库。