【问题标题】:Fuzzy matching with pyspark or python用 pyspark 或 python 进行模糊匹配
【发布时间】:2020-07-07 20:32:12
【问题描述】:

我正在尝试使用 pyspark 或 python 进行模糊匹配,我有 2 个列表。

我。城市标准值列表

Clarksburg 
Fremont 
San Leandro 
Albuquerque 
Columbus 
San Jose 
Martinez 
New York
Alhambra
Unknown
Las Vegas
Dublin
Niagara Falls

二。拼写错误的城市名称列表

Clarksburg 
Closed 10/97
Fre,Nont
Fremong
San L:Eandro
Albuquerue
Clmbs
Sanjse
Martinz
New Yrk
Alambra
00011
L Vegas
Vegas
Ssan jose
Nw Yrk
Colmbus
Klarkburg
Alburque
Dublin
Niegara F

现在我想将拼写错误的城市名称与标准值列表进行匹配,并创建另一个具有适当匹配的列表。我正在寻找下面的输出

Clarksburg - Clarksburg
Closed 10/97 - Unknown
Fre,Nont - Fremont
Fremong - Fremont
San L:Eandro - San Leandro
Albuquerue - Albuquerque
Clmbs -Columbus
Sanjse - San Jose
Martinz - Martinez
New Yrk - New York
Alambra - Alhambra
00011 - Unknown
L Vegas - Las Vegas
Vegas - Las Vegas
Ssan jose - San Jose
Nw Yrk - New York
Colmbus - Columbus
Klarkburg - Clarksburg
Alburque - Albuquerque
Dublin - Dublin
Niegara F - Niagara Falls

任何帮助都会对我有所帮助。提前致谢。

【问题讨论】:

    标签: python apache-spark pyspark string-matching fuzzywuzzy


    【解决方案1】:

    使用fuzzywuzzy,并更改threshold以满足您的要求:

    from fuzzywuzzy import process
    
    threshold = 40
    
    matchlist = [x for x in """
    Clarksburg
    Fremont
    San Leandro
    Albuquerque
    Columbus
    San Jose
    Martinez
    New York
    Alhambra
    Unknown
    Las Vegas
    Dublin
    Niagara Falls
    """.splitlines() if x]
    
    checklist = [x for x in """
    Clarksburg
    Closed 10/97
    Fre,Nont
    Fremong
    San L:Eandro
    Albuquerue
    Clmbs
    Sanjse
    Martinz
    New Yrk
    Alambra
    00011
    L Vegas
    Vegas
    Ssan jose
    Nw Yrk
    Colmbus
    Klarkburg
    Alburque
    Dublin
    Niegara F
    """.splitlines() if x]
    
    for check in checklist:
        match = process.extractOne(check, matchlist)
        print(f"{check} - {match[0] if match[1] > threshold else 'Unknown'}")
    

    这给了我:

    Clarksburg - Clarksburg
    Closed 10/97 - Unknown
    Fre,Nont - Fremont
    Fremong - Fremont
    San L:Eandro - San Leandro
    Albuquerue - Albuquerque
    Clmbs - Columbus
    Sanjse - San Jose
    Martinz - Martinez
    New Yrk - New York
    Alambra - Alhambra
    00011 - Unknown
    L Vegas - Las Vegas
    Vegas - Las Vegas
    Ssan jose - San Jose
    Nw Yrk - New York
    Colmbus - Columbus
    Klarkburg - Clarksburg
    Alburque - Albuquerque
    Dublin - Dublin
    Niegara F - Niagara Falls
    

    【讨论】:

    • 如何设置阈值?在我们的例子中,为什么我们将它设置为 40?
    • @DeepakSanagapalli 根据匹配的置信度,该值介于 0 和 100 之间。我将其设置为 40,因为 Closed 10/97 匹配 Columbus 的置信度为 34 :-)
    • 感谢@MikeOrganek,希望它能满足我的要求。你能帮我在每个结果旁边显示比赛分数吗?
    • @DeepakSanagapalli 用这个代替现有的print():print(f"{check} - {match[0] if match[1] > 0 else 'Unknown'} {match[1]}")
    • 我们可以使用 csv 或 txt 文件代替 list 来作为 matchlist 和 checklist 吗?如果是这样,会有什么变化?
    猜你喜欢
    • 2014-07-16
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多