问题标签 [fuzzywuzzy]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 包含 Pandas 中的函数
我正在两个数据框的公司名称之间执行匹配(一种模糊匹配)。为此,首先我在所有公司名称之间执行完全合并,其中起始字母匹配。这意味着所有以“A”开头的公司都将与其他数据框中以“A”开头的所有公司匹配。这是按如下方式完成的:
现在我想拥有来自 FullMerge 的所有行,其中 df1 中的公司包含 df2 中的公司。这是因为 df1 中的公司名称已拉长。
这对我不起作用。如何执行此任务?另外,请建议我可以使用哪些其他方式来匹配公司名称。因为公司可能在两个数据框中是相同的,但不是以完全相同的方式编写的。
python - 2列之间的模糊匹配(Python)
我有一个名为“df_combo”的熊猫数据框,其中包含“worker_id”、“url_entrance”、“company_name”列。我正在尝试生成一个输出列,它会告诉我“url_entrance”列中的 URL 是否包含“company_name”列中的任何单词。即使是像fuzzywuzzy这样的近距离匹配也可以。
例如,如果 URL 是“www.grandhotelseattle.com”,而“company_name”是“Hotel Prestige Seattle”,那么模糊率可能在 70-80 之间。
我尝试了以下脚本: >>>fuzz.ratio(df_combo['url_entrance'],df_combo['company_name']) 但它只返回 1 个数字,这是整个列的整体模糊率。我想为每一行设置模糊比率并将这些比率存储在一个新列中。
python - 为什么对于完全相同的字符串,fuzzy.ratio 不是 100?
我有两个数据框 df1 和 df2。两个数据帧都有一个带有电影名称的列。我正在尝试将 df1 中的 movie_name1 与 df2 中的 movie_name2 匹配。movie_name1 具有诸如 The Dark Knight Rises、Spider-Man 3 之类的值。movie_name2 具有诸如 The Dark Knight Rises 、 Spider-Man 3 之类的值。
我们看到movie_name1 中所有电影的末尾都有一个额外的字母。所以在匹配之前,我删除了帽子多余的字母,剥离了空间,然后计算了 fuzz.ratio。
这就是我执行操作的方式 -
样本数据:
样本结果:
即使我在计算 fuzz.ratio 之前执行上述操作,完全相同的字符串的 fuzz.ratio 值仍然不是 100。
我的分析表明,两个电影名称之间总是存在长度 2 的差异。例如:movie_name1 中“127 小时”的长度为 11,而 movie_name2 中同一部电影的长度为 9。所有电影都发生这种情况。
为什么会这样?是因为那个字母“A”吗?我能做些什么来摆脱这个问题?
python - 两个 DataFrame 之间的慢模糊匹配
我有df_cam
带有 cli id 和来源的 DataFrame A ( ):
df_dict
和带有快捷方式和活动的DataFrame B ( )
我知道,例如,具有来源1234 M-MKT XYZklm 05/2016
的客户实际上来自活动Mobile Marketing Outbound
,因为它包含关键字M-MKT
。
请注意,快捷方式是一个通用关键字,取决于算法应该决定的内容。原点也可以M-Marketing
是MMKT
或Mob-MKT
。我首先通过分析所有来源手动创建了快捷方式列表。我还使用正则表达式origin
在将其提取到程序之前对其进行清理。
我想通过快捷方式将客户来源与活动匹配并附加分数以查看差异。如下图所示:
下面是我的程序,它可以工作,但真的很慢。DataFrame A 有 ~400.000 行,另一个 DataFrame B 有 ~40 行。
有没有办法让它更快?
请注意,我还想计算第二和第三最佳匹配来评估准确性。
编辑
我找到process.ExtractOne
了方法,但速度保持不变。所以我的代码现在看起来像这样:
python - Python - 使用 Fuzzy Wuzzy 进行字符串匹配(提取单个字母而不是单词)
客观的
将公司 B 的会计说明(例如“现金”)与公司 A 的会计说明(例如“现金汇总”)相匹配。
方法
- 记录公司 A 和公司 B 的会计说明,将它们放入各自的数据框中(将公司 A 的会计说明指定为“approved_accts”)。制作 A 公司的会计说明 =
approved_accts
- 使用python的fuzzywuzzy包,比较公司B的会计描述和
approved_accts
. 如果模糊模糊匹配高于某个阈值,则将“approve_accts”标签附加到公司 B 的会计说明(最好在相邻列中,以免公司 B 的原始说明丢失)。
代码
输出
process.extract('Cash', 'Cash Cash Rollup')
[('C', 90), ('a', 90), ('s', 90), ('h', 90), ('C', 90)]
process.extractOne('Cash', 'Cash Cash Rollup')
('C',90)
fuzz.token_set_ratio('Cash', 'Cash Cash Rollup')
100
问题
在输出 #1、2 中 - FuzzyWuzzy 似乎正在分解每个单独的字符以进行比较(这是不正确的)。我在网上查看并发现以下github 问题。然而,就在昨天,这个实现正在使用另一个示例。我想知道,这可能是什么原因?
对于每个帐户描述,都有一个唯一的 ID(“帐户号”)。有没有办法我可以携带这个唯一的 ID,以便 B 公司的“现金”账户(账户 ID:B123)与 A 公司的批准列表“现金现金汇总”(账户 ID:A321)相匹配,这样我就可以看到哪个帐号需要重新映射吗?从本质上讲,当我们比较每家公司的账户描述时,这些帐号只是“顺路”,但当我深入研究会计软件/ERP 系统时,它们就会变得有价值。
您是否推荐使用任何其他库(而不是fuzzywuzzy)来协助该过程?
python - pythonfuzzywuzzy 的 process.extract():它是如何工作的?
我想了解python模块fuzzywuzzy的函数process.extract()是如何工作的?
我主要在这里阅读了有关fuzzywuzzy 包的信息:http://chairnerd.seatgeek.com/fuzzywuzzy-fuzzy-string-matching-in-python/ ,这是一篇很好的文章,解释了尝试进行模糊匹配时的不同场景。他们讨论了部分字符串相似性的几种场景:
1) 乱序
2) 令牌排序
3) 令牌集
然后,从这篇文章:https ://pathindependence.wordpress.com/2015/10/31/tutorial-fuzzywuzzy-string-matching-in-python-improving-merge-accuracy-across-data-products-and-naming -conventions/我学会了如何使用fuzzywuzzy 的process.extract() 函数来基本上选择前k 个匹配项。
我找不到太多关于 process.extract() 函数如何工作的信息。这是我在他们的 GitHub 页面(https://github.com/seatgeek/fuzzywuzzy/blob/master/fuzzywuzzy/process.py)上找到的定义/信息,这个函数:
在选择列表或字典中查找最佳匹配项,返回包含匹配项的元组列表及其分数。如果使用字典,则还返回每个匹配项的键。
但是,它没有提供有关如何找到最佳的详细信息?是否需要我上面提到的所有 3 个场景才能找到这个?
之所以这么问,是因为我在使用这个函数的时候,有时候会出现两个非常相似但不匹配的字符串。
例如在我当前的样本数据集中,对于待匹配字符串
“总补货提前期(工作日)”
它匹配到
“PLANNING_TIME_FENCE_CODE”、“BUILD_IN_WIP_FLAG”
但不是(正确答案)
“FULL_LEAD_TIME”
即使正确答案与待匹配字符串一样具有“提前期”,但它根本不匹配待匹配字符串。为什么?不知何故,其他看起来不像待匹配字符串的字符串会被匹配。为什么?我现在很无知。
python - 运行fuzzywuzzy/fuzz.py 时出错
我有一个程序使用fuzzywuzzy来匹配csvs 并查找任何可能重复或非常相似的字符串。当我比较我的两个文件时,fuzzywuzzy会引发以下错误:
任何人都知道是什么导致该错误出现?
python - FuzzyWuzzy - 遍历列表,匹配接受的值,并返回一个数据帧
客观的
- 给定一个 excel 文件(充满拼写错误),使用 FuzzyWuzzy 将拼写错误与
accepted
列表进行比较和匹配。 accepted
用最接近的匹配更正错字填充的 excel 文件。
方法
- 使用熊猫导入 Excel 文件
- 将原始的、错字填充的 excel 文件推送到数据框中
- 创建
accepted
数据框 accepted
使用FuzzyWuzzy比较错字数据框和数据框- 返回原始拼写、接受的拼写和匹配分数
- 将关联的、可接受的拼写附加到所有拼写的原始 excel 文件/行
代码
('Acquisition Fees', 38) 分数不高,但足够高,可以返回预期的输出
!!!!!问题!!!!!
('费用', ('法律费用', 47))
问题
- 如您所见,process.extractOne 在逐个测试时运行正确。但是,在循环中运行时,返回值是意外的。我相信我可能会抓住第一列或最后一列,但即使是这样,我也希望“董事费”或“收购”会弹出(参见原始 excel 文件)。
python - Searching one Python dataframe / dictionary for fuzzy matches in another dataframe
I have the following pandas dataframe with 50,000 unique rows and 20 columns (included is a snippet of the relevant columns):
df1:
I also have the following dataframe (which I also have saved in dictionary form) which has 2 columns and 20,000 unique rows:
df2 (also saved as dict_2)
What I am wanting to do is compare the "PRODUCT_DESCRIPTION" field in df1 to the the "PROD_DESCRIPTION" field in df2 and find the closest match/matches to help with the heavy lifting part. I would then need to manually check the matches but it would be a lot quicker The ideal outcome would look like this, e.g. with one or more part matches noted:
I have already completed a join which has identified the exact matches. It's not important that the index is retained as the Product ID's in each df are unique. The results can also be saved into a new dataframe as this will then be applied to a third dataframe that has around 14 million rows.
I've used the following questions and answers (amongst others):
Is it possible to do fuzzy match merge with python pandas
Fuzzy merge match with duplicates including trying jellyfish module as suggested in one of the answers
Python fuzzy matching fuzzywuzzy keep only the best match
Fuzzy match items in a column of an array
and also various loops/functions/mapping etc. but have had no success, either getting the first "fuzzy match" which has a low score or no matches being detected.
I like the idea of a matching/distance score column being generated as per here as it would then allow me to speed up the manual checking process.
I'm using Python 2.7, pandas and have fuzzywuzzy installed.
python - “以下软件包将被更高优先级的频道取代”是什么意思?
我正在尝试将fuzzywuzzy 安装到我的64 位Linux 中的Anaconda 发行版中。当我这样做时,它会尝试将我的conda
, 和更改conda-env
为conda-forge
频道。如下:
我通过以下方式在 anaconda 中搜索模糊 wuzzy:
这表明在 64 位 Linux 上可用于 anaconda 的最新版本是频道上提供的 0.13 conda-forge
。
要安装,在命令行中,我输入:
我得到以下输出:
我不明白这是在告诉我什么。
这是什么意思?我是否认为这正在改变我的默认包管理器频道?如果我继续安装它可以逆转吗?有什么方法可以在不更改默认频道的情况下完成安装?或者是我应该做的有利于取代频道的事情?
我不想仅仅为一个模块改变我的发行版,或者引起更多的麻烦。
这个问题:https ://github.com/conda/conda/issues/2898听起来像是在告诉我我应该让它发生。做什么?
(我正在使用 anaconda 版本:4.2.13 和 Python 2.7.12)