Я пытаюсь написать модуль проверки орфографии.Ищите похожие слова
Загружает текст, создает словарь из 16-мегабайтного файла и затем проверяет, совпадает ли найденное слово со словом в словаре (аналогично = варьируется до двух символов), если это так, то оно меняет его на форму из словаря.
Сейчас я использую алгоритм Левенштейн и обработки 50 слов набора занимает 3 мин ...
Я уверен, что должно быть более быстрым решением. Профилировщик сказал мне, что мое приложение тратит более 80% своего времени на функцию расстояния Левенштейна.
Есть ли лучшие решения/алгоритмы?
Здесь внедренная версии алгоритма я использую:
def levenshteinDistance(s1, s2):
l_s1 = len(s1)
l_s2 = len(s2)
d = [[a for a in genM(x, l_s2 + 1)] for x in xrange(l_s1 + 1)]
for i in xrange(1, l_s1 + 1):
for j in xrange(1, l_s2 + 1):
d[i][j] = min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + decide_of_equality(s1[i - 1],s2[j - 1]))
return d[l_s1][l_s2]
Звучит просто как «Autocorrect», чем проверка орфографии, поскольку орфографические проверки обычно создают параметры и позволяют пользователям выбирать из них. Autocorrect, очевидно, невозможно сделать хорошо, факт, который почти повсеместно признан даже в телевизионных рекламных роликах. :-) –
Если вы сделаете предположение, что первая буква слова всегда правильная, вы можете просто проверить словарь для слов, начинающихся с этой буквы. Это уменьшит ваше время более или менее фактором или 26 – Doboy
Я мало знаю о python, но ваша функция расстояния использует стандартное решение динамического программирования. Вот моя версия на C++: http://codereview.stackexchange.com/questions/10130/edit-distance-between-two-strings, может быть, вы можете заметить какую-то разницу. –