Игры будущего. Перевод текста в дерево

Mar 13, 2008 12:14

Перевод текста в дерево

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

Текст - набор одного или нескольких предложений, разделённых пробелами. Предложение - набор одного или нескольких слов, разделённых пробелами и, возможно, знаками препинания ' " ' (кавычки), ',' (запятая), ';' (точка с запятой), ':' (двоеточие), '-' (тире и дефис), '...' (многоточие), '(' и ')' (скобки), и заканчивающееся '.' (точкой), '!' (восклицательным знаком), '?' (вопросительным знаком) и '...' (многоточием), либо комбинацией нескольких знаков из трёх последних.

Анализ входного текста будет состоять из последовательного анализа каждого предложения. Анализ же предложения будет состоять из двух аспектов:
  1. Распознавание слов, входящих в предложение.
  2. Сборка слов в дерево.

Распознанным словом будет считать следующую конструкцию: Тип:Начальная_форма_слова(параметры_слова, форма_слова). Например: "видит" = Глагол: видеть(Вид: Несовершенный, Спряжение: 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 (Падеж: Именительный)

Что же нужно сделать? Нужно найти слова в начальной форме и формы для этих слов, такие, что они в этих формах совпадают со словами в предложении, а также согласуются между собой (и позволяют сформировать дерево).

Можно решать данную систему по-разному. Стоит учесть то, что нельзя разрешить систему сначала полностью для морфологических правил, а  потом уже решать её для  синтаксических. То есть нельзя определить формы и признаки слов без привязки к их позиции в предложении и без привязки к формам других слов. Аналогично нельзя построить дерево, не разобравшись сперва в том, из каких слов устроено предложение. Подходы к решению могут быть самые разные.

Задача более-менеее сформулирована, и теперь попробуем обозначить возможный метод её решения.

Одним из принципов нашей системы является аналогия с человечским мышлением. Как анализирует текст человек?

Обычно мы пробегаем глазами строчку и не возвращаемся назад, то есть понимаем смысл фразы за один проход по тексту. Иногда, когда предложение сложно сформулировано, приходится возвращаться назад и перечитывать фрагменты этого предложения, чтобы чётко уяснить связь между словами. Если нам встречаются незнакомые слова, то мы проходим их глазами несколько медленнее - ведь нужно определить, какими частями речи они являются.

В данном же случае мы читаем текст, не понимая ни единого слова (кроме служебных). То есть весь текст состоит из предложений вида "Глокая куздра штеко будланула бокра и кудрячит бокрёнка". И тут нельзя при первом же прочтении правильно определить часть речи. "Глокая" - это прилагательное ведь? А в этом тексте: "Глокая, куздра штеко будланула бокра и кудрячит бокрёнка"? Здесь это слово выступает уже в роли деепричастия. Прочие слова, позиция слова и знаки препинания влияют на часть речи, которой является слово. Именно поэтому за один проход по тексту задача определения части речи каждого слова не решается.

Вариант решения, собственно, такой: итеративное решение системы уравнений. На каждой итерации мы составляем некоторое приближённое представление о параметрах слов, входящих в предложение. На следующем этапе просиходит уточнение предыдущего представления.

На первом шаге мы ничего не знаем о словах, и пытаемся угадать часть речи каждого слова отдельно, лишь исходя из морфологических правил. Для каждого слова сущсетвует несколкьо альтернатив. Слово "глокая", к примеру, может оказаться прилагательным (скорее всего), деепричастием, существительным. Выбирается наиболее вероятный вариант, остальные также запоминаются.

Далее предпринимается попытка собирать из слов цепочки для дерева, применить к ним синтаксические правила. Каждое слово должно подчиняться какому-нибудь другому, кроме подлежащего и сказуемого. Если же дерево не собирается, некоторые переменные для ряда слов должны быть изменены. программа находит слова, несостыковывающеся с большинством остальных и меняет их характеристики (часть речи или признаки), а затем вновь пытается объединить всё предложение в смысловое дерево.

Если все попытки будут исчерпаны, а дерево так и не удалось построить, то это означает, что для нашей программы входное предложение некорректно или не может быть понято на данном этапе развития. Оно либо исключается из рассмотрения, либо анализируется в допустимом объёме, либо же программа задаёт по нему дополнительные вопросы, если это возможно.

Что же требуется для решения задачи?
  1. Определить окончательный формат записи всех правил и данных.
  2. Ввести словари служебных слов.
  3. Ввести правила морфологии.
  4. Ввести правила синтаксиса.
  5. Написать программу, решающую поставленную задачу, проработав алгоритм решения системы уравнений.
  6. Предоставить какой-то интерфейс для работы с программой.

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

Игры будущего

Previous post Next post
Up