"Большие" проверки орфографии в Python

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

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

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

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

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

3 ответа

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

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

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

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

  • Если это не так, попросите 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/


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

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

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

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

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

licensed under cc by-sa 3.0 with attribution.