2013-07-21 2 views
1

Как указано в большинстве правописание корректора репетиторов, правильное слово W^для неправильно пишется слово х:Орфографический коррекции вероятность

W^= Argmax W P (X | W) P (W)

Где P (X | W) - вероятность, а P (W) - модель языка.

В учебном пособии, где я изучаю корректуру правописания, инструктор говорит, что P (X | W) можно вычислить, используя матрицу путаницы, которая отслеживает, сколько раз буква в нашем корпусе ошибочно вводится для другого письмо. Я использую World Wide Web как свой корпус, и не может быть гарантировано, что письмо было ошибочно напечатано для другого письма. Так же хорошо, если я использую расстояние Левенштейна между X и W, вместо использования матрицы замешательства? Это имеет большое значение?

Способ, которым я собираюсь рассчитать Лев. расстояние в питоне это:

from difflib import SequenceMatcher 

def similar(a, b): 
    return SequenceMatcher(None, a, b).ratio() 

See this

А вот учебник, чтобы сделать мой вопрос яснее: Click here

PS. я работаю с Python

ответ

0

Есть несколько вещей, чтобы сказать.

  1. модель используется для прогнозирования наиболее вероятной коррекции является простой, каскадно вероятностная модель: Существует вероятность W, вводимыми пользователем, и условная вероятность для опечатка X в появляются, когда речь идет о W. Правильная терминология для P (X | W) равна условная вероятность, а не вероятность.(A вероятности используется при оценке того, насколько хорошо модель кандидата вероятность спичек с учетом данных. Таким образом, она играет роль, когда машина-узнать модель, а не при применении модели для прогнозирования коррекции.)

  2. Если вы должны были использовать расстояние Левенштейна для P (X | W), вы получили бы целые числа между 0 и суммой длин W и X. Это будет не быть подходящим, потому что вы должны использовать вероятность, которая должна быть между 0 и 1. Хуже того, значение, которое вы получите, будет тем больше, чем больше отличается кандидат от ввода. Это противоположность тому, что вы хотите.

  3. Однако, к счастью, SequenceMatcher.ratio() на самом деле не является реализацией расстояния Левенштейн. Это реализация меры подобия и возвращает значения между 0 и 1. Чем ближе к 1, тем больше аналогично две строки. Так что это имеет смысл.

  4. Строго говоря, вам нужно будет убедиться, что SequenceMatcher.ratio() действительно подходит как вероятностная мера. Для этого вам нужно будет проверить, равна ли сумма всех коэффициентов для всех возможных орфографических ошибок W. Это, конечно, не относится к SequenceMatcher.ratio(), поэтому на самом деле это не математически правильный выбор.

  5. Однако он все равно даст вам разумные результаты, и я бы сказал, что он может быть использован для практической и прототипической реализации проверки орфографии. Однако есть проблема с производительностью: поскольку SequenceMatcher.ratio() применяется к паре строк (кандидат W и пользовательский ввод X), возможно, вам придется применить это к огромному количеству возможных кандидатов, поступающих из словаря, чтобы выбрать наилучшее совпадение , Это будет очень медленно, когда ваш словарь большой. Чтобы улучшить это, вам необходимо реализовать свой словарь, используя структуру данных, которая содержит примерный строковый поиск, встроенный в него. Вы можете посмотреть на this existing post для вдохновения (это для Java, но ответы включают предложения об общих алгоритмах).

+0

поэтому в заключение я могу использовать 'SequenceMatcher.ratio()' для моей цели? – tenstar

+0

@tenstar Да. Извините, если это не ясно. Моя единственная реальная проблема заключается в том, что вы получите проблемы с производительностью (чтение: скорость), когда ваш словарь большой. – jogojapan

+0

да, но если я сгенерирую только несколько кандидатов с вершинами вероятности, то я смогу решить ритуал вопросов производительности? – tenstar

0

Да, это нормально, чтобы использовать расстояние Левенштейна вместо корпуса орфографических ошибок. Если вы не являетесь Google, вы не получите доступ к большому и достаточно надежному корпусу орфографических ошибок. Там много других показателей, которые будут выполнять эту работу. Я использовал расстояние Левенштейна, взвешенное расстоянием разных букв на клавиатуре. Идея состоит в том, что abc ближе к abx, чем к abp, потому что p находится дальше от x на моей клавиатуре, чем c. Другой вариант включает в себя учет замененных символов. swap является более вероятной коррекцией sawp, которая saw, потому что это то, как люди печатают. Они часто меняют порядок символов, но для получения нужного количества талантов нужно ввести saw, а затем случайным образом вставить p в конец.

Вышеупомянутые правила называются error model - вы пытаетесь использовать знания о том, как возникают орфографические ошибки реального мира, которые помогут вам принять решение. Вы можете (и люди) прийти с действительно сложными правилами. Независимо от того, имеют ли они значение, это эмпирический вопрос, вам нужно попробовать и посмотреть. Скорее всего, некоторые правила будут лучше работать для некоторых видов орфографических ошибок и хуже для других. Google how does aspell work для получения дополнительных примеров.

PS Все приведенные выше примеры ошибок были сделаны исключительно из-за использования клавиатуры. Иногда люди не знают, как записать слово - это целая другая червь из червей. Google soundex.

Смежные вопросы