Перевод текста в дерево
Итак, пусть у нас имеется входной текст на естественном (русском) языке, а нам необходимо
по каждому входному предложению построить дерево, в котором все слова связаны между
собой по смыслу. Формализуем задачу.
Текст - набор одного или нескольких предложений, разделённых пробелами. Предложение
- набор одного или нескольких слов, разделённых пробелами и, возможно, знаками препинания
' " ' (кавычки), ',' (запятая), ';' (точка с запятой), ':' (двоеточие), '-' (тире
и дефис), '...' (многоточие), '(' и ')' (скобки), и заканчивающееся '.' (точкой),
'!' (восклицательным знаком), '?' (вопросительным знаком) и '...' (многоточием),
либо комбинацией нескольких знаков из трёх последних.
Анализ входного текста будет состоять из последовательного анализа каждого предложения.
Анализ же предложения будет состоять из двух аспектов:
- Распознавание слов, входящих в предложение.
- Сборка слов в дерево.
Распознанным словом будет считать следующую конструкцию: Тип:Начальная_форма_слова(параметры_слова,
форма_слова). Например: "видит" = Глагол: видеть(Вид: Несовершенный,
Спряжение: 2, Переходный: Да, Возвратный: Нет, Наклонение: Изъявительное, Число:
Единственное, Время: Настоящее, Лицо: 3). Итак, слову в тексте
ставится в соответствие вот такое расширенное описание. Зная это описание, уже намного
проще связать слова между собой.
Формально расширенной записью слова будем считать запись T:I(С, F), T - тип
слова (часть речи), I - начальная форма слова, C - постоянные признаки, F - переменные
признаки (определяющие конкретную форму слова). Задача распознавания предложения
ставится так: для каждого слова в предложении нужно найти его расширенную запись так, чтобы все слова в предложении соотвествовали своим расширенным записям; помимо этого,
расширенные записи должны быть согласованы между собой так, что между словами в предложении
можно установить связи.
По сути дела, мы имеем набор определённых условий и группу связанных между
собой неизвестных. Тем самым, у нас имеется система уравнений! Неизвестными у нас являются параметры слов, уравнениями же являются правила синтаксиса (определяют возможности
взаимодействия слов между собой), морфологии (определяют возможности для изменения
форм слов) и само предложение, которое является отправной точкой для решения системы.
Сейчас я попробую привести пример такой системы уравнений.
Исходное предложение: "Вася очень любит спелую клюкву".
Связующие уравнения: T1:I1(С1, F1) = "Вася". Тут определяется ряд неизвестных.
T2:I2(С2, F2) = "очень", T3:I3(С3, F3) = "любит", T4:I4(С4, F4)
= "спелую", T5:I5(С5, F5) = "клюкву". Эти уравнения говорят о
том, что
найденные нами исходные слова должны корректно подставляться в предложение.
Уравнения словарей (пример): Наречие:очень. Такие условия записаны для
служебных слов. Самостоятельные части речи не пишутся изначально в словарях, а извлекаются
из контекста предложения. На данном этапе нам не нужны словари для них, поскольку
пока неинтересен их смысл. После реализации данного преобразования программа сама
сможет прочитать нужное количество текстов и заполнить эти словари.
Данное уравнение говорит лишь о том, что слово "очень" является наречием.
Ещё вариант: Союз:и(Состав: Простой, Употребление: Одиночный,
Синтаксическая_функция: Сочинительный.Соединительный) - объявляет союз
и его признаки.
Уравнения морфологии: Существительное:*шь(Род: Женский, Число: Единственное, Падеж:
Родительный) = *ши. Что же тут записано? Всё очень просто. Тут сказано,
что любое существительное женского рода, в начальной форме оканчивающееся на "шь",
в родительном падеже оканчивается на "ши". Звёздочка заменяет собой одинаковую часть
слова. В скобках указываются не все признаки слова, а лишь имеющие значение при
описании данного правила.
Ещё пример: Глагол:*ть(Время: Настоящее, Число: Единственное, Лицо: 3) = *т.
Это правило задаёт формальное изменение форм глаголов.
Может быть и явное правило в особых случаях: Существительное: путь(Число: Единственное,
Падеж: Родительный) = "пути".
В любом случае, все правила русского языка можно формализовать таким образом и записать
в виде таких схем или явных указаний для изменения формы слова.
Наконец, самые сложные - синтаксические уравнения. Они задают определённый порядок
слов в предложении и связь между ними.
Правила будут состоять из двух частей. В первой части указывается связь между двумя
словами, во второй - возможная реализация этой связи в предложении. Сама запись
слова здесь уже не имеет значения; важной оказывается его форма.
Запишем, например, связь между существительным и прилагательным, которое ему подчиняется.
X Y | Прилагательное:Y(Род:A, Число: B, Падеж: C) Существительное:X (Род:A, Число:
B, Падеж: C)
Правило утверждает: слово Y подчиняется слову X, если X является существительным,
Y - прилагательным, они имеют одинаковые число, род и падеж, а кроме того слово
Y записано перед словом X. Можно сразу же возразить, что прилагательное может несколько
отстоять в предложении от существительного, которому оно подчинено. Но мы будем
считать, что если между прилагательным и существительным стояли какие-то слова,
то мы уже нашли, чему те подчиняются и исключили их из рассмотрения. Тем самым,
мы "придвинем" прилагательное к существительному и сможем применить данное правило.
(Впрочем, пока всё это - лишь первое приближение. В процессе решения задачи, разумеется,
будут вноситься необходимые поправки в данную модель).
Пример определения подлежащего в предложении:
Факт1 Y | Существительное:Y (Падеж: Именительный)
Что же нужно сделать? Нужно найти слова в начальной форме и формы для этих слов,
такие, что они в этих формах совпадают со словами в предложении, а также согласуются
между собой (и позволяют сформировать дерево).
Можно решать данную систему по-разному. Стоит учесть то, что нельзя разрешить систему
сначала полностью для морфологических правил, а потом уже решать её для
синтаксических. То есть нельзя определить формы и признаки слов без привязки к их
позиции в предложении и без привязки к формам других слов. Аналогично нельзя построить
дерево, не разобравшись сперва в том, из каких слов устроено предложение. Подходы
к решению
могут быть самые разные.
Задача более-менеее сформулирована, и теперь попробуем обозначить возможный метод
её решения.
Одним из принципов нашей системы является аналогия с человечским мышлением. Как
анализирует текст человек?
Обычно мы пробегаем глазами строчку и не возвращаемся назад, то есть понимаем смысл
фразы за один проход по тексту. Иногда, когда предложение сложно сформулировано,
приходится возвращаться назад и перечитывать фрагменты этого предложения, чтобы
чётко уяснить связь между словами. Если нам встречаются незнакомые слова, то мы
проходим их глазами несколько медленнее - ведь нужно определить, какими частями
речи они являются.
В данном же случае мы читаем текст, не понимая ни единого слова (кроме служебных).
То есть весь текст состоит из предложений вида "Глокая куздра штеко будланула бокра
и кудрячит бокрёнка". И тут нельзя при первом же прочтении правильно определить
часть речи. "Глокая" - это прилагательное ведь? А в этом тексте: "Глокая,
куздра штеко будланула бокра и кудрячит бокрёнка"? Здесь это слово выступает
уже в роли деепричастия. Прочие слова, позиция слова и знаки препинания влияют на
часть речи, которой является слово. Именно поэтому за один проход по тексту задача
определения части речи каждого слова не решается.
Вариант решения, собственно, такой: итеративное решение системы уравнений. На каждой
итерации мы составляем некоторое приближённое представление о параметрах слов, входящих
в предложение. На следующем этапе просиходит уточнение предыдущего представления.
На первом шаге мы ничего не знаем о словах, и пытаемся угадать часть речи каждого
слова отдельно, лишь исходя из морфологических правил. Для каждого слова сущсетвует
несколкьо альтернатив. Слово "глокая", к примеру, может оказаться прилагательным
(скорее всего), деепричастием, существительным. Выбирается наиболее вероятный вариант,
остальные также запоминаются.
Далее предпринимается попытка собирать из слов цепочки для дерева, применить к ним
синтаксические правила. Каждое слово должно подчиняться какому-нибудь другому, кроме
подлежащего и сказуемого. Если же дерево не собирается, некоторые переменные для
ряда слов должны быть изменены. программа находит слова, несостыковывающеся с большинством
остальных и меняет их характеристики (часть речи или признаки), а затем вновь пытается
объединить всё предложение в смысловое дерево.
Если все попытки будут исчерпаны, а дерево так и не удалось построить, то это означает,
что для нашей программы входное предложение некорректно или не может быть понято
на данном этапе развития. Оно либо исключается из рассмотрения, либо анализируется
в допустимом объёме, либо же программа задаёт по нему дополнительные вопросы, если
это возможно.
Что же требуется для решения задачи?
- Определить окончательный формат записи всех правил и данных.
- Ввести словари служебных слов.
- Ввести правила морфологии.
- Ввести правила синтаксиса.
- Написать программу, решающую поставленную задачу, проработав алгоритм решения системы
уравнений.
- Предоставить какой-то интерфейс для работы с программой.
Поставленные требования намного проще осуществить, чем составлять словари всех слов
языка и их словоформ - это на самом деле громоздкая и неэффективная задача. В принципе,
уже можно переходить к выполнению этих пунктов. После решения будут возможны дальнейшие
исследования.