比较两个列表

数据挖掘 Python 数据挖掘
2022-01-24 09:19:40

我有一个包含约 3000 万家公司的 SQL(MS SQL Server)数据库。例如:

+-----------------------+----------------+-----------+
|     company_name      |    country     | ID_number |
+-----------------------+----------------+-----------+
| Mercedes Benz Limited | Germany        |     12345 |
| Apple Corporation     | United States  |     67899 |
| Aunt Mary Butcher     | United Kingdom |     56789 |
+-----------------------+----------------+-----------+

然后,我有另一个公司列表,我想根据大致的公司名称匹配来分配 ID_number。

+--------------------+----------------+
|      company       |    country     |
+--------------------+----------------+
| Mercedes Benz Ltd. | Germany        |
| Apple Corp.        | United States  |
| Butcher Aunt Mary  | United Kingdom |
| Volkswagen Gmbh    | Germany        |
+--------------------+----------------+

我的目标显然是限制我必须进行的比较次数所以我通过以下方式处理它:

  1. 规范化名称 - 删除 Ltd. Corp. 等。
  2. 按国家过滤
  3. 按名称长度过滤(我假设长度非常不同的字符串不能非常相似)
  4. 按前 n 个字母过滤
  5. 计算与 Levenshtein 或 Jaccard 对所有过滤公司的相似度
  6. 选择最佳匹配

因此,对于Mercedes Benz我来说,我只会选择以 ME 开头且长度为Mercedes Benz+-7 个字母的德国公司。但是,Aunt Mary Butcher这不起作用,因为Butcher Aunt Mary它不是以 AU 开头的。

除了这种非常幼稚的方法之外,它也非常缓慢。我可以在上面放置更多硬件,但我认为该方法本身并不有效。你通常如何解决这样的问题?

3个回答

仅供参考,这并不是一个真正的数据科学问题,它与 SQL 更相关,应该在那些论坛上提问。但无论如何,我会尽力帮助你。这是您需要使用 MySQL 中的 SOUNDEX 之类的东西通过发音进行匹配的地方(我不知道其他提供此功能的 RDBMS)。

总的来说,这确实需要一种迭代方法,第一次通过直接匹配,下一次使用通配符匹配,然后下一次使用 SOUNDEX。从理论上讲,这应该让您手动完成很少(如果有的话)不匹配的项目。

行,

免责声明:我对 MS Sql 一无所知。

  • 像你说的那样清理名字
  • 将每个名称拆分为单词
  • 按字母顺序排列结果
  • 创建一个键,其中原始名称与其有序键相关联
  • 新创建的密钥也应该与国家相关联
  • 在两张桌子上都这样做
  • 您应该知道有一个通用键可以根据名称和国家/地区找到适当的 ID_number。

一个解决方案可以是,做你的过程,并提取不匹配的案例。然后,在他们的单词上拆分名字,并尝试通过 Jaccard 距离在他们的单词集上找到他们的距离。

总而言之,发现这些情况是例外,并尝试使用上述方法处理它们。