Python: эффективный способ найти расстояние редактирования Левенштейна в матрице - PullRequest
0 голосов
/ 21 января 2019

Я хотел бы выявить сходство между двумя списками, после чего я хочу выполнить кластеризацию описаний.

          L2D1    L2D2     L2D2 .........L2Dn
  L1D1     0       0.3     0.8............0.5  
  L1D2     0.2     0.7     0.3............0.2
  L1D3     0       0.3     0.8............0.5   
  .        .        .       .              .
  .        .        .       .              .   
  .        .        .       .              .
  L1Dn    0.6      0.1     0.9............0.4           

from Levenshtein import distance
List1 = list(new['Description'])
List2 = list(clean['Description'])

Matrix = np.zeros((len(List1),len(List2)),dtype=np.int)

for i in range(0,len(List1)):
  for j in range(0,len(List2)):
      Matrix[i,j] = distance(List1[i],List2[j])

Поскольку вышеупомянутый метод занимает много времени в качестве размера и длины данных.

Я пытался сравнить первые пять слов описания, если они совпадают, только затем вычислить расстояние между двумя строками, иначе перейти к следующему описанию списка в методе 2.

#Method2
for i in range(0,len(List1)):
    K1[i]=str(List1[:1]).split()[0:5]
    for j in range(0,len(List2)):
        K1[i]=str(List2[:1]).split()[0:5]
        if (distance(K1[i],K2[j]))==0:
            Matrix[i,j]=distance(List1[i],List2[j])
        else:
            Matrix[i,j]=1000

Но поскольку я новичок в этомпропуская некоторую логику и получая:

TypeError: объект 'int' не поддерживает назначение элементов

Я также хочу реализовать то же самое для следующих 10 и 100 слов.Заранее спасибо.

1 Ответ

0 голосов
/ 21 января 2019

Я думаю, вы должны проверить numy документацию и класс ndarray .

Вот немного питонический способ:

for i, new_value in enumerate(List1):
   for j, clean_value in enumerate(List2):
      Matrix[i,j] = distance(new_value, clean_value)
...