Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将fuzzyfuzzy应用于具有许多名称的文档_Python_Pandas_Nlp_Levenshtein Distance_Fuzzywuzzy - Fatal编程技术网

Python 将fuzzyfuzzy应用于具有许多名称的文档

Python 将fuzzyfuzzy应用于具有许多名称的文档,python,pandas,nlp,levenshtein-distance,fuzzywuzzy,Python,Pandas,Nlp,Levenshtein Distance,Fuzzywuzzy,我有一个df,看起来像这样: Name |Address | State | Phone | Website -------------------------------------------------------- agua calienta |etc etc etc agua caliente | blue lake | blue lake club | artichoke | ar

我有一个df,看起来像这样:

Name                |Address | State | Phone | Website
--------------------------------------------------------
agua calienta       |etc etc etc
agua caliente       |
blue lake           |
blue lake club      |
artichoke           |
artichoke club      |
creek club          |
cahuilla creek      |
cahuilla crek resort|
taj club            |
taj mahal           |
taj mahal club hotel|
df['Name'] = df['Name'].map(lambda x: replace_name(x))
等等。
该名称为度假村/酒店名称,但数据中有许多拼写错误和名称变体。 使用Levensteins距离和
fuzzyfuzzy
包,我可以得到所有类似的名字

choices = df['Name'].unique()

def get_ratio(row):
    name = row['Name']
    return fuzz.token_sort_ratio(name, 'agua caliente')

df[df.apply(get_ratio, axis = 1) > 60]
然后我可以通过使用

df.loc[df.apply(get_ratio, axis=1) > 75, "Name"] = "Agua Caliente"
但是,这只适用于我使用的1名称

是否有办法将此应用于所有相似的名称?
例如,申请后,我会得到如下结果:

Name                |Address | State | Phone | Website
--------------------------------------------------------
Agua Caliente       |etc etc etc
Agua Caliente       |
Blue Lake Club      |
Blue Lake Club      |
Artichoke Club      |
Artichoke Club      |
Creek Club          |
Cahuilla Resort     |
Cahuilla Resort     |
Taj Mahal           |
Taj Mahal           |
Taj Mahal           |

我有一份所有可能的名字的参考清单。如何循环并应用get_ratio函数遍历列表并返回列表中所有相似的名称?

您需要一个完整的正确名称列表

taj club            
taj mahal           
taj mahal club hotel
您需要一个具有正确名称的引用表(或规则列表)。在上面的示例中,参考表字段需要是
Taj Mahal
,而不是
Taj club
Taj Mahal club hotel

基于此,您将使用您提到的方法,即
模糊模糊
和Levenshtein距离。不幸的是,如果不知道正确的引用(“泰姬陵”,在本例中),就没有确切的方法应用函数来猜测正确的引用。这是您需要采取的基于规则的方法

附加的

根据注释,您需要创建一个函数,将其与参考表进行比较,获得分数,然后返回正确城市的名称

例如:

def replace_name(name_of_city: str):
    #
    # Extra code to look up your reference table
    # and find the correct city name (with the lowest or highest
    # score) depending on your methodology

    return name_of_correct_city
然后将此函数映射到数据帧中的整个
Name
列,如下所示:

Name                |Address | State | Phone | Website
--------------------------------------------------------
agua calienta       |etc etc etc
agua caliente       |
blue lake           |
blue lake club      |
artichoke           |
artichoke club      |
creek club          |
cahuilla creek      |
cahuilla crek resort|
taj club            |
taj mahal           |
taj mahal club hotel|
df['Name'] = df['Name'].map(lambda x: replace_name(x))

我希望这会有所帮助。

我可以创建一个参考表,我的问题是,我是否可以将该函数同时应用于所有内容,因此它不必单独返回每个名称,而是返回参考列表中所有相似的名称。例如,对于泰姬陵,它会归还所有与之类似的东西,然后清洗并更换。我将编辑我的问题,使其更详细clear@Dasax121谢谢你把问题说得更清楚。我假设您没有参考表,因为它没有被提及。我将编辑我的答案。简言之,一旦有了一个包含所有规则的函数,就可以在数据框中的列上使用
map
函数,并将其应用于整个列。@Dasax121:我编辑了我的答案来回答您的问题。如果这能让事情更清楚,请告诉我。