用于规范分类术语的准确算法?

时间:2010-09-14 13:54:07

标签: string taxonomy string-matching faceted-search

我正在开发一个购物比较网站,该项目处于非常高级的阶段。我们每天使用来自各种联盟网络的商家信息索引5000万种产品。我遇到的大多数问题已经解决,包括大多数性能瓶颈。

我的问题是什么:首先,我们正在使用apache solr和drupal但是这个问题并不是特定于drupal或solr,如果你不了解它们,那没关系。

我们收到来自2000多个不同商家的产品供稿,这些供稿很乱。他们没有特定的模式,每个商家都按照他们想要的方式发送Feed。我们已经解决了很多这方面的问题,但仍有一个问题。规范化分面浏览功能的分类术语。

假设我的网站上有一个“Narrow by Brands”浏览方面。现在假设有100家商家提供微软的产品。现在出现了问题。有些商家在数据提要“微软”的“品牌”专栏,其他“微软公司”,其他“微软公司”,其他“微软产品”等等......商家和最差商家之间没有特定的模式,一些个体商家如此草率,以至于同一品牌在相同的数据馈送中有不同的字符串。

我们不希望所有这些不同的品牌出现在导航中。我们有一个手动解决问题的方法,我们手动将导入的品牌映射到“好”品牌表(“Microsoft Corporation” - >“Microsoft”,“Microsoft的产品” - >“Microsoft”等。) 。我们在数据库中拥有10,000个品牌,这是可行的。问题在于它带有像“作者”这样的更大的东西。当我们将书籍导入系统时,有超过800,000位作者,我们遇到了同样的问题,这是手工制作无法实现的。问题是一样的:“Tom Mike Apostol”,“Tom M. Apostol”,“Apostol,Tom M.”等......

有没有人知道以可接受的准确度(85%-95%准确度)自动解决此问题的好方法?

谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

我想到了一些想法,尽管这只是一个松散的想法:

  1. 将名称转换为姓名缩写(在您的示例中为:TMA)。将' - '视为空格,所以fe。 Antoine de Saint-Exupéry将是ADSE。这里的问题是如何对待“,”,尽管如此,它常见的用法是在forename之前使用姓氏,所以只需交换位置就行了(所以A,TM就是TM,A,摆脱逗号 - TMA)。
  2. 按照首字母缩写数据库中的作者
  3. 对于每个初始,如果您有全名(Tom,Apostol),请检查它是否匹配,否则(M.)会自动将其视为匹配。
  4. 如果您想要一些容差,可以将名称与Levenshtein距离进行比较,并容忍一些差异(here您实施Oracle)
  5. 与您视为相同作者的名称,找到整个名称,为您查找过滤作者的每个首字母(T,M,A)(在步骤2之后)并尝试找到一个不仅仅是首字母的名称(M 。)但是全名(Mike),如果你找不到,请使用initial。因此,您提供的每个示例都将转换为相同的值,即全名(Tom Mike Apostol)。
  6. 值得思考的事情:
    包含名称同义词的映射(最有可能是数百个记录,例如Thomas< - > Tom
    这种方式对于获得有效的首字母很重要(没有M而不是N等)。

    编辑:我前段时间编写了这样的东西,当我不得不通过它的签名识别一个人,忽略扫描问题时,人们有时会通过名字S.姓氏或N.S.或者仅仅通过姓氏姓氏(这可能是你应该在解决方案中考虑的另一件事,允许算法忽略第二个名字,尽管在你的情况下,我猜想会忽略某人的第二个名字)。