2

我正在开发一个购物比较网站,该项目处于非常先进的阶段。我们每天使用来自各种联盟网络的商家源为 5000 万种产品编制索引。我遇到的大部分问题都已经解决了,包括大部分性能瓶颈。

我的问题是什么:首先,我们将 apache solr 与 drupal 一起使用,但是,这个问题并不特定于 drupal 或 solr,如果您不了解它们,也没关系。

我们收到来自 2000 多个不同商家的产品信息,这些信息一团糟。他们没有特定的模式,每个商家都以他们想要的方式发送提要。我们已经解决了许多与此相关的问题,但仍然存在一个问题。规范化分面浏览功能的分类术语。

假设我的网站上有“Narrow by Brands”浏览方面。现在假设有 100 个商家提供 Microsoft 的产品。现在问题来了。一些商家在数据馈送的“品牌”列中放入“Microsoft”,另一些为“Microsoft, Inc.”,另一些为“Microsoft Corporation”,另一些为“Products from Microsoft”,等等……商家和最坏的情况之间没有特定的模式,有些个体商家太马虎了,在同一个数据源中对同一个品牌有不同的字符串。

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

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

谢谢你的帮助!

4

1 回答 1

0

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

  1. 将名称转换为首字母缩写(在您的示例中:TMA)。将“-”视为空格,所以 fe。Antoine de Saint-Exupéry 将成为 ADSE。这里的问题是如何处理“,”,虽然,通常的用法是在名字之前有姓氏,所以只需交换位置就可以了(所以 A,TM 将是 TM,A,去掉逗号 - TMA)。
  2. 按这些首字母筛选数据库中的作者
  3. 对于每个首字母,如果您有全名 (Tom, Apostol),请检查它是否匹配,否则 (M.) 会自动将其视为匹配。
  4. 如果您想要一些容忍度,您可以将名称与 Levenshtein 距离进行比较并容忍一些差异(这里有 Oracle 实现)
  5. 与您匹配的姓名视为相同的作者,要查找全名,对于每个首字母(T,M,A),您查找过滤的作者(在第 2 步之后)并尝试找到一个没有首字母(M.)但带有全名 (Mike),如果找不到,请使用首字母。因此,您提供的每个示例都将转换为相同的值,即全名 (Tom Mike Apostol)。

值得考虑的事情:
包括名称同义词的映射(可能最多有数百条记录,例如 Thomas <-> Tom
这种方式对于具有有效的首字母至关重要(没有 M 而不是 N 等)。

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

于 2010-09-14T14:21:22.300 回答