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

时间:2016-12-06 20:14:17

标签: python pandas fuzzywuzzy

目的

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

APPROACH

  1. 记录公司A和公司B的会计描述,将每个记录放入他们自己的数据框中(将公司A的会计描述指定为“approved_accts”)。使公司A的会计描述= approved_accts
  2. 使用python的fuzzywuzzy包,将公司B的会计描述与approved_accts进行比较。如果模糊模糊匹配高于某个阈值,则将“approve_accts”标签附加到公司B的会计描述(最好在相邻列中,以便公司B的原始描述不会丢失)。
  3. CODE

    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')
    

    输出

    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 issue。然而,就在昨天,这个实现正在与另一个例子合作。我想知道,这可能是什么原因?

    2. 对于每个帐户描述,都有一个唯一的ID(“帐号”)。有没有办法让我可以携带这个独特的身份证,以便公司B的“现金”账户(账户ID:B123)与公司A的核准清单“现金现金汇总”(账户ID:A321)相匹配,这样我就可以看到哪个帐号需要重新映射?从本质上讲,当我们比较每个公司的账户描述时,这些账号只是“沿途”,但是当我深入会计软件/ ERP系统时,这些账号将变得很有价值。

    3. 您是否建议使用其他库(而非blurwuzzy)来协助此过程?

2 个答案:

答案 0 :(得分:0)

RE 1:看起来像FuzzyWuzzy的process函数期望列表作为第二个参数,所以也许它将你的字符串解析为字符列表?见fuzzy wuzzy documentation。使用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选择并返回最接近的匹配是快速且相对容易的。

答案 1 :(得分:0)

您是否查看了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)]