Online вариант модуля морфологического анализа для .NET доступен на ASP.NET портале, авторизация test/test.
Морфологический анализатор это набор алгоритмов, которые занимается сопоставлением отдельных слов и словоформ в словаре (лексиконе, если быть точным) и выяснением грамматических характеристик слов. Данный процесс сопоставления называется в документации проекцией (имеется в виду проекция элемента на множество). Лексический автомат начинает синтаксический анализ фраз в составе вербального канала обработки информации, а также может использоваться сам по себе - например, в поисковом движке при обработке расширенных регулярных выражений.
В грамматическом движке можно выделить морфологический разбор изолированных слов и слов в составе предложений. В первом случае для реализованных языков в большинстве случаев возникает множество вариантов проекции. В русском языке очень много совпадений словоформ в рамках одной словарной статьи, например камень может быть формой именительного (камень лежит на земле) или винительного (взять камень) падежа. Для английского языка к этому добавляется совпадение форм разных грамматических классов, например "back"-существительное или "back"-наречие.
Важная особенность морфологического анализатора - он не привязан к определенному языку. Разнообразные правила задаются в исходных текстах словаря и позволяют гибко настраивать ход морфологического разбора на особенности конкретного языка. Например, для русского языка большое количество правил фильтруют результаты морфологического разбора отдельных слов с учетом согласования существительных и прилагательных по грамматическому роду, числу и падежу. Правила сохраняются в бинарном словаре и загружаются вместе со словарем.
Программно морфологический анализатор реализован как класс LexicalAutomat, объявленный в la_autom.h. Он является наследником класса автоматов. Кроме того, имеется ряд классов для представления правил нечеткой проекции, отбора и сортировки альтернативных проекций.
В исходных текстах словаря информация для морфологического анализатора задается в секциях с именем "la", в качестве примера можно посмотреть на файл la-russian-fuzzy.sol.
API грамматического движка содержит большое количество вызовов, позволяющих работать с морфологическим анализатором, например sol_MorphologyAnalysis выполняет морфологический разбор слов в предложении с учетом контекста - правил сочетаемости частей речи и грамматических признаков для целевого языка.
Как уже было отмечено, гибкий учет особенностей конкретного естественного языка возможен благодаря тому, что соответствующие правила не зашиты в коде анализатора, а определяются среди исходных текстов словаря.
Существует несколько видов правил морфологического разбора.
Во-первых, при нечетком сравнении слов учитывается степень близости конкретных букв и групп букв. Например, в русском языке неистощимым источником ошибок служит показатель инфинитива -ться. Из-за фонетических особенностей нашего произношения достаточно часто мягкий знак пропускается на письме, отражая принцип "как слышится, так и пишется". Соответствующее правило нечеткого сравнения для русского морфологического анализа задает соответствие -ться и -тся, допуская возможность соотнесения соответствующих грамматических форм.
Во-вторых, правила отбора вариантов морфологического разбора слова в контексте. Эти правила допускают сложные логические проверки на грамматические признаки слов в контексте, позволяя реализовывать, к примеру, проверку согласования существительного и глагола по грамматическому роду и числу.
В-третьих, правила фильтрации вариантов разбора по образцу. Из назначение похоже на второй тип правил в данном перечне, но они имеют упрощенный синтаксис и позволяют фактически обучать морфологический анализатор по задаваемым образцам эталонного разбора словосочетаний. Алгоритм, который занимается применением этого типа правила, оптимизирован на скорость работы, чтобы можно было задавать длинный перечень правил без ущерба для общей производительности морфологического анализатора.
В-четвертых, правила сортировки вариантов морфологического разбора. Эти правила отличаются от третьего типа только тем, что они не отбрасывают непрошедшие верификацию варианты, а делают их второстепенными версиями в рамках версионных словоформ.
При работе с реальными текстами постоянно возникают проблемы опечаток и грамматических ошибок написания слов. Проекция таких слов требует особого подхода.
Во-первых, изменяется алгоритм поиска словоформы в словаре, а точнее - сравнения двух строк (мультилексем). Если задана неизвестная мультилексема и имя словоформы (тоже мультилексема), то вместо посимвольного сравнения начинается сравнение, допускающее несовпадение нескольких букв (их предельное число - параметр nmissmax в методе ProjectWord), а также пропуск нескольких букв. Таким образом, слова кошка и кожка оказываются почти совпадающими. Почти в данном случае получает числовую оценку - достоверность проекции.
Во-вторых, учитываются несколько большая достоверность некоторых замен. Например, вероятность того, что вместо молоко будет написано малоко, выше, чем для мылоко, так как в безударной позиции 'о' легко становится 'а'. Подобные фонетически равнозначные замены (откуда и возник термин фонетические инварианты, которые просто был расширен на случай пропуска букв и вообще замен) анализируются с помощью явно задаваемых правил искажения.
Список этих правил для русского находится в файле la-russian-fuzzy.sol в исходных текстах словаря.
Общий формат:
operator
"имя_правила"
if context "что_заменяется" then context "на_что_заменяется" = достоверность_замены
Например:
operator "ши-шы"
if context "ШЫ" then context "ШИ" = 95
Данное правило говорит, что при нечеткой проекции следует пытаться вместо букв 'ШЫ' попробовать использовать 'ШИ', и в случае успеха получившаяся проекция имеет сниженную на 5% достоверность.
Недостатком этого подхода является большое количество генерируемых проекций с низкой достоверностью. Частично проблема решается с помощью механизма откатов анализа: генерируются проекции с достоверностью не ниже, допустим, 90%, запускается синтаксический анализ, если он не приводит к успеху - нижняя граница достоверности снижается до 60%, и анализ повторяется.
...
Как уже показано выше, при морфологическом анализе одиночных слов неизбежно возникает множество неоднозначностей. Часть этих неоднозначностей можно разрешить в случае учета соседей - то есть при морфологическом анализе и последующем синтаксическом анализе предложения.
В грамматической машине реализованы 2 алгоритма морфологического анализа предложения - неустойчивый многопоточный и устойчивый однопоточный.
Первый алгоритм для каждой альтернативы в морфологическом анализе слова создает отдельный поток последующего синтаксического анализа. Главный недостаток этого метода - потенциальная склонность к взрывному росту числа альтернативных потоков для длинных предложений.
Второй алгоритм использует "версионные" словоформы в случае, когда слово исходного предложения дает неоднозначность определения его грамматических признаков при условии неизменности лексического значения. Этот метод более устойчив в случае анализа длинных предложений, но вынуждает синтаксический анализатор делать дополнительные проверки контекста по сравнению с первым методом, так как в первом случае провал фиксации опорной точки сразу означает провал всего правила, а для второго метода необходимо проверять все версии словоформ, не взирая на провал отдельных проверок. Наличие множества версий словоформ безусловно замедляет синтаксический анализ. Улучшает ситуацию особый механизм неявного отсева версий по ходу синтаксического анализа. Этот механизм основан на двух идеях. Во-первых, при проверке опорного контекста продукционными правилами особым образом маркируются версии, удовлетворяющие условию правила. Во-вторых, при продукции, то есть в случае успеха проверки и создании результирующего контекста, непромаркированные на первом этапе версии отбрасываются.
Чтобы уменьшить объем работы по анализу недопустимых вариантов проекции, оба метода используют общий механизм для предварительной фильтрации недопустимых сочетаний морфологических атрибутов - N-граммы.
Рассмотрим пример для предложения "путешествие большой кошки".
Сосредоточим внимание на морфологическом анализе слова большой. В изоляции, без учета окружения, оно допускает 3 варианта: именительный падеж мужской род, винительный падеж мужской род для неодушевленного, родительный падеж женский род. Это хорошо видно на примерах:
Большой (им.п. муж.р.) тигр вышел на охоту.
Взял большой (вин.п. муж.р.) куш.
Возвращаясь к путешествию большой кошки, можем сформулировать формальные правила отбора корректных вариантом морфоанализа:
прилагательное (род.п. жен.р.) + существительное (род.п. жен.р.)
прилагательное (им.п. муж.р.) + существительное (им.п. муж.р.)
прилагательное (вин.п. муж.р. неодуш.) + существительное (вин.п. муж.р. неодуш.)
Все три правила можно обобщить до одного, если использовать проверку согласования элементов паттерна по роду и падежу. Примеры правил для русского языка можно найти в файле rus_sa_filters.sol в дистрибутиве SDK. Их синтаксис почти полностью повторяет продукционные правила синтаксического анализа с несколькими отличиями и ограничениями.
1. Ключевое слово, с которого начинается правило фильтрации это filter, а не operator.
2. Правила фильтрации не объединяются в группы. Порядок применения правил - сначала самые длинные.
3. Результат применения правила, точнее его акторная часть, может быть либо корректность входного контекста, либо его некорректность. Соответствующие акторы - produced и reject соответственно. Но в конечном итоге фильтрацию выполняют только акторы reject.
4. Следует ограничивать длину проверяемого опорного контекста 4-5 точками.
5. В правой части правил-фильтров можно использовать ограниченный набор кондикторов: context, text и логические or, and, not.
Пример правила-фильтра для контекста из 2х прилагательных:
filter Filter_AdjAdj1
{
if context { ПРИЛАГАТЕЛЬНОЕ ПРИЛАГАТЕЛЬНОЕ }
then { // Не могут идти подряд два кратких прилагательных if context { Прилагательное:*{ КРАТКИЙ } Прилагательное:*{ КРАТКИЙ } }
then reject
// Не могут идти подряд два прилагательных в сравнительной степени else if context { Прилагательное:*{ СТЕПЕНЬ:СРАВН } Прилагательное:*{ СТЕПЕНЬ:СРАВН } }
then reject // Не могут идти подряд два прилагательных в превосходной степени else if context { Прилагательное:*{ СТЕПЕНЬ:ПРЕВОСХ } Прилагательное:*{ СТЕПЕНЬ:ПРЕВОСХ } }
then reject else if context { ПРИЛАГАТЕЛЬНОЕ:ЭТОТ { ПАДЕЖ:ИМ ЧИСЛО:ЕД РОД:СР } ПРИЛАГАТЕЛЬНОЕ:*{ ПАДЕЖ:ИМ } }
then produced // особая обработка для случаев 'У КОТОРОГО БЕЛАЯ КОШКА ЕСТ РЫБУ'. else if context { ПРИЛАГАТЕЛЬНОЕ:КОТОРЫЙ {} ПРИЛАГАТЕЛЬНОЕ }
then produced // Увидевший белую кошку else if context { ПРИЛАГАТЕЛЬНОЕ:* { ПРИЧАСТИЕ } ПРИЛАГАТЕЛЬНОЕ }
then produced // Белую увидевший кошку else if context { ПРИЛАГАТЕЛЬНОЕ ПРИЛАГАТЕЛЬНОЕ:* { ПРИЧАСТИЕ } }
then produced else { // Общий случай - прилагательные должны быть согласованы if correlate { РОД ЧИСЛО ПАДЕЖ }
then produced else reject } } }
Морфология русского языка имеет ряд особенностей, из-за которых начальный отсев недопустимых вариантом изолированного морфологического анализа является не обязательным в большинстве случаев.
Для английского языка такая предварительная фильтрация чрезвычайно важна, так как в большинстве случаев определить грамматический класс слова (то есть идентифицировать часть речи) нельзя без учета контекста. Рассмотрим простейший пример со словом project. Оно может быть и существительным (проект) и глаголом (проектировать). Морфологический анализатор, получив на вход предложение
The finished project is accepted
сначала распознает для project оба альтернативных варианта, а затем с помощью морфологических N-грамм английского языка оставляет только вариант существительного. С помощью утилиты Syntax в режиме теста морфологического анализатора результат можно увидеть так:
Кроме описанных ранее правил фильтрации, допускающих весьма сложные логические условия, есть два других вида правил, более простых и в то же время хорошо дополняющих возможности своих "старших сестер".
С точки зрения записи в исходных текстах оба типа правил практически идентичны друг другу. Примеры реальных правил есть в файле rus_sa_patterns.sol.
Смысл введения правил обработки по образцу поясним на нескольких примерах на русском языке.
Рассмотрим фразу
Говорить шепотом
Если рассматривать слово шепотом изолированно, то морфологический анализ дает 2 возможных результата. Это может быть наречием (по аналогии с говорить тихо) или формой творительного падежа существительного шепот (по аналогии с кивать головой). Но на практике слово шепотом обычно является наречием. Учитывая это, мы можем подсказать морфологическому анализатору - считать распознавание в качестве наречия как основное. При этом не будем совсем запрещать распознавание его формой существительного. Соответствующее правило выглядит так:
pattern sorter { шёпотом { class:наречие } }
Работают все описываемые в данном разделе правила таким образом. Применяясь к исходному набору результатом изолированного морфологического анализа, то есть к списку версионных словоформ, правило перебирает все варианты сопоставления со всеми версиями. Успешно сопоставленные с условиями правила версии словоформ помечаются. Более того, для каждой версии ведется счетчик успешных сопоставлений. После отработки всех правил мы знаем для каждой версии проекции, было ли она сопоставлена хоть с одним правилом. Для правил фильтрации далее выполняется отбрасывание тех вариантов морфологического анализа, которые не подтверждены ни одним успешным сопоставлением. Для правил сортировки выполняется сортировка вариантов морфологического разбора в рамках одной словоформы так, что давший максимальное количество сопоставлений вариант оказывается основным.
Возвращаясь к нашему примеру со словом шепот, нетрудно увидеть, что правило даст сопоставление с вариантом наречия, так что в результате морфологического анализа на месте исходного слова получится словоформа с двумя альтернативными версиями - наречие будет основной, творительный падеж существительтного - дополнительной.
Ниже будет показано, что версий в одной словоформе может быть намного больше двух.
Если же мы уверены, что вариант существительного вообще никогда, ни в каком контексте, не может появиться, то достаточно немного изменить запись правила, чтобы сделать его фильтром:
pattern { шёпотом { class:наречие } }
То есть без дополнительного ключевого слова sorter правло становиться фильтром. Можно сказать, что оно неявно отбросит вариант существительного, если не будет какого-либо правила, одна из опорных точек которого даст успешное сопоставление с формой существительного. Таким образом, правила фильтрации по образцу действуют в комплексе.
Теперь давайте рассмотрим более сложный пример, когда фильтрация и сортировка выполняются с учетом контекста - соседних слов.
Слово автостопом в некоторых случаях является наречием, а в других соответствует форме творительного падежа существительного автостоп. В контексте
путешествовать автостопом
мы явно имеем дело с наречием, а в словосочетании
магнитофон оборудован автостопом
с существительным.
В качестве фильтрующего признака используем стоящее перед автостопом слово - глагол или причастие. Другими словами, реализуем языковую практику в правилах:
pattern { глагол:путешествовать{} автостопом { class:наречие } }
pattern { прилагательное:оборудованный{} автостопом { class:существительное } }
В вышеприведенных правилах мы задаем условие на предшествующее автостопом слово так, что соответствующая опорная точка даст успешное сопоставление с любой грамматической формой этих слов, то есть эти правила сработают также для словосочетаний
путешествуем автостопом
оборудованную автостопом
Правила позволяют работать не только с буквальными контекстами, но и задавать в качестве опорных точек более общие множества, указывая не одно конкретное слово, а любое слово, принадлежащее определенной части речи или имеющее определенный набор признаков.
Например, в предложении
США планируют возродить лунную программу.
существительное США, если рассматривать его вне контекста, не позволяет однозначно назвать его падеж. Соответствующая словарная статья имеет парадигму из 6 падежных форм множественного числа, совпадающих лексически. Но мы можем в ходе морфологического разбора опереться на тот факт, что в современном русском языке, не смотря на относительно свободный порядок слов, существительное перед личной формой глагола обычно стоит в именительном падеже. Это правило нестрогое - для достижения выразительного эффекта в художественном тексте порядок слов может быть произвольным практически полностью. Тем не менее, нам достаточно для практических целей выбрать в данном контексте именительный падеж как основной вариант морфологического разбора и оставить остальные 5 вариантов как вспомогательные.
Соответствующее правило оперирует двумя опорными точками, сопоставляющимися с существительным в именительном падеже и с глаголом:
pattern sorter { существительное:* { падеж:им } глагол:* {} }
Запись со звездочкой как раз обозначает класс словарных статей для одной части речи. Звездочка в этом случае - это просто квантор.
Похожий пример с существительным и глаголом с другим порядком их следования
Вижу карандаш
иллюстрирует тот факт, что в русском языке, в рамках повседневного словоупотребления, существительное после переходного глагола обычно идет в винительном, родительном, творительном или дательном падеже. Кроме того, внутренние процессы привели к тому, что для неодушевленных существительных мужского рода формы именительного и винительного падежа совпадают. Различить их в ходе морфологического анализа помогает первая закономерность, которую можно описать таким правилом сортировки
pattern sorter { глагол:* { переходность:переходный падеж:вин } существительное:* { одуш:неодуш падеж:вин род:муж } }
Мы также сузили множество глаголов, сопоставимых с первой опорной точкой, до подмножества, имеющего падежную валентность, включающую винительный падеж.
Основная задача проекция слов, то есть установления соответствия слова и словарной статьи в Лексиконе.
1. Для каждого слова отыскиваются все возможные варианты проекции, поэтому омонимия автоматически учитывается.
2. Попытки проекции могут повторяться для слова - каждый перезапуск лексического автомата включает новый метод проекции. Общая методика в данном случае заключается в постепенном уменьшении четкости проекции.
2.1 Сначала выполняется строго формальная четкая проекция
2.2 На втором этапе - выполняется проекция с учетом возможных способов словообразования (префиксы и аффиксы, что дает возможность построить из одного глагола мыть целое семейство: перемыть-отмыть-домыть и т.д). Правила словообразования описываются в словаре.
2.3 На третьем этапе допускается отличие исходного слова (или производных от него) и словоформы в словаре. При этом учитывается вес несовпадений - поэтому достоверность совпадения повторятся и повторяться выше, чем повторятся и уовторятся. Достоверности различных видов опечаток описываются в словаре и могут быть изменены. Количество допустимых несовпадений задается - поэтому можно сначала найти варианты проекций с 1 несовпадением, затем - с 2мя несовпадениями, и т.д.
3. Каждая проекция сопровождается оценкой ее достоверности.
Технически эту работу выполняют методы ProjectWord, ProjectUnknown и другие. Они возвращают список проекций: индексов словарных статей и индексов словоформ в статье, а также веса достоверности проекции.
Фузия- тесное присоединение нестандартных аффиксов, могущих быть многозначными, к корням, которые могут изменяться.
Агглютинация- механическое присоединение однозначных, стандартных аффиксов к неизменяемым корням.
Пример фузивного языка - русский:
заяц- зайцу- зайчик- зайчику
Присоединение уменьшительного суффикса -ик приводит к замене конечного ц на ч.
Можно наглядно увидеть образование различных форм слов с помощью программы Грамматический Словарь Русского Языка.
Пусть формообразование происходит при воздействии операторов на базовую форму слова (для существительных таковой формой будет единственное число именительного падежа):
| выполняемое действие | обозначение | хлеб | пила | заяц |
| множественное число | мн(x) | хлебà | пùлы | зайцы |
| родительный падеж | род(x) | хлèба | пилу | зайца |
| творительный падеж | тв(x) | хлебом | пилой | зайцем |
| винительный падеж | вин(x) | хлеб | пилу | зайца |
| дательный падеж | дат(x) | хлебу | пиле | зайцу |
| предложный падеж | пр(x) | (о) хлебе | (о) пиле | (о) зайце |
Пусть также операторы род(x), тв(x) и так далее в качестве аргумента допускают и форму множественного числа.
Далее, обозначим через ЕД(x), МН(x), ИМ(x), РОД(x) и так далее операторы, которые строят словоформу из любой, не обязательно базовой, формы слова. Легко понять, что:
РОД(x)= род(ЕД(ИМ(x))),
то есть сначала с помощью операторов ЕД(x) и ИМ(x) получаем базовую форму слова, а затем строим родительный падеж оператором род(x). Простота формальной записи не означает, однако, существования тривиальных правил реализации операторов ЕД(x) и ИМ(x). Беда в том, что число лексически разных (по разному пишущихся) словоформ обычно меньше, чем число возможных морфологических категорий.
Необходимо также отметить, что для большинства языков характерно наличие форм-синонимов для слов, относящихся к разным частям речи. К примеру, без проставленного ударения (а даже и с ударением – учитывая живой характер языка) невозможно понять, когда пила есть глагол (она пила воду) и когда - существительное (острая пила).
Есть два способа разорвать возникающий логический круг.
1. Анализ через синтез. Пусть в Лексиконе имеются базовые словоформы для заяц, хлеб, пила. Зададимся целью определить базовую словоформу для лексемы пилам, для этого последовательно делаем продукции для всех имеющихся базовых словоформ посредством всевозможных сочетаний операторов, причем учитываем, что род(тв(x))єтв(x):
дат(мн(заяц))- зайцам
дат(мн(хлеб))- хлебам
дат(мн(пила))- пилам
Последняя продукция дала совпадение с лексемой пилам, поэтому делаем вывод, что ее базовой формой является пила, и она есть форма множественного числа дательного падежа. Путь анализа через синтез, представляя простой путь определения базовой формы, не свободен от недостатков. Прежде всего, временные затраты могут быть неприемлемо велики, если лексикон содержит тысячи словарных статей. Во-вторых, в некоторых (отнюдь не редких) случаях этот алгоритм не может восстановить однозначно цепочку операторов, которые применялись к базовой форме. Сама по себе базовая форма может быть и не нужна, а вот синтаксический анализ требует информации о грамматическом состоянии словоформы. Рассмотрим пример с лексемой пилу:
род(пилу) -> пилу
вин(пилу) -> пилу
Итак, нет однозначного ответа, является ли словоформа пилу формой родительного или винительного падежа. Бороться с такой неоднозначностью нет резона, а вот сознательно использовать ее - вполне реально, и этот подход реализуется в методе, который можно назвать:
2. Пробные шары. Пусть оператор БАЗ(x) имеет своей задачей определить не только базовую форму слова, но и восстановить цепочку примененных к ней операторов. В силу отмеченных выше причин этот оператор не способен избавиться от неопределенностей, поэтому изначально придадим ему свойство возвращать не один вариант ответа, а несколько альтернативных.
БАЗ(пилу ) -> { пила (ед.ч,род.п.) пила(ед.ч,вин.п.) }
В итоге груз ответственности по выбору единственного
верного ответа перекладывается на синтаксический анализатор. Кроме того, выбор корректных или более вероятных результатов разбора может осуществляться специальными правилами.
Вторая стратегия часто осознанно применяется человеком при переводе текста с иностранного языка. Поскольку в словарях приводятся базовые формы слов, то, встретив в тексте незнакомую лексему, необходимо попробовать построить несколько вариантов оригинала и затем отыскать один из них в словаре. Если однозначно найти ответ не удается, то понимание предложения проводится параллельно для обоих (или нескольких) вариантов, пока не обнаружится, что часть переводов теряет смысл. Разумеется, деятельность мозга человека значительно сложнее описанных схем, она не столь формальна и часто сопровождается динамической сменой стратегии поиска.
В грамматической машине на стадии морфологического анализа используется некий сплав обоих подходов. В силу ряда соображений (прежде всего - эффективности и простоты реализации) стадия генерации форм из базовой вынесена за рамки собственно морфологического анализатора, и в Лексиконе хранятся не только базовые, но и все производные формы для каждой словарной статьи.
Итак, рассмотрим работу анализатора. На входе он имеет предложение, то есть набор лексем (пока еще не словоформ):
мама мыла раму
Задача анализатора - определить части речи, к которым относятся лексемы, и проставить грамматические категории, после чего лексемы становятся словоформами. На этой стадии неизвестна семантическая структура предложения, поэтому руководствоваться его смыслом нет возможности. В приведенном предложении одна лексема мыла может быть проинтерпретирована двояко: либо как глагол мыть(прош.в, 3ел., жен.р.), либо как существительное мыло(партитив.п, ед..ч.). Возникающая неоднозначность не может быть разрешена на этой стадии, так что анализатор просто дает оба варианта:
мама мыла раму
1 вариант: 2 варианта: 1 вариант:
сущ. 1) глагол сущ.
ед.ч. прош.вр. ед.ч.
им.пад. 3e л. вин.п.
ж.р.
2) сущ.
партитив.п.
ед.ч.
Специальная процедура формирует два варианта предложения:
1) мама мыла(1)
раму(1)
2) мама мыла(2)
раму(1)
Эти варианты поступают на вход синтаксического анализатора и вызывают четыре потока разбора. Как происходит выбор правильного варианта будет объяснено в следующей главе.
Работа морфологического анализатора осложняется существованием многолексемных словоформ. Пример многолексемной словоформы: союз прежде чем, или фразовые глаголы с послелогами в английском языке типа to go on. Представляя собой единую словоформу (ср. постфикс -ся, -сь в русском: бриться-брился-брилась-бреются, и англ. to go on-went on-goes on), они должны быть правильно распознаны. Рассмотрим два предложения:
1) он сказал так, как никогда не говорил.
2) он ничего не сказал, так как ничего не знал.
Если письменная форма при условии соблюдения правил языка дает возможность распознать случаи двух отдельных словоформ так,как и единой многолексемной словоформы так как, то фонетический ввод не может этого обеспечить, так что необходимо предпринимать меры на уровне морфологического анализатора.
Последовательность действий примерно такова. Занимаясь идентификацией очередной лексемы исходного предложения, к примеру так для случая 2, Автомат будет собирать словоформы, состоящие из так последующих лексем как, ничего и так далее, получая многолексемные конструкции так, так как, так как ничего, и искать их в Лексиконе. В двух случаях поиск будет успешным, и возникшая неоднозначность приведет к удвоению вариантов интерпретации предложения:
1) [он] [ничего] [не] [сказал] [,] [так] [как] [ничего] [не] [знал]
2) [он] [ничего] [не] [сказал] [,] [так как] [ничего] [не] [знал]
Выбор корректного варианта опять-таки перекладывается на синтаксический анализатор.
Кроме внутренних причин, вынуждающих морфологический анализатор генерировать списки альтернатив, необходимо отметить существование омофонов, то есть одинаково звучащих слов с разным написанием, и разного рода ошибки во входной фразе, когда найти точно подходящую словоформу из Лексикона не удается и приходится подбирать некие близкие по звучанию или написанию формы.
Четкая проекция слова 'собака'. Получается один вариант:

сабака", в котором есть одна опечатка:

Как видно, морфологическая машина отыскала две проекции (первая - "табака").
Третий вариант - с учетом словообразования. Пытаемся спроецировать слово "доубедить", которое отсутствует в словаре. Лексический автомат, не найдя прямого соответствия, применит правило (добавление префикса до) и получит успешную проекцию на словоформу "убедить":

Четкая проекция слова ''cat', в результате получается один вариант:

Теперь проекция слова с опечаткой 'kat':

Количество найденных вариантов возросло.
Вариант проекции с учетом словообразования (префикс mis~)

Морфологический анализатор в виде программы
API морфологического анализатора
Многопоточность в морфологическом анализаторе
Ключевые особенности морфологического анализатора
Внутренний язык грамматической машины
© Elijah Koziev 2010
Поисковая система
SDK Поисковой системы
Экранный переводчик
|
|
изменено 25-Aug-11 | ||||||||||||||||||||||||||||||||||||||