«Большая» проверка орфографии в Python - PullRequest
6 голосов
/ 10 августа 2010

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

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 10 августа 2010

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

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

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

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

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

Это предполагает, что большинство ваших слов написаны правильно;если нет, вам нужно быть умнее.

2 голосов
/ 26 января 2013

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

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/

1 голос
/ 10 августа 2010

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

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

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

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

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

...