Диссертация (1137159), страница 30
Текст из файла (страница 30)
е.продукций пустых цепочек.Словарь_Союзов— словарь слов-индикаторов, являющихся соединяющимидля двух объектов интереса (обычные союзы).Словарь_Доп_Указателейдополнительными«функционировать».—указателями.словарьслов-индикаторов,Примеры:«работать»,являющихся«вести»,199Выход:Отличит_Слово — слово-индикатор, по которому был определен типзапроса. Имеет тип Расш_Слово.Объект_Интереса1массив—элементовтипаРасш_Слово,представляющий первый объект интереса. Объект интереса может состоять изнескольких слов, поэтому все они должны быть возвращены как значимые.Объект_Интереса2массив—элементовтипаРасш_Слово,представляющий второй объект интереса.Доп_Объект_Интереса—массивэлементовтипаРасш_Слово,представляющий дополнительный объект интереса.Алгоритм «Разбор_Запр_ОП_ОСОБ»начОбъект_Найден := ложьi := f := s := a := 0пока Запрос(i) <> nil циклесли Вхождение_Слова_В_Словарь(Запрос(i)::Баз_Формы,Словарь_Доп_Слов)Отличит_Слово := Запрос(i)Объект_Найден := ложьj := i+1пока Запрос(j) <> nil циклеслиЗапрос(j-1)::Содержит_Стем(«отличительный»)Запрос(j)::Содержит_Стем(«черта»)начать цикл с j+1кеслиесли ! Вхождение_Слова_В_Словарь(Запрос(j)::Баз_Формы,Словарь_Запр_Слов)если Вхождение_Слова_В_Словарь(Запрос(j)::Баз_Формы,Словарь_Доп_Указателей)И200Доп_Объект_Интереса := Запрос(j)начать цикл с j+1кесликеслиесли Вхождение_Слова_В_Словарь(Запрос(j)::Баз_Формы,Словарь_Союзов)Объект_Найден := ложьначать цикл с j+1кеслиесли Объект_НайденОбъект_Интереса2(s) := Запрос(j)s := s+1иначеОбъект_Интереса1(f) := Запрос(j)f := f+1кеслиj := j+1кциклесли Объект_Интереса1 == пустой_массивj := 0пока Запрос(j) <> nil циклесли ! Вхождение_Слова_В_Словарь(Запрос(j)::Баз_Формы,Словарь_Доп_Слов)если ! Вхождение_Слова_В_Словарь(Запрос(j)::Баз_Формы,Словарь_Запр_Слов)если ! Вхождение_Слова_В_Словарь(Запрос(j)::Баз_Формы,Словарь_Доп_Указателей)Объект_Интереса1(f) := Запрос(j)201f := f+1кесликеслииначевыход циклкеслиj := j+1кциклкесливыходиначеесли Вхождение_Слова_В_Словарь(Запрос(j)::Баз_Формы,Словарь_Доп_Указателей)Объект_Найден := ложьДоп_Объект_Интереса(a) := Запрос(i)a := a+1j := i+1пока Запрос(j) <> nil циклесли ! Вхождение_Слова_В_Словарь(Запрос(j)::Баз_Формы,Словарь_Запр_Слов)если Вхождение_Слова_В_Словарь(Запрос(j)::Баз_Формы,Словарь_Союзов)Объект_Найден := истинаначать цикл с j+1кесликеслиесли Объект_НайденОбъект_Интереса2(s) := Запрос(j)s := s+1иначе202Объект_Интереса1(f) := Запрос(j)f := f+1кеслиj := j+1кциклкесливыходкеслиi := i+1кциклконАлгоритм разбора части запроса с целью выявления датыВнешняя спецификация алгоритма «Определение_Даты»Назначение:Алгоритм предназначен для определения даты, относительно которой можетсодержаться информация в части запроса.
Алгоритм обрабатывает ситуациивида «позапрошлый год», «год назад», «5 лет назад», «в 1998 году», «три годаназад». Это позволяет однозначно определять год, относительно которогозапрашивается информация. Временной интервал меньшей длительности нерассматривается в силу того, что нахождение информации подобного рода наобщедоступных ресурсах маловероятно.В алгоритме используется метод «Содержит_Стем», описанный впараграфе 2.7. Данный метод возвращает истину или ложь в зависимости оттого, содержится ли поданное на вход слово в массиве базовых форм словаБаз_Формы.Используетсяследующимобразом:слово::Содержит_Стем(набор_символов), где слово — объект, имеющий типРасш_Слово, а набор_символов — некоторый текст, который необходимообнаружить в массиве Баз_Формы.203Также в алгоритме используется метод «Число?», который возвращаетзначения «истина» или «ложь» в зависимости от того, является ли текущийэлемент запроса символом, представляющим число.
Например, «9», «2010».Работа данного метода основана на регулярных выражениях, реализациякоторых специфична для выбираемой платформы реализации.Дополнительно используется подалгоритм «Символ-Цифра», которыйпозволяет преобразовать числительные «один», «два», «пара», «три», «четыре»,«пять», «шесть», «семь», «восемь», «девять» и «десять» в соответствующие имцифры. Данный алгоритм является тривиальным и основан на прямомсопоставление входного слова одному из числительных. Если совпадениенайдено, то возвращается соответствующая цифра, в противном случаевозвращается nil. Обращение к подалгоритму происходит следующим образом:Результат:=Символ-Цифра(слово),гдерезультат—эторезультатвыполнения подалгоритма, а слово — это объект типа Расш_Слово,подлежащий проверке.Вход:Запрос — массив слов поискового запроса, состоящий из элементов типаРасш_Слово.f — индекс элемента, с которого начинается проход по части массива Запрос.Тип_Запр — тип запроса.Выход:Дата — массив элементов типа Расш_Слово, содержащий информацию одате, если таковая обнаружена в оставшейся части запроса.Результат — логическая переменная, принимающая значение истина, еслидата была найдена в части запроса и ложь — в противном случае.Внутренние переменные:Текущий_Словарь — текущий словарь слов-индикаторов с типом ДОП_ТР.Определяется в зависимости от типа запроса поданного на вход.Дельта — цифровое обозначение для вычисления дат вида «прошлый год» и«позапрошлый год».204Текущий_Год — переменная, обозначающая цифровое представлениетекущего года.
Например, 2011.Значение устанавливается методами,специфичными для выбранной платформы реализации.Алгоритм «Определение_Даты»начесли Тип_Запр == В_ДЦТекущий_Словарь := Словарь::Получить_Словарь(В_ДЦ, ДОП_ТР)кеслиесли Тип_Запр == В_ИМТекущий_Словарь := Словарь::Получить_Словарь(В_ИМ, ДОП_ТР)кеслиесли Вхождение_Слова_В_Словарь(Запрос(f)::Баз_Формы,Текущий_Словарь)Дельта := 0еслиЗапрос(f)::Содержит_Стем(«прошедший»)Запрос(f)::Баз_Формы::содержит(«прошлый»)Дельта := -1иначеесли Запрос(f)::Содержит_Стем(«позапрошлый»)Дельта := -2кесликеслиесли Запрос(f+1) <> nilесли Запрос(f)::Содержит_Стем(«год»)Дата(0) := Текущий_Год + ДельтаДата(1) := Запрос(f+1)ИЛИ205если Запрос(f+2) == nilРезультат := истинавыходиначеРезультат := ложьвыходкесликесликесликеслиесли Запрос(f)::Число?если Запрос(f+2) <> nilеслиЗапрос(f+1)::Содержит_Стем(«год»)Запрос(f+1)::Содержит_Стем(«назад»)Дата(0) := Текущий_Год — Запрос(f)Дата(1) := Запрос(f+1)если Запрос(f+2) == nilРезультат := истинавыходиначеРезультат := ложьвыходкесликеслииначеесли Запрос(f+1) <> nilесли Запрос(f+1)::Содержит_Стем(«год»)Дата(0) := Текущий_Год — Запрос(f)Дата(1) := Запрос(f+1)И206если Запрос(f+2) == nilРезультат := истинавыходиначеРезультат := ложьвыходкесликесликеслииначеДата(0) := Текущий_Год — Запрос(f)если Запрос(f+1) == nilРезультат := истинавыходиначеРезультат := ложьвыходкесликесликеслиесли Запрос(f)::Содержит_Стем(«год»)если Запрос(f+1) <> nil И Запрос(f+1)::Содержит_Стем(«назад»)Дата(0) := Текущий_Год — 1Дата(1) := Запрос(f)если Запрос(f+1) == nilРезультат := истинавыходиначеРезультат := ложь207выходкесликесликеслиесли Символ-Цифра(Запрос(f)) >0если Запрос(f+2) <> nilеслиЗапрос(f+1)::Содержит_Стем(«год»)Запрос(f+2)::Содержит_Стем(«назад»)Дата(0) := Текущий_Год — Слово-Цифра(Запрос(f))Дата(1) := Запрос(f+1)если Запрос(f+1) == nilРезультат := истинавыходиначеРезультат := ложьвыходкесликеслииначеесли Запрос(f+1) <> nil И Запрос(f+1)::Содержит_Стем(«год»)Дата(0) := Текущий_Год — Слово-Цифра(Запрос(f))Дата(1) := Запрос(f+1)если Запрос(f+1) == nilРезультат := истинавыходиначеРезультат := ложьвыходкеслиИ208кесликесликеслиРезультат := ложьконАлгоритм разбора статьи WiktionaryВнешняя спецификация алгоритма «Разбор_Wiki_Статьи»Назначение: Алгоритм предназначен для разбора статей из базы данныхWiktionary с целью выделения значений слова, его синонимов, гипонимовигиперонимов.Алгоритмтакжепредназначендляфильтрациинезначимых символьных последовательностей.
В алгоритме используютсябазовые функции работы со строками, присутствующие практически влюбом высокоуровневом языке программирования.Вход: МасСтр — массив строк, представляющий разбитый построчно текстстатьи.Выход: Значения, Синонимы, Гипонимы, Гиперонимы — значения, синонимы,гипонимы и гиперонимы соответственно, представленные структуройданных список.Внутренние переменные: ВремСписок — указатель на один из выходныхсписков. Используется для переключения между списками синонимов,гипонимов и т.д.; Строка, Шаблон, Pipe — логические переменные,выступающие в роли флагов; ВрСтрока — строковый массив дляхранения промежуточных результатов; РезСтрока, ВрСтрока2, Символ—строки для хранения промежуточных результатов.Алгоритм «Разбор_Wiki_Статьи»нач209Значения := Синонимы := Гипонимы := Гиперонимы := ВремСписок :=пустой_списокi := 0;пока МасСтрок[i] <> nil циклесли МасСтрок[i] <> пустая_строкаесли МасСтрок[i].содержит ("=== Значение ===")ВремСписок := Значенияиначе если МасСтрок[i].содержит ("=== Синонимы ===")ВремСписок := Синонимыиначе если МасСтрок[i].содержит ("=== Гипонимы ===")ВремСписок := Гипонимыиначе если МасСтрок[i].содержит ("=== Гиперонимы ===")ВремСписок := Гиперонимыиначе если МасСтрок[i].содержит ("==") выходесли МасСтрок[i].начинается_с ("#")ВрСтрока = пустой_массивесли МасСтрок[i].содержит("{{пример")ВрСтрока:=МасСтрок[i].подстрока(0,МасСтрок[i].позиция_строки("{{пример")).посимвольная_разбивкаиначеВрСтрока := МасСтрок[i].посимвольная_разбивкакесликеслиСтрока := Шаблон := Pipe := ложьРезСтрока := ВрСтрока2 := пустая_строка210j := 0пока ВрСтрока[j] <> nil циклСимвол := ВрСтрока[j]если Символ == "#" или Символ == "" продолжить цикл соследующего шагаесли Символ == "{"Шаблон := истинаесли ВрСтрока[j-1] =="]" или ВрСтрока[j-1] =="}"РезСтрока.добавить(" ")продолжить цикл со следующего шагакеслиесли Символ == "["Ссылка := истинаесли ВрСтрока[j-1] =="]" или ВрСтрока[j-1] ==РезСтрока.добавить(" ")продолжить цикл со следующего шагакеслиесли Символ == "]"Ссылка := ложьесли Шаблон == ложьРезСтрока.добавить(ВрСтрока2)ВрСтрока2 := пустая_строкакеслипродолжить цикл со следующего шагакесли"}"211если Символ == "}"Шаблон := ложьесли Pipe == истинаРезСтрока.добавить(ВрСтрока2)ВрСтрока2 := пустая_строкаPipe == ложьиначеВрСтрока2 := пустая_строкакеслипродолжить цикл со следующего шагакеслиесли Символ == "|"Pipe := истинаесли Ссылка == истина ИЛИ Шаблон == истинаВрСтрока2 := пустая_строкакеслипродолжить цикл со следующего шагакеслиесли Ссылка == истина ИЛИ Шаблон == истинаВрСтрока2.добавить(Символ)продолжить цикл со следующего шагакеслиесли Ссылка == ложь И Шаблон == ложьВрСтрока2.добавить(Символ)212кесликциклесли РезСтрока <> "" И РезСтрока <> "uk"ВрСписок.добавить (РезСтрока)кесликеслиi := i+1кциклконАлгоритм построения множества ExtSet для запросов о достижении целейВнешняя спецификация алгоритма «Расширение_В_ДЦ»АлгоритмНазначение:предназначендляпостроениямножествасемантически преобразованных запросов ExtSet для запросов о достиженияхцелей.