【问题标题】:Fuzzymatcher returns NaN for best_match_scoreFuzzymatcher 为 best_match_score 返回 NaN
【发布时间】:2021-06-11 14:45:21
【问题描述】:

我在从 fuzzymatcher 库执行 fuzzy_left_join 时观察到奇怪的行为。尝试加入两个df,左边一个有5217条记录,右边一个有8734条记录,best_match_score的所有记录是71条记录,这看起来很奇怪。为了获得更好的结果,我什至删除了所有数字,只留下字母字符用于连接列。在合并表中,右表的 id 列是NaN,这也是一个奇怪的结果。

左表 - 加入“amazon_s3_name”的列。第一项 - limonig

+------+---------+-------+-----------+------------------------------------+
|  id  | product | price | category  |           amazon_s3_name           |
+------+---------+-------+-----------+------------------------------------+
|    1 | A       |  1.49 | fruits    | limonig                            |
| 8964 | B       |  1.39 | beverages | studencajfuzelimonilimonetatrevaml |
| 9659 | C       |  2.79 | beverages | studencajfuzelimonilimtreval       |
+------+---------+-------+-----------+------------------------------------+

右表 - 连接列“amazon_s3_name” - 最后一项 - limoni

+------+----------------------------------------------------------------------------------------------------------------------------+--------------------------------------------+
|  id  |                                                       picture                                                              |                    amazon_s3_name          |
+------+----------------------------------------------------------------------------------------------------------------------------+--------------------------------------------+
|  191 | https://s3.eu-central-1.amazonaws.com/groceries.pictures/images/AhmadCajLimonIDjindjifil20X2G.jpg                          | ahmadcajlimonidjindjifilxg                 |
|  192 | https://s3.eu-central-1.amazonaws.com/groceries.pictures/images/AhmadCajLimonIDjindjifil20X2G40g.jpg                       | ahmadcajlimonidjindjifilxgg                |
|  204 | https://s3.eu-central-1.amazonaws.com/groceries.pictures/images/Ahmadcajlimonidjindjifil20x2g40g00051265.jpg               | ahmadcajlimonidjindjifilxgg                |
| 1608 | https://s3.eu-central-1.amazonaws.com/groceries.pictures/images/Cajstudenfuzetealimonilimonovatreva15lpet.jpg              | cajstudenfuzetealimonilimonovatrevalpet    |
| 4689 | https://s3.eu-central-1.amazonaws.com/groceries.pictures/images/Lesieursalatensosslimonimaslinovomaslo.jpg                 | lesieursalatensosslimonimaslinovomaslo     |
| 4690 | https://s3.eu-central-1.amazonaws.com/groceries.pictures/images/Lesieursalatensosslimonimaslinovomaslo05l500ml01301150.jpg | lesieursalatensosslimonimaslinovomaslolml  |
| 4723 | https://s3.eu-central-1.amazonaws.com/groceries.pictures/images/Limoni.jpg                                                 | limoni                                     |
+------+----------------------------------------------------------------------------------------------------------------------------+--------------------------------------------+

合并表 - 正如我们在合并表中看到的 best_match_scoreNaN

+----+------------------+-----------+------------+-------+----------+----------------------+------------+---------------------+-------------+----------------------+
| id | best_match_score | __id_left | __id_right | price | category | amazon_s3_name_left  | image_left | amazon_s3_name_left | image_right | amazon_s3_name_right |
+----+------------------+-----------+------------+-------+----------+----------------------+------------+---------------------+-------------+----------------------+
|  0 | NaN              | 0_left    | None       |  1.49 | Fruits   | Limoni500g09700112   | NaN        | limonig             | NaN         | NaN                  |
|  2 | NaN              | 2_left    | None       |  1.69 | Bio      | Morkovi1kgbr09700132 | NaN        | morkovikgbr         | NaN         | NaN                  |
+----+------------------+-----------+------------+-------+----------+----------------------+------------+---------------------+-------------+----------------------+

【问题讨论】:

  • @RJAdriaansen,我添加了示例。
  • Fuzzymatcher 仅在有一些共同标记的情况下才真正起作用。在这种情况下,令牌将夹在/ 上,但它会尝试将limonigAhmadCajLimonIDjindjifil20X2G 匹配,因此将找不到任何东西。 RJ 的回答看起来很明智。或者,您需要以某种方式将网址拆分为更小的标记
  • @RobinL 为什么模糊匹配器会查找未指定为要合并的列的列?
  • 啊,我的错。我看错了专栏。相同的推理仍然适用 - 当fuzzyfinder 尝试查找潜在匹配时,它假定输入字符串可以被标记化并且至少有一个标记匹配。

标签: python python-3.x pandas fuzzy-search


【解决方案1】:

你可以试试polyfuzz。使用示例的设置,例如使用TF-IDFBert,然后运行:

model = PolyFuzz(matchers).match(df1["amazon_s3_name"].tolist(), df2["amazon_s3_name"].to_list())
df1['To'] = model.get_matches()['To']

然后合并:

df1.merge(df2, left_on='To', right_on='amazon_s3_name')

【讨论】:

  • 运行优化的解决方案,仍然没有结果,因为真的需要很多时间
  • 不幸的是,输出表不包含任何匹配的分数。在我的情况下,当我将 5217 条记录与 8734 条记录合并时,最终输出为 92401。没有办法选择最佳匹配。最重要的是,这个过程需要几个小时。
  • 你也可以试试polyfuzz。使用示例的设置,例如使用TF-IDFBert,然后运行model = PolyFuzz(matchers).match(df1["amazon_s3_name"].tolist(), df2["amazon_s3_name"].to_list())df1['To'] = model.get_matches()['To'],然后合并:df1.merge(df2, left_on='To', right_on='amazon_s3_name')
  • 这是一个很好的解决方案,谢谢。我认为你应该用这个解决方案改变你的主要答案,这样我才能接受它
猜你喜欢
  • 2017-08-12
  • 2017-05-10
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 2011-04-22
  • 2016-05-20
相关资源
最近更新 更多