Нечеткое сопоставление внутри столбца

#python #pandas #fuzzy #fuzzywuzzy

#python #панды #нечеткое #fuzzywuzzy

Вопрос:

Предположим, у меня есть список видов спорта, подобных этому :

 sports=["futball","fitbal","football","tennis","tenis","tenisse","footbal","zennis","ping-pong"]
  

Я хотел бы создать фрейм данных, который соответствует каждому элементу sport с его ближайшим значением, если нечеткое сопоставление превышает 0,5, и если оно не просто сопоставляет его с самим собой. (Для этого я хочу использовать функцию fuzzywuzzy.fuzz.ratio (x, y))

Результат должен выглядеть так :

 pd.DataFrame({"sport":sports,"closest_match":["futball","futball","football","tennis","tennis","tennis","futball","tennis","ping-pong"]})

    sport   closest_match
0   futball futball
1   fitbal  futball
2   football football
3   tennis  tennis
4   tenis   tennis
5   tenisse tennis
6   footbal futball
7   zennis  tennis
8   ping-pong ping-pong
  

Спасибо

Ответ №1:

вот решение с использованием itertools.combinations:

 from fuzzywuzzy import fuzz
import pandas as pd
sports = ["futball", "fitbal", "football", "tennis", "tenis", "tenisse", "footbal", "zennis", "ping-pong"]
dist = ([x for x in itertools.combinations(sports, 2) if fuzz.ratio(*x) > 50])

df = pd.DataFrame(dist, columns=["sport","closest"])
df['ratio'] = dist = ([fuzz.ratio(*x) for x in itertools.combinations(sports, 2) if fuzz.ratio(*x) > 50])
print(df)

df = df.groupby(['sport'])[['closest','ratio']].agg('max').reset_index()
  

вывод:

       sport   closest  ratio
0    fitbal  football     77
1  football   footbal     93
2   futball  football     80
3     tenis    zennis     83
4   tenisse    zennis     62
5    tennis    zennis     91
  

Комментарии:

1. Спасибо! однако я хотел бы иметь только одну модальность, это похоже на задачу кластеризации…

2. что вы подразумеваете под только одной модальностью?

3. 1 модальность для футбола, например, 1 для тенниса, 1 для пинг-понга. Здесь есть zennis, tenisse, tenis и т. Д

4. лучший результат?

5. ммм, да, я думаю, что это хорошая идея, поэтому она уменьшает количество модальностей