Пусть, дано предложение “Съешьте еще этих мягких французских булок, да выпейте чаю.”, в котором нам нужно определить часть речи для каждого слова:
[(‘съешьте’, ‘глаг.’), (‘еще’, ‘нареч.’), (‘этих’, ‘местоим. прил.’), (‘мягких’, ‘прил.’), (‘французских’, ‘прил.’), (‘булок’, ‘сущ.’), (‘да’, ‘союз’), (‘выпейте’, ‘глаг.’), (‘чаю’, ‘сущ.’)]
Зачем это нужно? Например, для автоматического определения тегов для блог-поста (для отбора существительных). Морфологическая разметка является одним из первых этапов компьютерного анализа текста.
Существующие решения
Конечно, все уже придумано до нас. Существует mystem от Яндекса, TreeTagger с поддержкой русского языка, на питоне есть nltk, а также pymorphy от kmike. Все эти утилиты отлично работают, правда, у pymorphy нет поддержки питона 3, а у nltk поддержка третей версии питона только в бете (и там вечно что-то отваливается). Но реальная цель для создания модуля — академическая, понять как работает морфологический анализатор.
Алгоритм
- Обычно мы знаем к какой части речи относится знакомое нам слово. Например, мы знаем, что “съешьте” — это глагол.
- Если нам встречается слово, которое мы не знаем, то мы можем угадать часть речи, сравнивая с уже знакомыми словами. Например, мы можем догадаться, что слово “конгруэнтность” — это существительное, т.е. имеет окончание “-ость”, присущее обычно существительным.
- Мы также можем догадаться какая это часть речи, проследив за цепочкой слов в предложении: “съешьте французских x” — в этом примере, х скорее всего будет существительным.
- Длина слова также может дать полезную информацию. Если слово состоит всего лишь из одной или двух букв, то скорее всего это предлог, местоимение или союз.
Данные
Для обучения нашего скрипта я использовал национальный корпус русского языка. Часть корпуса, СинТагРус, представляет собой коллекцию текстов с размеченной информацией для каждого слова, такой как, часть речи, число, падеж, время глагола и т.д. Так выглядит часть корпуса в XML формате:
Предложения заключены в теги <se>, внутри которых расположены слова в теге <w>. Информация о каждом слове содержится в теге <ana>, аттрибут lex соответствует лексеме, gr — грамматические категории. Первая категория — это часть речи:
‘S’: ‘сущ.’,
‘A’: ‘прил.’,
‘NUM’: ‘числ.’,
‘A-NUM’: ‘числ.-прил.’,
‘V’: ‘глаг.’,
‘ADV’: ‘нареч.’,
‘PRAEDIC’: ‘предикатив’,
‘PARENTH’: ‘вводное’,
‘S-PRO’: ‘местоим. сущ.’,
‘A-PRO’: ‘местоим. прил.’,
‘ADV-PRO’: ‘местоим. нареч.’,
‘PRAEDIC-PRO’: ‘местоим. предик.’,
‘PR’: ‘предлог’,
‘CONJ’: ‘союз’,
‘PART’: ‘частица’,
‘INTJ’: ‘межд.’
В качестве алгоритма обучения я выбрал метод опорных векторов (SVM). Если вы не знакомы с SVM или алгоритмами машинного обучения в общем, то представьте, что SVM это некий черный ящик, который принимает на вход характеристики данных, а на выходе классификацию по заранее заданным категориям. В качестве характеристик мы зададим, например, окончание слова, а в качестве категорий — части речи.
Чтобы черный ящик автоматически распознавал часть речи, для начала его нужно обучить, т.е. дать много характеристик примеров на вход, и соответствующие им части речи на выход. SVM построит модель, которая при достаточных данных будет в большинстве случаев корректно определять часть речи.
Даже в академических целях реализовать SVM лень, поэтому воспользуемся готовой библиотекой LIBLINEAR на С++, которая имеет обертку для питона. Для обучения модели используем функцию train(prob, param), которая принимает в качестве первого аргумента задачу: problem(y, x), где y — это массив частей речи для каждого примера из массива x. Каждый пример представлен в свою очередь вектором характеристик. Чтобы добиться такой постановки задачи, нам нужно сначала соотнести каждую часть речи и каждую характеристику с неким числовым номером. Например:
- Читаем файл корпуса и для каждого слова определяем его характеристики: само слово, окончание (2 и 3 последних буквы), приставка (2 и 3 первые буквы), а также части речи предыдущих слов
- Каждой части речи и характеристике присваиваем порядковый номер и создаем задачу для обучения SVM
- Обучаем модель SVM
- Используем обученную модель для определения части речи слов в предложении: для этого каждое слово нужно опять представить в виде характеристик и подать на вход SVM модели, которая подберет наиболее подходящий класс, т.е. часть речи.
Реализация
С исходными кодами можете ознакомиться здесь: github.com/irokez/Pyrus/tree/master/src
Корпус
Хотя для наших целей пойдет и небольшая выборка из корпуса, доступная тут: www.ruscorpora.ru/download/shuffled_rnc.zip
Файлы в полученном архиве нужно пропустить через утилиту convert-rnc.py, которая переводит текст в UTF-8 и исправляет XML разметку. После этого, возможно, еще нужно пофиксить XML вручную (xmllint вам в помощь). Файл rnc.py содержит простой класс Reader для чтения нормализованных XML файлов нац. корпуса.
Метод Reader.read(self, filename) читает файл и выдает список предложений:
Обучение и разметка текста
cjlin/liblinear/. Чтобы обертка под питон заработала под 3-й версией я написал небольшой патч.
Файл pos.py содержит два основных класса: Tagger и TaggerFeatures. Tagger — это, собственно, класс, который осуществляет разметку текста, т.е. определяет для каждого слова его часть речи. Метод Tagger.train(self, sentences, labels) принимает в качестве аргументов список предложений (в том же формате, что и выдает rnc.Reader.read), а также список частей речи для каждого слова, после чего обучает SVM модель, используя библиотеку LIBLINEAR. Обученная модель впоследствии сохраняется (через метод Tagger.save), чтобы не обучать модель каждый раз. Метод Tagger.label(self, sentence) производит разметку предложения.
Класс TaggerFeatures предназначен для генерации характеристик для обучения и разметки. TaggerFeatures.from_body() возвращает характеристику по форме слова, т.е. возвращает ID слова в корпусе. TaggerFeatures.from_suffix() и TaggerFeatures.from_prefix() генерируют характеристики по окончанию и приставке слов.
Чтобы запустить обучение модели, был написан скрипт train.py, который читает файлы корпуса при помощи rnc.Reader, а затем вызывает метод Tagger.train:
После того, как модель обучена и сохранена, мы, наконец, получили скрипт для разметки текста. Пример использования показан в test.py:
Работает так:
$ src/test.py «Съешьте еще этих мягких французских булок, да выпейте же чаю»
[(‘Съешьте’, ‘глаг.’), (‘еще’, ‘нареч.’), (‘этих’, ‘местоим. прил.’), (‘мягких’, ‘прил.’), (‘французских’, ‘прил.’), (‘булок,’, ‘сущ.’), (‘да’, ‘союз’), (‘выпейте’, ‘глаг.’), (‘же’, ‘частица’), (‘чаю’, ‘сущ.’)]
Тестирование
Для оценки точности классификации работы алгоритма, метод обучения Tagger.train() имеет необязательного параметр cross_validation, который, если установлен как True, выполнит перекрестную проверку, т.е. данные обучения разбиваются на K частей, после чего каждая часть по очереди используется для оценки работы метода, в то время как остальная часть используется для обучения. Мне удалось добиться средней точности в 92%, что вполне неплохо, учитывая, что была использована лишь доступная часть нац. корпуса. Обычно точность разметки части речи колеблется в пределах 96-98%.
Заключение и планы на будущее
В общем, было интересно поработать с нац. корпусом. Видно, что работа над ним проделана большая, и в нем содержится большое количество информации, которую хотелось бы использовать в полной мере. Я послал запрос на получение полной версии, но ответа пока, к сожалению, нет.
Полученный скрипт разметки можно легко расширить, чтобы он также определял другие морфологические категории, например, число, род, падеж и др. Чем я и займусь в дальнейшем. В перспективе хотелось бы, конечно, написать синтаксический парсер русского языка, чтобы получить структуру предложения, но для этого нужна полная версия корпуса.
Видео:Русский язык. Части речи. Существительное. Глагол. Прилагательное. ПредлогСкачать
Что такое отглагольные существительные
Отглагольные существительные (далее по тексту ОС) — это существительные, произошедшие от глаголов. Обозначают опредмеченное действие. Говоря более простым языком, это описание какого-либо действия в отвлеченном смысле, без указания лица, которое его совершает, и других факторов, связанных с действием (время, завершенность).
Примеры ОС: бег, плавание, вылов, метание, разрыв, катание, осуществление, выполнение, решение, принятие, езда, платёж, открытие.
Существительным, образованным от глаголов, уделяют особое внимание при изучении русского языка. С одной стороны, их широко используют во всех стилях речи, но с другой, злоупотребление ими вредит тексту и речи, создает нагромождения наподобие «утопление по причине утонутия», чем затрудняет восприятие содержания.
ОС в русском языке образуются двумя способами:
- безаффиксным (бессуффиксным);
- суффиксальным.
Отличить такой вид существительных от других типов не сложно, но для этого нужно знать грамматические особенности отглагольных существительных.
Видео:Склонение имен существительных. Как определить склонение существительного?Скачать
Словообразование
Отглагольные существительные образуются присоединением суффикса к основе глагола либо отбрасыванием суффикса и окончания слова (в нашем случае — глагола).
Суффиксальное образование
При суффиксальном образовании используют разные суффиксы, в зависимости от исходного слова:
- -Б-молоть — молотьба, резать — резьба; палить — пальба
- -Л- для описания отвлеченного процесса или производителя действия: кидать — кидала, травить — травля
- -ИЩ-пепелить — пепелище, играть — игрище
- -ОТН-, -Н-бегать — беготня, грызть — грызня
- -ТИЙ-покрывать — покрытие, отливать — отлитие
- -ЧИК(-ЩИК)-резать — резчик, грузить — грузчик, зачинать — зачинщик
- -АЦИЙ-декларировать — декларация, монетизировать — монетизация
- -НИЙ-, -ЕНИЙ-приложить — приложение, говорить — говорение
- -К-загрузить — загрузка, вырубать — вырубка
- -ОК-подарить — подарок, оставлять — остаток
- -ЗНЬ-казнить — казнь, бояться — боязнь
- -ТЕЛЬ-спасать — спасатель, карать — каратель
Зная эти суффиксы, легко образовывать ОС правильно и распознавать их в предложении.
Безаффиксный (бессуффиксный) метод
Некоторые глаголы можно превратить в существительные, производные от глаголов, только безаффиксным способом. Для этого глагол лишают окончания и суффикса. К примеру:
- отлавливать — отлов;
- взмахивать — взмах;
- отдыхать — отдых;
- вкладывать — вклад;
- провозить — провоз:
- выезжать — выезд:
- укладывать — уклад.
Безаффиксный метод образования слов используется только для существительных, образование ОС — частный случай.
Как определить словообразование
Когда нужно определить, какой способ словообразования используется для конкретного слова, нужно выделить основу, суффикс и окончание существительного, найти другие слова с таким же корнем.
Например, слово восходить. Отглагольная форма — восхождение. Для образования используется суффикс -ЕНИЙ.
Другой пример: восходить — восход. В слове восход суффикса нет, а значит тут используется безаффиксный способ словобразования.
Видео:Русский язык 3 в 1. Существительное, местоимение, глагол.Скачать
Грамматические особенности
Основное отличие ОС от глаголов и существительных в том, что они описывают процесс чего-либо, при этом делают это опредмечивая действие.
Абстрактные формы ОС обычно не изменяются по числам, к примеру: начертание, высчитывание.
Видео:Как определить склонение существительного? 3 типа склонения имен существительных.Скачать
Отглагольные существительные в речи
Данные виды слов появляются во всех стилях русского языка: разговорном, официально-деловом, публицистическом, художественном. Такие существительные обогащают речь, делают ее разнообразней, но иногда ими злоупотребляют, из-за чего высказывания становятся неясными, приобретают двойной смысл, к примеру: «Вопрос о решении задачи» (непонятно, нужно ли что-то сделать, или что-то уже сделано).
Часто можно встретить большое количество существительных, образованных с помощью глагола, в деловом стиле. Их обилие в высказываниях чиновников придает речи оттенок канцеляризма, затрудняет восприятие информации.
При использовании ОС надо понимать, что у них отсутствуют основные глагольные категории (завершенность действия, время, лицо), а значит, нужно давать слушателю дополнительную информацию.
Чтобы текст был понятным, нужно отказаться от неживой речи и реже использовать производные от глаголов. Информацию надо подавать простыми словами. Текст будет читаться легко, если в нем нет нагромождений сложных конструкций.
💥 Видео
Спряжение глаголов. Как определить спряжение глаголов?Скачать
Части речи в русском языке. Как определить часть речи?Скачать
Что такое глагол? Глагол как часть речиСкачать
Спряжение глаголов | Русский язык |TutorOnlineСкачать
Глагол SUCHEN с приставками и без, образование существительных от глагола suchenСкачать
Что такое глагол?Скачать
Имя существительное одушевленное и неодушевленное 1-4 классСкачать
Спряжение глаголов. Что такое спряжение глаголов в русском языке? Для чего нужно спряжение глаголов?Скачать
Образование глаголов от прилагательных и существительныхСкачать
Морфологические признаки глаголаСкачать
Урок 1. Делать или сделать? || Глаголы НСВ и СВ. Настоящее-прошедшее время.Скачать
Изменение глаголов по временам. Что такое время глагола? Как определить время глагола?Скачать
Русский язык. Части речи. Глагол (1 часть)Скачать
Словообразование в английском языке | Построение существительных от прилагательных и глаголовСкачать
Морфологический разбор глагола. Как сделать морфологический разбор?Скачать
100 глаголов - поиск предназначения - практикаСкачать