ipython Pandas: Как я могу сравнить разные строки одного столбца с метрикой расстояния Левенштейна?
У меня есть такая таблица:
id name
1 gfh
2 bob
3 boby
4 hgf
и т.п.
Мне интересно, как я могу использовать метрику Левенштейна для сравнения разных строк моего столбца "имя"?
Я уже знаю, что я могу использовать это для сравнения столбцов:
L.distance('Hello, Word!', 'Hallo, World!')
Но как насчет строк? Кто-нибудь может помочь?
2 ответа
Решение
Вот способ сделать это с пандами и numpy:
from numpy import triu, ones
t = """id name
1 gfh
2 bob
3 boby
4 hgf"""
df = pd.read_csv(pd.core.common.StringIO(t), sep='\s{1,}').set_index('id')
print df
name
id
1 gfh
2 bob
3 boby
4 hgf
Создайте фрейм данных со списком строк для измерения расстояния:
dfs = pd.DataFrame([df.name.tolist()] * df.shape[0], index=df.index, columns=df.index)
dfs = dfs.applymap(lambda x: list([x]))
print dfs
id 1 2 3 4
id
1 [gfh] [bob] [boby] [hgf]
2 [gfh] [bob] [boby] [hgf]
3 [gfh] [bob] [boby] [hgf]
4 [gfh] [bob] [boby] [hgf]
Смешайте списки, чтобы сформировать матрицу со всеми вариантами и сделать верхний правый угол как NaN:
dfd = dfs + dfs.T
dfd = dfd.mask(triu(ones(dfd.shape)).astype(bool))
print dfd
id 1 2 3 4
id
1 NaN NaN NaN NaN
2 [gfh, bob] NaN NaN NaN
3 [gfh, boby] [bob, boby] NaN NaN
4 [gfh, hgf] [bob, hgf] [boby, hgf] NaN
Мера L.distance
:
dfd.applymap(lambda x: L.distance(x[0], x[1]))
Возможно, сравнивая каждое значение одно с другим и сохраняя результаты всей комбинации.
Наивно закодировано, что-то вроде
input_data = ["gfh", "bob", "body", "hgf"]
data_len = len(input_data)
output_results = {}
for i in range(data_len):
word_1 = input_data[i]
for j in range(data_len):
if(j == i): #skip self comparison
continue
word_2 = input_data[j]
#compute your distance
output_results[(word_1, word_2)] = L.distance(word_1, word_2)
А потом делай что хочешь с output_results