繁体   English   中英

Python-使用Fuzzy Wuzzy进行字符串匹配(提取单个字母而不是单词)

[英]Python - String Matching using Fuzzy Wuzzy (extracting single letters as opposed to words)

目的

获取公司B的会计说明(例如“现金”),并将其与公司A的会计说明(例如“现金汇总”)相匹配。

方法

  1. 记录公司A和公司B的会计说明,将它们各自放入自己的数据框中(将公司A的会计说明分配为“ approved_accts”)。 使公司A的会计说明= approved_accts的帐户
  2. 使用python的Fuzzywuzzy软件包,将B公司的会计说明与approved_accts的accts进行比较。 如果模糊模糊匹配高于某个阈值,则将“ approve_accts”标签附加到公司B的会计说明中(最好在相邻列中,这样公司B的原始说明就不会丢失)。

import pandas as pd
from fuzzywuzzy import process
from fuzzywuzzy import fuzz

fileLoc = r'...\mapping.xlsx'
xls = pd.ExcelFile(fileLoc)

df_plp = xls.parse('PLP')
df_nbg = xls.parse('NBG')

df_plp.head(10)
#Confirmed the plp.head layout matches the excel file

df_nbg.head(10)
#Confirmed the nbg.head layout matches the excel file

#pull out the Account Descriptions for comparison
approved_accts = df_nbg['Account Description']
plp_accts = df_plp['Account Description']

#Test fuzzywuzzy
process.extract('Cash', 'Cash Cash Rollup')

OUTPUT

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. 在输出#1、2中-似乎FuzzyWuzzy正在分解每个字符以进行比较(这是不正确的)。 我在网上寻找并发现以下github问题 但是,就在昨天,该实现还在处理另一个示例。 我在想,这可能是什么原因?

  2. 对于每个帐户描述,都有一个唯一的ID(“帐户编号”)。 有什么办法可以使这个唯一的ID向前发送,以使公司B的“现金”帐户(帐户ID:B123)与公司A的批准列表“现金汇总”(帐户ID:A321)匹配,以便我可以看到哪个帐号需要重新映射吗? 本质上,当我们比较每个公司的帐户描述时,这些帐号只是“随身携带的”,但是当我深入到记帐软件/ ERP系统中时,这些帐号将变得很有价值。

  3. 您是否建议使用其他任何库(而不是Fuzzywuzzy)来帮助完成此过程?

RE 1:似乎FuzzyWuzzy的process函数希望将列表作为第二个参数,所以也许它将字符串解析为字符列表? 请参阅模糊的模糊文档 使用pandas series / df .unique()方法可能也很有意义,以避免必须处理可能的重复项。

RE 2:如果您有一个包含A和B列的表,以及另一个具有C和D列的表,并且有一个从A到C的映射(例如,从模糊字符串匹配中),则可以通过加入来获得一个从B到D的映射A和C上的两个数据帧,然后查找B和D的所有唯一对。类似这样的东西: joined_df[['B', 'D']].unique()

RE 3:我个人使用FuzzyWuzzy在模糊字符串匹配中连接两个单独的数据帧,并且没有编写自己的库来完成相同的任务,我认为这可能是最好的方法。 定义一个采用系列并使用FuzzyWuzzy的ExtractOne选择并返回最接近的匹配的函数是快速且相对容易的。

您是否检查了process.extract https://github.com/seatgeek/fuzzywuzzy/blob/master/fuzzywuzzy/process.py#L132的文档

您需要传递可迭代的内容(列表或字典)

下面的作品:

process.extract('Cash', 'Cash Cash Rollup'.split(' '))

[('Cash',100),('Cash',100),('Rollup',0)]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM