Python 将fuzzyfuzzy应用于具有许多名称的文档
我有一个df,看起来像这样: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
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:我编辑了我的答案来回答您的问题。如果这能让事情更清楚,请告诉我。