Компьютерная лингвистика

Новостная лента www.solarix.ru

Previous Entry Share
Генерация деепричастных форм из инфинитивов - SQL словарь + Python + xgboost
kelijah
1. Постановка задачи

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

2. SQL Словарь русского языка

SQL Словарь - это таблицы слов с грамматическими метками, хранящиеся в обычной реляционной СУБД (MS SQL, MySQL, SQLite, Firebird, PostgreSQL) в виде, позволяющем выполнять штатные операции типа поиска нужной грамматической формы с помощью обычных SQL запросов (см. примеры для существительных). В частности, запрос, который выводит глагольные формы 1-го лица может выглядеть так:

select TOP 10 E.name, F.name
 -- выбираем глагольные словарные статьи
 from sg_class C
 join sg_entry E on E.id_class=C.id and C.name='ГЛАГОЛ'
 -- отбор глаголов совершенного вида
 join sg_entry_coord EC on EC.id_entry=E.id
 join sg_coord C1 on C1.id=EC.icoord and C1.name='ВИД'
 join sg_state S1 on S1.id=EC.istate and S1.id_coord=C1.id and S1.name='СОВЕРШ'
 -- формы глагола
 join sg_form F on F.id_entry=E.id
 -- отбираем формы 1го лица
 join sg_form_coord FC on FC.iform=F.iform and FC.id_entry=E.id
 join sg_coord C2 on C2.id=FC.icoord and C2.name='ЛИЦО'
 join sg_state S2 on S2.id=FC.istate and S2.id_coord=C2.id and S2.name='1'











Он выдаст следующую информацию:

прирезать    прирежу
прирезать    прирежем
повиноваться    повинуюсь
повиноваться    повинуемся
врезать    врежу
врезать    врежем
перерезать    перережу
перерезать    перережем
вырезать    вырежу
вырезать    вырежем










Усеченный SQL словарь русского языка можно взять на сайте. Либо сгенерировать установочные скрипты с помощью утилиты decompiler, скомпилировав ее из С++ исходников и взяв готовую полную русскую словарную базу. Для MS SQL генерация заливочных скриптов в командной строке Windows делается так:

decompiler.exe .\bin-windows64\dictionary.xml -outdir=.\tmp -sql "mssql,mssql_bulk_insert,utf8,bom,lemmatizator,norules"


В указанном опцией outdir каталоге появятся файлы с sql-операторами и данные для BULK LOAD заливки, которые отправляем в экземпляр базы командой (предполагается, что инстанс базы с именем solarix доступен на localhost через win-аутентификацию):

set auth=-S localhost -d solarix -f 65001
set sqlcmd="sqlcmd.exe"
set Z=%sqlcmd% -b -a 32767 %auth%

%Z% -i dictionary.sql -o mssql-dictionary.log












3. Генерация обучающего датасета

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

select E_ap.name, E_inf.name, S.name
 from sg_entry E_ap
 join sg_class C_ap on C_ap.id=E_ap.id_class and C_ap.name='ДЕЕПРИЧАСТИЕ'
 join sg_link L on L.id_entry1=E_ap.id
 join sg_entry E_inf on E_inf.id=L.id_entry2
 join sg_class C_inf on C_inf.id=E_inf.id_class and C_inf.name='ИНФИНИТИВ'
 join sg_entry_coord EC on EC.id_entry=E_inf.id
 join sg_coord C on C.id=EC.icoord and C.name='ВИД'
 join sg_state S on S.id_coord=C.id and S.id=EC.istate









Он выдаст примерно такие записи:

засыпая    засыпать    НЕСОВЕРШ
пасуя    пасовать    НЕСОВЕРШ
переливая    переливать    НЕСОВЕРШ
суровея    суроветь    НЕСОВЕРШ
покоившись    покоиться    НЕСОВЕРШ
дактилоскопируясь    дактилоскопироваться    НЕСОВЕРШ
наформовав    наформовать    СОВЕРШ
залакировавшись    залакироваться    СОВЕРШ
...








Сохраняем этот резалтсет в текстовый файл с табуляциями в качестве разделителей с именем existing_adverbial_participles_and_infinitives.tsv.

4. Классификатор на базе XGBoost

Для каждой пары инфинитив-деепричастие найдем общий префикс:

inf=засыпать    ap=засыпая    prefix=засып
inf=пасовать    ap=пасуя    prefix=пас
inf=переливать    ap=переливая    prefix=перелив
inf=очнуться    ap=очнувшись    prefix=очн
inf=закинуть    ap=закинув    prefix=закин
inf=суроветь    ap=суровея    prefix=суров
inf=покоиться    ap=покоившись    prefix=поко
inf=дактилоскопироваться    ap=дактилоскопируясь    prefix=дактилоскопир
inf=наформовать    ap=наформовав    prefix=наформов







Части инфинитива и деепричастия справа от префикса дает нам правило генерации деепричастной формы из инфинитивной для новых инфинитивов. Этих правил относительно немного, несколько сотен пар, причем первая 20-ка дает половину использований (без учета частот самих слов):

rule        share    cumulative
4:вая             11.38    11.38
6:ваясь            6.68    18.05
4:вав              5.85    23.90
4:нув              3.45    27.35
6:руя              3.24    30.59
6:вавшись          2.95    33.54
8:руясь            1.79    35.34
6:нувшись          1.73    37.07
4:тив              1.39    38.46
4:рив              1.37    39.82
4:лив              1.35    41.17
4:ляя              1.32    42.50
4:тав              1.17    43.66
6:ляясь            1.16    44.82
4:нив              1.16    45.98
6:тившись          1.05    47.03
4:чив              1.00    48.03
4:кав              0.99    49.02
4:кая              0.97    49.99
4:чая              0.93    50.92






Будем обучать многоклассовый классификатор на базе XGBoost, который для заданной цепочки символов инфинитива выдаст номер правила, которое даст форму деепричастия. Исходный текст полной программы доступен по ссылке. Последовательность действий стандартная: 1) подбираем оптимальное количество деревьев через кроссвалидацию и xgboost.cv 2) обучаем классификатор 3) применяем обученный классификатор на новые инфинитивы (см. следующий раздел), используем выбранные правила для генерации деепричастий.

5. Применение обученного классификатора для генерации деепричастий

Опять используем SQL словарь, чтобы получить список инфинитивов без деепричастий:

select E_inf.name, S1.name
 from sg_entry E_inf
 join sg_class C_inf on C_inf.id=E_inf.id_class and C_inf.name='ИНФИНИТИВ'
 join sg_entry_coord EC_inf on EC_inf.id_entry=E_inf.id
 join sg_coord C1 on C1.id=EC_inf.icoord and C1.name='ВИД'
 join sg_state S1 on S1.id_coord=C1.id and S1.id=EC_inf.istate
 where not exists (select *
                           from sg_entry E_ap
                           join sg_class C_ap on C_ap.id=E_ap.id_class and C_ap.name='ДЕЕПРИЧАСТИЕ'
                           join sg_link L on L.id_entry1=E_ap.id and L.id_entry2=E_inf.id
                         )





Он выдаст несколько тысяч инфинитивов с признаками глагольного вида:

португализироваться    СОВЕРШ
развиртуализироваться    НЕСОВЕРШ
реактивироваться    СОВЕРШ
самокастрироваться    СОВЕРШ
самопрезентоваться    НЕСОВЕРШ
сериализироваться    СОВЕРШ
факторизироваться    СОВЕРШ
экстрагироваться    НЕСОВЕРШ
...



Сохраняем его в tab-separated values файле с именем adverbial_participles.tsv. Этот файл загружается программой на питоне. К записям в нем применяется обученная модель классификации, в результате чего получается примерно такой текстовый файл:

 дп( походя, НЕСОВЕРШ, походить )
 дп( кооптируя, НЕСОВЕРШ, кооптировать )
 дп( хаотизируя, НЕСОВЕРШ, хаотизировать )
 дп( хаотизировав, СОВЕРШ, хаотизировать )
 дп( романизировав, СОВЕРШ, романизировать )
 дп( сенсибилизируя, НЕСОВЕРШ, сенсибилизировать )
 дп( сенсибилизировав, СОВЕРШ, сенсибилизировать )
 дп( цифровизуя, НЕСОВЕРШ, цифровизовать )
 дп( цифровизовав, СОВЕРШ, цифровизовать )
...



После визуальной верификации и коррекции можно добавлять эти новые деепричастия в скрипт сборки русской словарной базы.

?

Log in

No account? Create an account