"Крупномасштабная" проверка орфографии в Python

удивительно, что я не смог найти никого другого, кто действительно это делает, но, конечно, кто-то сделал. В настоящее время я работаю над проектом python, который включает проверку орфографии около 16 тысяч слов. К сожалению, это количество слов будет только расти. Прямо сейчас я вытягиваю слова из Монго, повторяю их, а затем проверяю их с помощью pyenchant. Я удалил монго как потенциальное узкое место, захватив сначала все мои предметы. У меня осталось около 20 минут процесс через 16k слов, что, очевидно, больше, чем я хочу потратить. Это оставляет меня с парой идей / вопросов:

  1. очевидно, я мог бы использовать резьбу или какую-то форму параллелизма. Даже если я порежу это на 4 части, я все еще смотрю примерно на 5 минут, предполагая пиковую производительность.

  2. есть ли способ сказать, что библиотека орфографии Enchant использует под pyenchant? Сайт Enchant, похоже, подразумевает, что он будет использовать все доступные библиотеки орфографии / словари при проверке орфографии. Если это так, то я потенциально прогоняю каждое слово через три-четыре орфографических диктанта. Это может быть моя проблема, но мне трудно доказать, что это так. Даже если это так, мой вариант действительно удалить другие библиотеки? Звучит неудачно.

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

Edit: извините, публикация перед утренним кофе... Enchant генерирует список предложений для меня, если слово написано неправильно. Кажется, именно там я провожу большую часть своего времени в этой части обработки.

3 ответов


Я думаю, мы согласны с тем, что узкое место производительности здесь зачаровывает; для такого размера набора данных почти мгновенно сделать логическое isSpeltCorrectly. Так почему бы и нет:

  1. создайте набор в памяти правильно написанных слов, используя словари, которые Enchant делает или получает свой собственный (например,OpenOffice).

    необязательно, uniquify слова документа, скажем, поместив их в set. Это, вероятно, не спасет вас очень много.

  2. проверить, является ли каждое слово в наборе или нет. Это быстро, потому что это просто набор подстановок. (Вероятно O(log N) где n-количество слов? предполагая, что set ведра по хэшу и выполняет двоичный поиск... гуру Python может исправить меня здесь.)

  3. если это не так, затем попросите Enchant порекомендовать слово для этого. Это обязательно медленно.

это предполагает, что большинство слов пишется если это не так, тебе придется быть умнее.


Я бы использовал проверку орфографии в стиле Питера Норвига. Я написал Полный пост об этом.

http://blog.mattalcock.com/2012/12/5/python-spell-checker/

вот фрагмент кода, который рассматривает возможные изменения слова для проверки.

def edits1(word):
    s = [(word[:i], word[i:]) for i in range(len(word) + 1)]
    deletes    = [a + b[1:] for a, b in s if b]
    transposes = [a + b[1] + b[0] + b[2:] for a, b in s if len(b)>1]
    replaces   = [a + c + b[1:] for a, b in s for c in alphabet if b]
    inserts    = [a + c + b     for a, b in s for c in alphabet]
    return set(deletes + transposes + replaces + inserts)

вы должны итерации через растущий файл данных слов, чтобы проверить очень быстро с этим кодом для проверки. Увидеть полный пост для более информация:

http://blog.mattalcock.com/2012/12/5/python-spell-checker/


возможно, лучшим способом сделать это было бы сжать документ, так как это удалило бы любые повторяющиеся экземпляры слов, которые вам на самом деле нужно только один раз проверить орфографию. Я только предлагаю это, поскольку он, вероятно, будет работать быстрее, чем писать свой собственный уникальный Word finder.

сжатая версия должна иметь ссылки на уникальные слова, где-то в его файл, вы могли посмотреть, как они структурированы.

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

Как только это будет сделано, просто распакуйте его и вуаля! все проверено. Это должно быть довольно быстрое решение.

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