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

Другие вопросы по тегам