Удалите строки из кадра данных Pandas, которые находятся близко к расстоянию Левенштейна - PullRequest
0 голосов
/ 01 мая 2018

В фрейме данных Pandas мне нужно удалить записи, которые слишком близки по отношению к расстоянию Левенштейна. Неэффективная реализация:

i = 0
j = 0

for index, row in df.iterrows():
  text1 = row['text']
  for index2, row2 in df.iterrows():
     text2 = row2['text']
     lev_ratio = Levenshtein.ratio(text1, text2)
     if j != i and lev_ratio > 0.9:
         df.drop(index2, inplace = True)     
     j += 1
  i += 1

Есть ли более эффективный способ?

1 Ответ

0 голосов
/ 02 мая 2018

Чтобы начать с побочной точки, вы можете проверить, можете ли вы поместить на место во время итерации:

for index, row in df.iterrows():
  for index2, row2 in df.iterrows():
     df.drop(index2, inplace = True) # <- is this safe?

Что касается вашего вопроса, поскольку вы ищете только те случаи, когда коэффициент Левенштейна больше 0,9, нет необходимости фактически рассчитывать его, когда его можно эффективно увидеть как более низкое. Так, например, если одно слово имеет длину 4, а другое - длину 8, расстояние будет меньше 0,9. Следовательно, вы можете рассмотреть что-то вроде:

pairs = []
for i, w_i in enumerte(enumerte(words.values)):
    for j, w_j in enumerte(enumerte(words.values)):
        if i >= j:
           continue
        if len(set(w_i).symmetric_distance(w_j))  > 1.8 * min(len(w_i), len(w_j)):
           continue
        # Calculate distance only here.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...