Введение - twin persona

advertisement
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное агентство по образованию
Федеральное государственное образовательное учреждение
высшего профессионального образования
«Санкт-Петербургский государственный университет»
Филологический факультет
Кафедра информационных систем в искусстве и гуманитарных науках
Специальность
«Прикладная информатика
в области искусств и гуманитарных наук»
Курсовая работа по специализации
«Электронные коллекции в гуманитарной сфере»
Конкорданс акцентуированного корпуса современного
русского языка
Студентки 4 курса
Рощиной Александры Сергеевны
Руководитель
доц., к.ф.-м.н.
В. А. Капустин
Санкт-Петербург
2006
2
Аннотация
Отчет 29 с., 3 ч., 2 рис., 2 табл., 5 источников, 2 прил.
КОНКОРДАНСЕР, КОНКОРДАНС, КОРПУС ТЕКСТОВ, СЛОВОФОРМА,
РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ, КОРПУСНАЯ ЛИНГВИСТИКА, НАЦИОНАЛЬНЫЙ
КОРПУС РУССКОГО ЯЗЫКА
Объектом исследования являются тексты, разработанные в рамках проекта
«Национальный корпус русского языка».
Цель работы – создание программы-конкордансера для построения конкорданса
текстов указанного выше проекта.
В
процессе
работы
строились
веб-интерфейсы
для
взаимодействия
с
пользователем и шаблоны на языке регулярных выражений для нахождения
совпадений в текстах корпуса с запрошенной пользователем словоформой.
В результате была создана программа-конкордансер, позволяющая получить
список
вхождений
запрошенной
словоформы
(включая
контекст
найденной
словоформы) в тексты корпуса, а также пожанровую и подокументную частотность
данной словоформы.
Основные конструктивные и технико-эксплуатационные показатели: высокое
качество и наглядность результатов поиска.
Степень внедрения  программа является одной из частей сайта, посвященного
упомянутому проекту.
Эффективность программы – в качественной обработке текстового материала
корпуса. Программа может быть использована для исследований в области корпусной
лингвистики.
3
Содержание
ВВЕДЕНИЕ ................................................................................................................ 5
1 КОРПУСНАЯ ЛИНГВИСТИКА И СОЗДАНИЕ КОРПУСА.................................... 6
1.1 Определения ..........................................................................................................6
1.2 История создания корпусов ................................................................................7
1.3 Репрезентативность корпуса ..............................................................................9
1.4 Национальный корпус русского языка ............................................................9
2 КОНКОРДАНСЫ И КОНКОРДАНСЕРЫ ........................................................... 11
3 ОПИСАНИЕ КОНКОРДАНСЕРА ДЛЯ НАЦИОНАЛЬНОГО КОРПУСА
РУССКОГО ЯЗЫКА ................................................................................................ 14
3.1 Общее описание ...................................................................................................14
3.1.1 Структура корпуса .........................................................................................14
3.1.2 Интерфейс программы ..................................................................................14
3.1.3 Принцип поиска .............................................................................................15
3.1.4 Вывод результатов .........................................................................................15
3.1.5 Алгоритм работы программы .......................................................................15
3.2 Комментарии к программе ...............................................................................17
3.2.1 Определение рабочих переменных и констант...........................................17
3.2.2 Обработка запроса пользователя..................................................................18
3.2.3 Создание шаблонов поиска...........................................................................20
3.2.4 Просмотр текстов и сохранение результатов поиска .................................21
3.2.5 Генерирование результатов поиска и создание протокола запроса .........24
ЗАКЛЮЧЕНИЕ ........................................................................................................ 26
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ ................................................... 27
ПРИЛОЖЕНИЕ А ПРИМЕР ПОЛЬЗОВАТЕЛЬСКОГО ЗАПРОСА .................... 28
ПРИЛОЖЕНИЕ Б ПРИМЕР ВЫВОДА РЕЗУЛЬТАТОВ ЗАПРОСА .................. 29
4
Определения, обозначения и сокращения
В настоящем отчете о курсовой работе применяют следующие термины с
соответствующими определениями:
Англ.
Английский
ИПС
Информационно-поисковые системы
Конкордансер
программа построения конкорданса
Корпус текстов
Некоторое собрание текстов, в основе которого
лежит логический замысел и логическая идея
(реализована в правилах организации текстов в
корпус, в алгоритмах
и программах анализа),
объединяющая эти тексты. Словоформа  слово,
рассматриваемое как представитель определенной
лексемы и определенной грамматической формы
Корпусная лингвистика
Наука,
разрабатывающая
общие
принципы
построения лингвистических корпусов данных с
использованием
современных
компьютерных
технологий
РАН
Российская Академия Наук
Репрезентативность корпуса
Качество,
присущее
корпусу
текстов,
определяющее достоверность полученных на нем
результатов
Словарь-конкорданс
Словарь примеров употребления слов в контексте
фиксированной длины
СНГ
Содружество независимых государств
СПб
Санкт-Петербург
Текстоформа
Набор знаков «от пробела (знака препинания) до
пробела
(знака
обработке текстов
препинания)»
при
машинной
5
Введение
В последней четверти XX века возникла и начала бурно развиваться
информатика. Новые технологии постепенно проникли во все области человеческой
жизни, ознаменовывая переход общества в информационную эру. Традиционная для
индустриальной эпохи ориентация на массовое стандартизованное производство
товаров, стремление к одинаковости и предсказуемости интересов различных слоев
населения сменились на признание индивидуальности и уникальности увлечений
людей одной социальной группы, переход на больший в процентном отношении упор
на производство услуг, появление новой формы стратификации общества – не на
основе доступности значительной денежной массы, а на основе обладания
определенным знанием в той или иной предметной области. Таким образом, важная
роль
отводится
возможности
авторизованного
или
свободного
доступа
к
определенному информационному ресурсу как форме представления данных и знаний.
Новая компьютеризированная среда открывает широкие перспективы для
исследования
огромных
массивов
информации
не
вручную,
а
с
помощью
высокоскоростных технологий современного вычислительного оборудования.
Внедрение таких технологий создало условия для развития корпусной
лингвистики, занимающейся разработкой, созданием и использованием текстовых
корпусов – электронных коллекций текстов, подготовленных специально (отобранных
и специфически размеченных) для научных исследований. Важной частью работы с
корпусом является создания конкорданса для представления всех словоформ,
встретившихся в корпусе, и конкордансера – программы, осуществляющей обработку
материалов корпуса.
Корпусная лингвистика ставит перед собой проблему описания некоей
конкретной языковой системы на основе изучения непосредственной коммуникации
людей и фиксирования речевого материала в корпусе текстов, пригодном для
дальнейшего эффективного использования другими лингвистическими дисциплинами.
Целью данной курсовой работы было создание программы-конкордансера для
построения конкорданса на основе материалов проекта «Национальный корпус
русского
языка»
В.Б.Касевич).
(руководитель
Л.А.Вербицкая,
ответственный
исполнитель
6
1 Корпусная лингвистика и создание корпуса
1.1 Определения
В современном обществе все более совершенствуются и усложняются процессы
коммуникации между людьми. С возникновением компьютеров появляются такие
формы общения, как, например, Интернет. Новые отношения требуют тщательного
изучения, для того, чтобы в изменившихся условиях человек не потерял способности
адекватно воспринимать окружающий мир и эффективно строить свою речь в рамках
своей культурной традиции. Наравне с этим, с появлением вычислительной техники,
способной быстро обрабатывать огромные массивы текстовой информации, лингвистыисследователи получают мощный аппарат для изучения языка и выявления не
известных ранее закономерностей. Для изучения же языка лингвистам необходимо
иметь для работы доступный и компактный речевой материал, достаточно полно
отражающий реальную речевую действительность. То есть возникает потребность в так
называемых корпусах текстов, представленных в электронном виде.
Главными целями корпусной лингвистики, по словам В. Рыкова [1], являются:
 лингвистическое описание языковой системы
 особый способ отражения речевого материала в корпусе текстов, который
может использоваться другими лингвистическими дисциплинами
В отличие от традиционной лингвистики, корпусная занимается не изучением
языка, а изучением речи во всех ее проявлениях (художественная, научная,
разговорная,..), представленной в корпусе специально подобранных текстов. Часто
здесь используются вероятностные, статистические и индуктивные методы обработки
материала, а не логические рассуждения и дедукция традиционной лингвистики,
больше доверяют эмпирически собранным данным, а не процедурам и оценкам,
полученным в результате накопления опыта многовековых исследований. Основным
рабочим
инструментом
для
корпусной
лингвистики
представляется
корпус,
описывающий речевую деятельность в пределах одного или нескольких языков, а
также поднимаются вопросы кодирования материалов корпуса для оптимизации
последующего поиска в корпусе.
Определение корпуса можно дать, основываясь на четырех основных признаках:
7
 обязательное размещение на машинном носителе
 особая разметка, позволяющая применять процедуры электронного поиска
(морфологическая, синтаксическая и т.д.)
 конечный размер
 репрезентативность (отражение достаточного, в идеале – полного, множества
жанров, представленных в языке)
1.2 История создания корпусов
С появлением вычислительной техники корпусная лингвистика начала бурно
развиваться. Первым корпусом, обладавшим свойством репрезентативности, был
Брауновский Корпус (Brown Corpus), созданный в 1960-е гг. в США в Университете
Брауна. В него были включены тексты, опубликованные в США в 1961 году. Объем его
составлял 500 фрагментов по 2000 слов в каждом. В соответствии со специальной
иерархией жанров были взяты по 5 фрагментов из ежедневной прессы и 2 из
еженедельной, фрагменты 4-х детективных рассказов и 20 романов. Первоначальный
вариант не содержал никакой особой разметки и был представлен в простом текстовом
формате. Авторы корпуса У.Френсис и Г. Кучера опирались на следующие критерии
отбора текстов [2]:
 происхождение и состав текста (автор должен быть урожденным носителем
американского варианта английского языка, диалог должен был занимать
менее половины объема текста)
 синхронизация (включены тексты, впервые изданные в 1961 году)
 продуманное соотношение численной представленности различных жанров и
отбор отдельных текстов при помощи особой вероятностной процедуры
 доступность для компьютерной обработки (специальные пометы для
передачи особенностей текста и т.д.)
Брауновский Корпус стал эталонным для построения аналогичных корпусов в
других странах, задав стандарт в 1 млн. слов. Позже было обнаружено, что подобный
стандарт не является удовлетворительным. При использовании статистических методов
можно было говорить об адекватном отражении действительности только при наличии
репрезентативной выборки и внушительного объема текстов. Так созданный по
8
принципу Брауновского Упсальский Корпус (Университет Упсалы, Швеция), объем
которого составлял так же примерно 1 млн. слов, оказался достаточно ограничен в
отношении представленности в нем достаточного числа жанров.
Таблица 1 – Самые важные корпуса текстов
№
Название
Год
Количество
словоупотреблений
Язык
1
BUC
1964
1 000 000
Англ.(USA) печатный
2
AHI
1971
5 000 000
Англ.(USA) печатный
3
LOB
1978
1 000 000
Англ.(G.B) печатный
4
Birmingem corpus
1987
20 000 000
Англ.(G.B) печатный
5
Kolhapur corpus
1988
1 000 000
Aнгл.(Индийский)
6
TOSCA
1988
1.5 000 000
Англ.(G.B) печатный
7
SEU Corpus
1989
1 000 000
Англ.(G.B) печатный
8
CHILDES
1990
20 000 000
Aнгл.(детский) устный
9
Nijmengen
1991
132 000 000
10 LLELC
1991
50 000 000
11 Map Task Corpus
1991
147 000 000
Англ.(Scotland) устный
12 LCLE
1992
10 000 000
Англ. печатный (для
иностранцев)
13 SEC
1992
53 000 000
Англ.(G.B) устный
14 Wellington Corpus
1993
1 000 000
Англ.(Новозеланд.)
печатный
15 POW
1993
65 000 000
Англ.(детский) устный
16 BNC
1995
100 000 000
Англ.(G.B)
устный,
письменный, печатный
17 Corpus of Spoken
1991
2 000 000
18 ICLE
1997
200 000 000
Англ. письменный (для
иностранцев)
19 Bank of English
1997
320 000 000
Англ.(G.B) печатный
Англ.(G.B)
устный
печатный,
Англ.
устный
печатный,
Англ.(USA) устный
По мере роста мощностей компьютеров появилась возможность создания более
объемных и представительных корпусов. В Великобритании появился проект Банк
Английского (Bank of English) и Британский национальный корпус (BNC), который
9
изменил стандарт репрезентативности корпуса до 100 млн. слов, включения в корпус
полных текстов и образцов устной речи, добавления частеречной разметки и
возможности доступа через Интернет.
По принципам Британского были созданы Национальные корпуса многих
европейских языков (испанский, итальянский, хорватский). В Чехии, например, был
создан Чешский национальный корпус, включавший 100 млн. словоформ и открытый
для всеобщего доступа в 2000 году. В. В. Рыков приводит таблицу [1] с информацией о
самых важных корпусах текста в мире (таблица 1).
1.3 Репрезентативность корпуса
Очень важной оказывается проблема репрезентативности корпуса. Корпус
должен не только отражать все разнообразие изучаемого явления, но адекватно
определять место этого явления в жизни носителей данного языка.
Можно выделить следующие критерии отбора текста в корпус и оценки его
репрезентативности:
 корпусы
текстов,
стремящиеся
отразить
объективную
речевую
действительность во всем ее многообразии
 корпусы
текстов,
созданные
с
некой
конкретной,
интересующей
исследователя целью (корпус пословиц русского языка)
Корпусные лингвисты [3] считают, что репрезентативным можно назвать корпус
в
«1020
млн.
словоупотреблений»
при
условии
определенным
образом
организованного отбора текстов. Они также отмечают, то важным фактор здесь
является и то, что корпус «должен быть определенным образом сбалансирован по
жанрам» [3], то есть должны быть широко представлены художественные,
драматические, поэтические и т.д. тексты.
1.4 Национальный корпус русского языка
Национальный корпус представляет отражает все многообразие конкретного
языка, его стили, жанры, диалекты и т.д. Он может использоваться как для научных
исследований, для выявления тонкостей морфологии, грамматики или для составления
10
справок о той или иной области, литературоведческий изысканий, для нужд
педагогики.
Как говорит В.Б.Касевич, «Особенно насущной становится необходимость в
Национальном корпусе в условиях, когда российское общество ищет опору в решении
проблемы идентичности, что невозможно вне контекста языка – фундамента любой
культуры. Чрезвычайно важны и проблемы, связанные с поддержанием русского языка
в странах СНГ и в русской диаспоре дальнего зарубежья; решение этих проблем также
должно
опираться
на
постоянный
мониторинг
языкового
существования
в
соответствующих ареалах в соотнесенности с «языковой метрополией», что также
невозможно без специальной службы, ориентирующейся на материалы Национального
корпуса русского языка».
11
2 Конкордансы и конкордансеры
Словарь-конкорданс имеет довольно простое устройство. На вход пользователь
подает словоформу, имея возможность задать и определенные дополнительные
критерии поиска. На выходе система поиска по такому словарю – конкордансер –
выдает фиксированного размера контексты употребления искомой словоформы.
При современном развитии вычислительной техники стали доступны довольно
сложные и быстрые программы обработки большого объема текстового материала. В
некоторых лингвистических работах [4] такое современное понятие, как Интернет,
предлагается рассматривать как обширный корпус, обладающий уже необходимыми
свойствами. По своей природе все тексты в Интернете представлены в электронном
виде, таким образом, нет необходимости использовать сканер и последующую
трудоемкую обработку. К тому же Интернет в форме всевозможных форумов, чатов и
электронной
почты
решает
проблему
обычной
для
стандартного
корпуса
недостаточной представленности разговорной речи. А роль конкордансеров здесь
играют различные информационно-поисковые системы (ИПС), в состав которых входят
программы-роботы, сканирующие Интернет в поисках новой информации и
поддерживающие старую в актуальном состоянии, индекс, представляющий собой
построенную по определенным правилам базу данных для создания хорошо
организованной структуры представления текстовой информации, и, наконец,
непосредственно поисковая система, работающая с запросами пользователей. Индексы
таких систем воспринимаются как конкордансы к текстам, так как они включают в себя
инвертированные файлы, в которых содержатся взятые из текста лексические единицы
с соответствующей информацией об их местоположении в исходном тексте и
дополнительными сведениями. С точки зрения лингвистики, интересным кажется
вопрос о том, каким образом происходит порождение индекса, какие лексические
единицы попадают в инвертированные файлы, а какие признаются неинформативными.
В. П. Захаров отмечает [4] следующие особенности подобных систем:
 «грамотная» работа со словоформами – с одной стороны, способность ИПС
отождествлять разные текстоформы как словоформы одной и той же
лексемы, с другой стороны, возможность находить конкретную словоформу
 поиск слов с заданным или произвольным усечением, как правым, так и
левым
12
 индексирование полных текстов в полном объеме без исключения
 работа со словосочетаниями – учет расстояния между элементами
словосочетаний и порядка их следования
 различение больших и малых букв
Таблица 2 – сравнение популярных поисковых систем Интернета
Яндекс
Рамблер
Апорт
Google
AltaVista
+
+
+
_
_
Поиск
по
+
словоформе
_
+
+
+
Учет
синтагм
(неразрывных
+
словосочетаний)
+
+
+
+
Учет больших и +
малых букв
(в
синтагмах)
_
_
_
_
Частота
пословная
+
_
_
_
_
Частота
подокументная
+
+
+
+
+
Поиск по лемме
Захаров [4] приводит интересную таблицу, описывающую возможности
нескольких самых популярных поисковых систем Интернета (Яндекс, Рамблер, Апорт,
Google и AltaVista) (таблица 2).
ИПС способны предоставлять важную для лингвистических исследований
информацию, касающуюся частотности употребления данной конкретной словоформы
или лексемы, а также количество документов, содержащих эту словоформу или
лексему. На основе поиска по ИПС возможно проводить исследования частотности для
определения правильного написания иноязычного слова (например, «броузер» или
«браузер»). При этом нет необходимости тратить огромное количество времени на
составление корпуса с нуля для рассматриваемой очень узкой проблемы.
В настоящее время существует довольно много подобных программ,
позволяющих осуществлять обработку текстов корпуса. Примером может служить
корпус-менеджер
«Экспертная
возможностями являются [5]:
лингвистическая
система».
Основными
ее
13
 создание частотного словаря лексем и словоформ на основе выбранных
текстов
 просмотр контекста для любой единицы полученного частотного словаря
 разделение графического слова на слоги и создание частотного словаря
слогов
 сортировка словника
 обработка одновременно неограниченного количества файлов
 возможность создания корпуса текстов с внешней разметкой
 подсчет статистических данных для создаваемого корпуса текстов, а также
для отдельных текстов, входящих в корпус
 работа с исходными текстами в формате txt, doc и rtf, автоматическое
определение кодировки
Таким образом, становится ясно, что написание программы-конкордансера
является важной составляющей создания любого корпуса из-за специфики корпуса,
изначально
ориентированного
на
представление
в
электронной
форме,
обеспечивающей возможность обработки большого массива текстового материала и
получения обширных статистических данных именно программным путем.
14
3 Описание конкордансера для Национального корпуса
русского языка
3.1 Общее описание
Целью
данной
программы
является
составление
конкорданса
для
Национального корпуса русского языка. То есть необходимо, получив от пользователя
в качестве входного параметра определенную словоформу, произвести поиск по всем
текстам корпуса и предоставить:
 подокументную частотность словоформы
 пожанровую частотность
 саму словоформу в контексте
3.1.1 Структура корпуса
Материал,
для
обработки
которого
была
создана
данная
программа,
представляет собой корпус текстов, находящихся в файлах, распределенных по
группам, соответствующим четырем категориям жанров: художественная проза,
публицистика, научная литература (аналитика и обзоры, научно-популярная),
драматические
произведения.
Дополнительно
внутри
каждой
группы
файлы
сортируются по году добавления в корпус. Корпус занимает ~4 Mбайта и включает
~1 млн. словоупотреблений.
Тексты корпуса имеют акцентную разметку, предоставляя возможность
программно определить отличие между такими словами, как «любИм» или «лЮбим».
Соответственно эти слова будут иметь вид: «люби+м» и «лю+бим». Также вводится
понятие «составных слов» (сложных словоформ), под которыми понимаются
«сочетания, эквивалентные слову» (например, изо_дня+_в_де+нь), использующие
символ «_» для обозначения входящих в сложную словоформу отдельных частей.
3.1.2 Интерфейс программы
Программа реализована в виде web-приложения на языке PHP. Интерфейс
представляет собой форму, состоящую из одного текстового поля (для ввода
словоформы), двух флагов (задание эквивалентности «е» и «ё» и поиск в составных
словоформах) и кнопки начала поиска.
15
При выбранной опции поиска в составных словоформах ищутся не только
одиночные вхождения данной словоформы, но и ее появление в составе сложной
словоформы. Пока разрешено вводить не более трех простых словоформ.
Запрос может быть задан с использованием знаков ударения («+»  основное
ударение, «^»  дополнительное). В таком случае словоформа будет искаться именно в
таком виде (без вариаций ударения).
3.1.3 Принцип поиска
Используется прямой поиск по тексту (современные файловые системы
достаточно быстры для чтения), так как принятое в такой ситуации сохранение
необходимых текстовых кусков в базе данных оказывается в данном случае более
трудоемкой операцией. Используемый аппарат регулярных выражений также позволяет
обрабатывать материал достаточно быстро, так как почти не использует ссылок на уже
найденные части шаблона. В основном он используется для разбора ситуаций с
различением букв «е» и «ё», а также для анализа ударений. Таким образом,
производится полный просмотр исходных текстов, и предварительная обработка
текстов не делается.
Но для высокочастотных словоформ («она», «а» и др.) все же поиск происходит
недостаточно быстро. В связи с тем, что необходимо было уменьшить время,
затрачиваемое на поиск, решено было сохранять ненулевые результаты. Таким
образом, при повторном запросе одной и той и той же словоформы повторного поиска
по всему материалу корпуса не происходит.
3.1.4 Вывод результатов
Полученный конкорданс для удобства восприятия разбивается на страницы (по
20 контекстов на каждой). Над сведениями о частотности появления словоформы в
текстах
выводится
элемент
навигации
по
страницам
–
номер
страницы,
представляющий собой ссылку на нее. Контексты также разбиваются на категории:
драматургия, беллетристика, публицистика и научно-популярная литература. Каждая
категория для опять же для удобства отделяется от последующей горизонтальной
чертой.
3.1.5 Алгоритм работы программы
 определение рабочих переменных и констант;
16
 обработка запроса пользователя и проверка, были ли ранее запросы на поиск
данной словоформы. В приложении А приведено изображение внешнего
вида страницы с запросом. Если да, то обращения к текстам корпуса не
происходит, а сразу возвращается предыдущий результат
 создание шаблонов поиска. Для нахождения совпадений с заданной
словоформой используется язык регулярных выражений. Регулярные
выражения  это технология, которая позволяет задать шаблон и
осуществить поиск данных, соответствующих этому шаблону, в заданном
тексте, представленном в виде строки. Термин «шаблон» интуитивно
понятен, но, чтобы пояснить его, можно привести следующий пример. Если
задуматься над тем, что такое корректный e-mail адрес, то, вероятнее всего,
получится, что это набор цифр, букв, символов подчеркивания, затем 
символ «@», после  еще один такой же набор (имя сервера) + «.» и в конце
– две-три буквы зоны домена (ru, com) (в общем случае). Если теперь это
словесное описание представить в форму, понятной компьютеру, то в
результате и получится шаблон. Таким образом, по правилам языка
регулярных выражений (например, «*» обозначает, что предыдущий символ
может быть повторен ноль или более раз, или запись «[абв]» позволяет
указать на то, что ищутся строки, имеющие в некоторой позиции букву или
«а», или «б», или «в») создается шаблон для сопоставления с текстами
корпуса для нахождения совпадений. В общем виде регулярное выражение
записывается так: «/выражение/». Если же символ «/» встречается внутри
выражения, то перед ним необходимо поставить обратный слэш «\». Также
необходимо экранировать (ставить обратный слэш перед символами) такие
несущие смысловую нагрузку в языке регулярных выражений символы, как
«+» (предыдущий символ может быть повторен один или более раз), «*»
(предыдущий символ может быть повторен ноль или более раз), «?»
(предыдущий символ может быть повторен ноль или один раз), «^»
(соответствует началу строки), если необходимо найти именно такой символ
в тексте;
 просмотр текстов и сохранение результатов поиска;
17
 генерирование результатов поиска и создание протокола запроса: сохранение
информации о том, какого числа и во сколько был выполнен запрос, с какого
IP-адреса, какой броузер использовался, какая словоформа искалась, и
сколько всего вхождений было найдено в драматических произведениях,
художественно литературе, публицистике и научной литературе, а также,
сколько вхождений найдено в целом. В приложении Б приведено
изображение внешнего вида страницы вывода результата запроса.
3.2 Комментарии к программе
3.2.1 Определение рабочих переменных и констант
Прежде всего необходимо задать некоторые важные константы и переменные.
Так как тексты корпуса акцентуированы, во введенной пользователем
словоформе для правильного поиска необходимо проставить ударения. Для этого
создается константа шаблона, определяющего все гласные и имеющего вид:
«/[гласные]/»:
define('vowelsClass','/[аеёиоуыэюяАЕЁИОУЫЭЮЯ]/') ;
Выражение для создания шаблона для определения того, что пользователь ввел
словоформу, разметив ее ударение(я). Символ «|» обозначает «или». В данном случае
создается выражение, которое затем будет подставлено в конструкцию «/выражение/»,
а не сам шаблон. Поэтому отсутствуют косые черты:
$stressPattern = '\+|\^' ;
Выражение для создания шаблона для определения того, что искать необходимо
сложную словоформу:
$compoundsPattern = '-|_' ;
Определяем количество контекстов на одной странице вывода:
define('RNum', 20);
Задаем название полей формы и текстовую метку каждого поля. Этот массив
создается для удобства вывода результатов в html-виде и проверки, отметит ли
пользователь дополнительные опции поиска. Он специфичен тем, что представляет
собой массив массивов. Внешний массив содержит всего два элемента (имеют форму
«ключзначение»), соответствующие названиям флагов дополнительных условий
18
поиска в форме. Значение ключа каждого из этих элементов описано массивом,
задающим имя флага в форме ввода и текстовую метку этого флага:
$checkboxes = array ( 'yo' => array
( cbName=>'yo',
cbLabel=>'«Е» и
«Ё» эквивалентны'
),
'compounds' => array
( cbName=>'compounds',
cbLabel=>'Искать и в составных
словоформах'
)
) ;
Далее идет основная часть программы.
3.2.2 Обработка запроса пользователя
Начинаем с обработки полученных из формы данных, которые хранятся в
массиве $_GET:
foreach ( $_GET as $k=>$v )
Нужно проверить, отмечен ли был один из двух флагов. Если пользователь
выбрал дополнительную опцию поиска ($v == 'on'), то создается переменная с именем,
соответствующим имени флага в форме поиска и принимает значение, равное 1:
if ( array_key_exists($k,$checkboxes) && $v != "")
${$k} = $v == 'on' ;
Проверяем, не пустое ли поле со словоформой. Если пустое, то специальную
переменную переводим в true. При этом отрезаются возможные пробелы во введенной
поисковой строке (функция trim), специальные символы заменяются на html-сущности
(функция htmlspecialchars) и удаляются возможные html- и php-теги:
if ( $k == "wf" )
{
$WF= trim(htmlspecialchars(strip_tags($v))) ;
if($WF == "")
$query_is_empty = true;
}
При обработке полученной информации возможен вариант, когда пользователь
не ввел новое слово для поиска, а переходит на следующую страницу вывода
контекстов, тогда передается номер необходимой страницы, который запоминается в
переменной $page:
if($k == 'page')
$page = trim(strip_tags($v));
19
Для перехода на новую страницу также надо получить позицию в массиве
контекстов, с которой будет на этой странице начинаться вывод:
if($k == 'start')
$RStart =
trim(strip_tags($_GET['start']));
Обработка варианта, когда пользователь только вошел на страницу поиска –
поле словоформы должно быть пустое:
if($WF == "wf")
$WF_initial = "";
else
$WF_initial = $WF;
Если в поисковой строке присутствуют пробелы, это автоматически будет
означать (независимо от того, была ли выбрана опция «Искать и в составных
словоформах»), что части, разделенные пробелами, будут рассматриваться как части
одной сложной словоформы. Таким образом, все пробелы заменяются на символ «_»
(разделитель для частей составной словоформы):
$WF_copy = $WF;
$WF_copy = preg_match("/\s/",$WF_copy) ?
preg_replace("/\s+/", "_+", $WF_copy) : $WF_copy ;
После обработки полученного от пользователя запроса необходимо создать
шаблон для осуществления поиска. Во-первых надо проверить, осуществлялся ли
поиск данной словоформы ранее. Вызывается функция check_previous_results, которая
просматривает каталог searchResults с сохраненными ответами и ищет совпадение
имени файла и данной словоформы + специальный индекс, получаемый из функции
file_indexes, вызывающейся из check_previous_res. Индекс складывается из двух цифр,
каждая из которых может быть либо 0, либо 1 в зависимости от того, был ли выставлен
каждый из флагов в «on» для данного запроса:
if($path_to_file = check_previous_results(searchResults,
$WF_copy, $checkboxes))
$searchedFor_previously = true
Если пользователь не запрашивал конкретную страницу, а только отправил
запрос, который до этого никто не вводил, то начинается формирование ответа.
Создаются переменные для подсчета частотности нахождения словоформы в каждом
разделе (драма, публицистика и т.д.) и подокументной частотности:
$found_1
$found_2
$found_3
$found_4
=
=
=
=
0;
0;
0;
0;
20
$found = 0;
$found_in_file = false;
Строка со словоформой разбивается по пробелам (если введено более трех слов,
то появляется предупреждение о невозможности работы программы с этим
количеством слов):
$w = split(" ", $WF);
if(count($w) > 3)
$to_much_words = true;
Поисковая строка обрабатывается в соответствии с правилом (в функции
checkLetter): если введена словоформа с заглавной буквы, то в таком виде она и будет
искаться, если же со строчной, – будет осуществляться поиск и с заглавной и со
строчной буквы:
$WF = checkLetter($WF);
3.2.3 Создание шаблонов поиска
Постепенно создается шаблон для поиска словоформы. Во-первых всем буквам
«е» добавляется как вариант «ё», если при запросе была выбрана дополнительная опция
«'Е' и 'Ё’ эквивалентны». При этом выражение «?:» (группировка без захвата) имеет
следующее значение. Любой блок, обрамленный в регулярном выражении скобками,
выделяется как единое целое и записывается в так называемый «карман». Содержимое
таких карманов автоматически помещается в специальный массив, обратившись к
которому можно получить отдельные части найденного цельного совпадения со всем
шаблоном, ради которых обычно и ведется вся работа. Если же скобки используются не
для создания кармана, например, а просто для удобства, то необходимо после
открывающей скобки поставить «?:»:
$pattern = isset($yo) ?
preg_replace('/(?:е|ё)/i','(?:е|ё)',$WF)
:$WF ;
Если пользователь сам поставил необходимые ударения, то они сохраняются
(специальные символы экранируются), иначе после каждой гласной добавляется
возможное ударение. Выражение «\\\\$0» обозначает следующее. В языке PHP
удвоенный слэш в строках обозначает один слэш. Таким образом строка «\\\\$0» ($0 
ссылка на весь найденный шаблон $stressPattern) воспринимается PHP как строка
«\\$0». Язык же регулярных выражений, в свою очередь, удвоенный обратный слэш
интерпретируется как строка «\». Так как используемые обозначения для ударения («^»
21
и «+») совпадают со значимыми для регулярных выражений символами, их необходимо
в шаблоне экранировать обратным слэшом:
$pattern = preg_match("/$stressPattern/",$pattern) ?
preg_replace("/$stressPattern/", "\\\\$0", $pattern):
preg_replace(vowelsClass, "$0(?:$stressPattern)?", $pattern);
Если был выставлен флаг поиска в сложных словоформах, то в шаблон
добавляется еще и вариант словоформы, в которой все пробелы заменены на «_» (знак,
которым разделяются части сложной словоформы). При этом возможны ситуации,
(предусмотренные шаблоном «_+»), когда используется знак «__» (двойной символ
«_»). Этим знаком обозначается «разрывная» составная словоформа (например,
«в__лице+»):
if(isset($compounds))
{
$pattern1 = preg_match("/\s/",$pattern) ?
preg_replace("/\s+/",
"_+", $pattern) : $pattern ;
$pattern = "(?:".$pattern."|".$pattern1.")";
}
Создаем переменную для хранения выражения, определяющего возможные
границы слов. Таковыми могут быть, помимо прочих: начало строки ($), конец строки
(^), «\s» (символ пробела) , «\t» (символ табуляции), «\n» (символ перевода строки) и
«\r» (символ возврата каретки):
$boundary = isset($compounds )? "(?:-|_|
|$|^|,|\.|:|;|!|\?|\r|\n|\t|\(|\)|\'|\")" :
"(?:\s|,|$|^|\.|:|;|!|\?|\r|\n|\t|\(|\)|\'|\")" ;
В итоге создается шаблон, в который на последнем шаге добавляются с обеих
сторон от словоформы возможные разделители слов (ищутся не части слов, а
отдельные слова):
$bPattern = "/$boundary$pattern$boundary/";
3.2.4 Просмотр текстов и сохранение результатов поиска
Далее начинается непосредственная обработка текстов корпуса. Перебирая
подряд все жанры и файлы корпуса (с помощью функции getFiles), считывается
содержимое этих файлов, и последующие операции выполняются для каждой
полученной строки, если она не пустая:
foreach ($genres as $v)
{
foreach (getFiles(corpus.strtoupper($v[path])) as
22
$filename)
{
$file = file($filename) ;
foreach ( $file as $lineNo=>$line )
{
$line = strip_tags(trim($line) );
if ( $line == '' ) { continue ; }
Сохраняется строка с заглавием документа. Ищется первая строка документа, и
из нее удаляются скобки (тексты корпуса отформатированы с так, что заглавие
заключено в квадратные скобки) «[» и «]»:
if($lineNo=0)
$header = preg_replace('/(?:\[|\])/','',$line);
Если в текущей строке было найдено совпадение с шаблоном, то увеличивается
счетчик вхождений словоформы в текущем жанре и переменная – индикатор файлов с
данной словоформой – выставляется в true:
if ( preg_match($bPattern,$line))
{
$tmp = 'found_'.$number;
$found_in_file = true;
$$tmp++;
С помощью функции glowLine в строке выделяется особым цветом найденная
словоформа:
$collectedLine =
glowLine($line,$nonBracket,$inBrackets,$pattern) ;
Для
вывода
контекста
найденной
словоформы
необходимо
получить
предыдущие и последующие две строки (всего пять). При этом в этих дополнительных
строках также проверяются и выделяются цветом glowLine дополнительные вхождения
словоформы:
for ( $l=$lineNo-1, $count=0; ($count<_LIMIT_)
and ($l>$headerLines); --$l )
{
if ( trim($file[$l]) == '' )
{
$collectedLine = delimiterParagraph .
$collectedLine ;
} else
{
$collectedLine = glowLine($file[$l],$nonBracket,
$inBrackets,$pattern) . '<br>' .
$collectedLine ;
++$count
}
for ( $l=$lineNo+1, $count=0; ($count<_LIMIT_)
and ($l<count($file)); ++$l )
23
{
if ( trim($file[$l]) == '' )
{
$collectedLine .= delimiterParagraph ;
} else
{
if($count == 0) $collectedLine .= "<br>";
glowLine($file[$l],$nonBracket,$inBrackets,
$pattern,$ur).'<br>';
$collectedLine .= glowLine($file[$l],$nonBracket,
$inBrackets,$pattern).'<br>';
++$count ;
}
Добавляются многоточия в начале и в конце абзаца контекста.
В специальный массив записываются все полученные результаты поиска для
последующего вывода пользователю. При этом строка с именем автора получается из
строки заглавия (имя автора отделено от остальной части точкой):
$collectedLine = "...".$collectedLine."...";
array_push( $res, array ( genre=>$v[title], lineNo=>$lineNo,
line=>$collectedLine , textName=>$ar[4],
header=>$header,
author=>preg_replace('/\..*$/','',$header))
) ;
Если в данном файле было найдено вхождение искомой словоформы, то
переменная для подокументной частотности увеличивается на единицу:
if($found_in_file)
$found++;
Теперь надо записать файлы в папке searchResults, сохраняющие полученный
ответ. Перебираем записи в массиве результатов $res, предварительно создав папку для
этого ответа:
if($i == 1)
mkdir(searchResults.$WF_copy."+".file_indexes($checkboxes),
0777);
Добавляем к строке со словоформой индекс, созданный функцией file_indexes и
создаем текстовый файл с полученным именем:
$fn = searchResults.$WF_copy."+".file_indexes($checkboxes)
."/".$i.".txt";
Записываем в файл всю полученную в результате поиска информацию:
$f = fopen($fn, "a+");
fwrite($f, count($res)."\n$found\n
$found_1\n$found_2\n$found_3\n$found_4\n"
fclose($f);
24
Открываем файл с первой страницей и его содержимое помещаем в переменную
для вывода на экран:
$filePath = searchResults.$WF_copy."+".
file_indexes($checkboxes)."/"."1.txt";
$text = file($filePath);
Если же пользователь запросил конкретную страницу, передав ее номер в
переменной $page, то читается файл с этой страницей и предварительный поиск не
осуществляется:
$filePath = searchResults.$path_to_file."/".$page.".txt";
$text = file($filePath);
3.2.5 Генерирование результатов поиска и создание протокола запроса
Необходимо в форме запроса при переходе со страницы на страницу сохранять
информацию о том, какие флаги отметил пользователь, и оставлять неизменной саму
словоформу в текстовом поле. Эти данные передаются при каждом переходе, читаются
и записываются в форму:
foreach ( $checkboxes as $k=>$v )
{
?><tr>
<td>
<input type="checkbox" name="<? echo $v[cbName]
?>"
<?echo (isset(${$k})) ? ${$k} = 'checked':
${$k} = ''?>>
</td><td colspan="3">
<? echo $v[cbLabel]?>
</td>
</tr>
<?
При выводе информации предусмотрено сообщение о том, что не была введена
ни одна словоформа:
if($query_is_empty)
{
?>
<aclass='d'><br>Поисковая строка пуста</a>
<?
}
Обработка предупреждения о превышении лимита допустимого количества слов
в запросе:
if($to_much_words)
{
?><p class="d">Разрешено вводить не более трех
словоформ</p><?
25
exit();
}
Обработка ситуации, когда словоформа не найдена:
if(count($_GET)>0)
{
if($nothing_found)
{
?><p class="d">Искомая словоформа в корпусе не
найдена</p><?
}
В итоге получаем либо первую страницу, либо необходимую страницу с
контекстами. Для показа найденных страниц пользователю используется функция
ShowPageNumbers, высчитывающая какое количество страниц необходимо для
отображения всей полученной информации и выводящая ссылки на страницы.
В самом конце пишется протокол запроса (дата запроса, время, адрес клиента,
информация о клиенте, искомая словоформа, количество упоминаний в каждом жанре
и общее число упоминаний) в специальный файл с помощью функции makeProtocol.
И, наконец, вся полученная информация выводится на экран:
else{
if(!isset($page))
$page = 1;
ShowPageNumbers($text[0], $WF_initial, $yo, $compounds,
$page);
results_header($text[0], $text[1], $text[2], $text[3],
$text[4], $text[5]);
makeProtocol($WF_initial, $text[3], $text[2], $text[4],
$text[5], $text[0], text[1]);
echo $data;
ShowPageNumbers($text[0], $WF_initial, $yo, $compounds,
$page);
?>
26
Заключение
В процессе работы над данной курсовой был прочитан и осознан материал
нескольких докладов и работ в области корпусной лингвистики. Эта сфера в данный
момент вызывает живой интерес со стороны исследователей языка и открывает
широкие
возможности
анализа
данных
на
основе
применения
современных
информационных технологий, позволяющих обрабатывать текстовый материал
значительного объема.
Созданная программа представляет собой часть реализации web-представления
проекта «Национальный корпус русского языка». Данный конкордансер позволяет
осуществлять поиск словоформы (последовательности словоформ) с несколькими
опциями
и
получать
на
выходе
список
подокументную и пожанровую частотность.
контекстов
словоформы,
а
также
27
Список использованных источников
1. Balkan Rusistics [Электронный ресурс] = Балканская Русистика =
совместный проект балканских русистов / Софийский гос. ун-т им. Св.
Климента Охридского, Факультет Славянских филологий; Адм-ры сайта
Айдукович Й., Градинарова А.  Электрон. дан.  София; Белград. 
Режим доступа: http://www.russian.slavica.org/article3.html, свободный. 
Загл. с экрана.
2. Рыков В.В. Прагматически ориентированный корпус текстов / В. В.
Рыков // Тверской лингвистический меридиан.  1999.  Выпуск 3. – С.
8996.
3. Вербицкая Л.А., Казанский Н.Н., Касевич В.Б. Некоторые проблемы
создания национального корпуса русского языка / Л. А. Вербицкая, Н. Н.
Казанский, В. Б. Касевич // Научно-техническая информация.  2003. 
№ 6.  С. 28.  ISSN 05480027.
4. Захаров В.П., Толбаст С.П. Поисковые системы сети Интернет и
корпусные исследования // Труды международной конференции
«MegaLing’2005. Прикладная лингвистика в поиске новых путей», 27
июня — 2 июля 2005 г., Меганом, Крым, Украина / Санкт-Петербургский
государственный университет (Россия), Таврический национальный
университет им. В.И. Вернадского (Украина), Таврический
экологический институт (Украина). — СПб.: Издательство «Осипов»,
2005.  С. 50.
5. Аверин А.Н. Разработка корпус-менеджера: программа «Экспертная
лингвистическая система» // Труды международной конференции
«MegaLing’2005. Прикладная лингвистика в поиске новых путей», 27
июня — 2 июля 2005 г., Меганом, Крым, Украина / Санкт-Петербургский
государственный университет (Россия), Таврический национальный
университет им. В.И. Вернадского (Украина), Таврический
экологический институт (Украина). — СПб.: Издательство «Осипов»,
2005.  С. 5.
28
Приложение А А
Пример пользовательского запроса
Рисунок А.1
29
Приложение Б Б
Пример вывода результатов запроса
Рисунок Б.1
Download