НЛП - Как бы вы проанализировали очень шумное предложение (с парсером Эрли)
Мне нужно разобрать предложение. Теперь у меня есть реализованный парсер Earley и грамматика для него. И все работает просто отлично, когда в предложении нет орфографических ошибок. Но проблема в том, что многие предложения, с которыми мне приходится иметь дело, очень шумные. Интересно, есть ли алгоритм, который сочетает в себе разбор с исправлением ошибок? Возможные ошибки:
- проверь "чекер" вместо "шашка"
- опечатки типа "проверка орфографии" вместо "проверка орфографии"
- сокращения вроде "Ear par" вместо "Earley parser"
Если вы знаете статью, которая может ответить на мой вопрос, я бы оценил ссылку на нее.
1 ответ
Я предполагаю, что вы используете этап tagger (или lexer), который применяется перед синтаксическим анализатором Earley, то есть алгоритм, который разбивает входную строку на токены и просматривает каждый токен в словаре, чтобы определить его тег части речи (POS) (ы):
John --> PN
loves --> V
a --> DT
woman --> NN
named --> JJ,VPP
Mary --> PN
Должна быть возможность встроить в эту стадию какой-то примерный поиск строк (он же нечеткий поиск строк), поэтому, когда он представлен с токеном с орфографической ошибкой, таким как "лепестки" вместо "любит", он не только идентифицирует теги. обнаруживается путем точного сопоставления строк ("лепестки" как существительное во множественном числе от "доли"), но также и с токенами, которые похожи по форме ("любит" как единственное число от третьего лица глагола "любовь").
Это будет означать, что вы обычно получаете большее количество тегов-кандидатов для каждого токена, и, следовательно, большее количество возможных результатов анализа во время синтаксического анализа. Будет ли это приводить к желаемому результату, зависит от того, насколько всеобъемлющей является грамматика, и от того, насколько хорош анализатор при определении правильного анализа при представлении множества возможных деревьев разбора. Вероятнее всего, для этого лучше использовать вероятностный синтаксический анализатор, поскольку он назначает каждому подходящему дереву анализа вероятность (или доверительную оценку), которую можно использовать для выбора наиболее вероятного (или лучшего) анализа.
Если это решение, которое вы хотели бы попробовать, есть несколько возможных стратегий реализации. Во-первых, если токенизация и тегирование выполняются как простой поиск в словаре (т. Е. В стиле лексера), вы можете просто использовать структуру данных для словаря, которая обеспечивает приблизительное сопоставление строк. Общие методы приблизительного сравнения строк описаны в Алгоритмах приблизительного сопоставления строк, а методы приближенного поиска строк в больших словарях - в разделе Быстрое сравнение строки с коллекцией в Java.
Если, однако, вы используете фактический тегер, в отличие от лексера, то есть что-то, что выполняет устранение неоднозначности POS в дополнение к простому поиску по словарю, вам придется встроить приблизительный поиск по словарю в этот тегер. Должна быть функция поиска по словарю, которая используется для генерации тегов-кандидатов до применения устранения неоднозначности где-то в тэггере. Этот поиск по словарю должен быть заменен тем, который позволяет приблизительный поиск по строке.