?

Log in

No account? Create an account

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

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

Previous Entry Share Next Entry
rusyllab - русский слогоделитель для замены SentencePiece
kelijah
В субботу на скорую руку сделал на питоне конвертор моего старого набора правил деления на слоги из проекта русского словаря.
Результат работы конвертора - код на питоне, оформленный в виде стандартного пакета rusyllab.

Слогоделитель нужен для экспериментов с представлением текста на уровне между отдельными буквами и словами. Представление на уровне букв приводит к длинным цепочкам, которые не очень хорошо обрабатываются рекуррентными моделями. А представление на уровне слов дает слишком разреженные 1-hot матрицы, чтогодится не для всех адгоритмов машобучения. Компромисс возможен через деление слов на subword units. Классическая лингвистика предлагает в этом случае делить на морфемы. Но для русского языка это осложняется различными "нелинейными" эффектами между морфемами при их сочетании. Компромисс - деление на слоги, которые в некоторых случаях хорошо отражают морфемную структуру и семантику. В пакете rusyllab включен простой greedy алгоритм, использующий вручную составленные правила. Во многих случаях он неплохо справляется со своей задачей. Кроме того, само по себе наличие ошибок слогоделения не влияет на работу downstream алгоритмов машобуча, поскольку эти ошибки детерминированы и повторяются консистентно при обработке тех же слов.

Установка:

pip install git+https://github.com/Koziev/rusyllab


Использование:

import rusyllab

sx = rusyllab.split_words(u"Голодная кошка ловит мышку".split())
print('|'.join(sx))


Результат работы:

Го|лод|на|я| |кош|ка| |ло|вит| |мыш|ку


Функция rusyllab.split_words получает на входе список слов и возвращает список токенов. Каждый токен это либо слог, либо пробел для разделения слов. Таким образом, список токенов можно склеить обратно в почти исходное предложение.

Для сравнения вот так выглядит разбивка через SentencePiece, обученный на большом русскоязычном корпусе (об этом см. предыдущий пост):

▁|Г|о|ло|д|ная|▁ко|шка|▁лов|ит|▁мы|шку



  • 1
> слишком разреженные 1-hot матрицы

Есть еще техника хеширования, которая дает формальное компактное представление данных в таких случаях.

https://cran.r-project.org/web/packages/FeatureHashing/vignettes/SentimentAnalysis.html

>Есть еще техника хеширования, которая дает формальное компактное представление данных в таких случаях.
Да, этот hashing trick есть конечно и в sklearn, я его когда-то пробовал на каких-то задачах. Но bag-of-words не всегда годится, хотелось бы иногда учитывать контекст слова, наличие словосочетаний, синтаксис фразы. Я сходу даже не знаю, как в этом случае построить хэширование. Если тупо брать двойки-тройки слов в качестве сырья для хэшера, то как-то слишком дубово выглядит.

Можно кормить рекуррентную сетку матрицей в которой столбцы это хеши последовательных слов во фразе.


PS

А что если заменять слова на "мешки слов из их самих, их синонимов и более общих понятий"?

например "кошка" --> c("кошка", "млекопитающее", "животное", "домашнее животное", "мурлыка", "котенок", "кот", "существо женского пола", "существо", "имеет хвост", "существительное", "материальный объект" ....... )

Вектора в кодировке слов станут намного более заполненными, синонимы заработают, абстракции возможно появится?

Конечно понадобиться онтология, но возможно удасться обучить саму сеть заполнять отдельные категории в такой онтологии исходя из текста не размеченного.

PPS

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

Edited at 2019-01-14 10:23 am (UTC)

>А что если заменять слова на "мешки слов из их самих, их синонимов и более общих понятий"?

Да, интересная идея.
Словарь ассоциаций можно собрать автоматически, и из него добавлять в такой мешок одного слова десяток самых сильных ассоциаций.

Особенно ратую за включение в ассоциации "более общих понятий". Если сетка начнет их еще потом и извлекать пытаться сама по употреблению в тексте для "незнакомых" слов, то это будет просто айс!

Можно затравку взять (через перевод конечно) из всяких мегаонтологий ручной разметки типа

https://www.mpi-inf.mpg.de/departments/databases-and-information-systems/research/yago-naga/yago/

и

https://wordnet.princeton.edu/

>Можно затравку взять (через перевод конечно) из всяких мегаонтологий ручной разметки типа
>https://www.mpi-inf.mpg.de/departments/databases-and-information-systems/research/yago-naga/yago/
>https://wordnet.princeton.edu/

О! Спасибо за напоминание, давненько я эти проекты не смотрел.

> Даже вот это скорее https://ru.wikipedia.org/wiki/ResearchCyc

Я тут вечерами почитываю The Master Algorithm (https://en.wikipedia.org/wiki/The_Master_Algorithm) Педро Домингоса, достаточно известный в узких кругах перец. На странице о наивном байесовском классификаторе в русской вики (https://ru.wikipedia.org/wiki/%D0%9D%D0%B0%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9_%D0%B1%D0%B0%D0%B9%D0%B5%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80) на него первая ссылка в подвале. Так вот, в принципе, книга - ничего особенного, сборник исторических анекдотов на тему вокруг машобуча. Но по поводу Cyc'а и прочих проектов, базирующихся на символическом подходе и логике он предельно лаконичен - провалились :( Интересно как там у ABBY дела с онтоинженерией поживают.

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

Отлично! Только у меня машина не завелась, пришлось править __init__.py — точки перед utils поставил

>Только у меня машина не завелась, пришлось править __init__.py — точки перед utils поставил

Странно, я проверял под 2/3 питоном, все было норм...

Спасибо за замечание, буду на других машинах еще проверять.

Ну, у вас же нет всех конфигураций ))). У меня питон 3,6 на маке. Но на гугловском колабе я тоже не смог запустить, после чего и решил на своём компе покопаться

  • 1