2015-04-04 9 views
0

У меня есть список строк, и я хочу отфильтровать строки, которые слишком похожи на основе расстояния levenstein. Поэтому, если lev(list[0], list[10]) < 50; затем del list[10]. Есть ли способ, которым я могу рассчитать такое расстояние между каждой парой строк в списке, более эффективно? Благодаря!!Расчет расстояния levenshtein в списке Python

data2= [] 
for i in data: 
    for index, j in enumerate(data): 
     s = levenshtein(i, j) 
     if s < 50: 
      del data[index] 
    data2.append(i) 

Довольно немого выше код занимает слишком много времени, чтобы вычислить ...

+0

Для получения дополнительной информации вам потребуется дополнительная информация. Алгоритм Левенштейна считается медленным. Кроме того, данные и данные1 не определены. Вы посмотрели, http://www.levenshtein.net? Exobyte? Вы использовали профилировщик python? – xxyzzy

+0

Левенштейн симметричен. Возможно, вы захотите построить свои вложенные петли. См. Http://stackoverflow.com/questions/9722022/levenshtein-distance-symmetric – xxyzzy

+0

Спасибо. Я использую пятую реализацию Levenshtein из [link] (http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#Python). data - это список, состоящий из 6000 предложений, и я хочу оставить только одно из очень похожих предложений. – Blue482

ответ

1

Что делать, если мы держали только индексы хит-строк и просто пропустил их позже? Я игнорирую, сколько весит enumerate() and del() и процент процентных показов (т. Е. Сколько строк должно быть удалено из вашего набора данных).

THRESHOLD = 50 
data = ["hel", "how", "are", "you"] # replace with your dataset 

tbr = {} # holds the index of the strings to be removed 
idx = 0 
for i in data: 
    for j in xrange(len(data)): 
     if j != idx and levenshtein(i, data[j]) < THRESHOLD: 
      tbr[j] = True 
    idx += 1 

# print tbr 
data2 = [] 
idx = -1 
for d in data: 
    idx += 1 
    if idx in tbr: 
     continue # skip this string 
    data2.append(d) 
# print data2 
+0

Спасибо! Но «удерживает указатель строк, которые нужно удалить» шаг все еще происходит как навсегда ... – Blue482

+1

напишите его на C (с указателями); D – Pynchia