Category: животные

Добавлена обработка OOV слов в лемматизаторе rulemma

В питоновской библиотеке rulemma добавлена обработка несловарных (out-of-vocabulary) слов. Большинство OOV-слов образуются по относительно небольшому количеству словоизменительных правил русского языка, так что модель неплохо справляется с ними. При этом используются результаты частеречной разметки, чтобы снимать неоднозначности типа крокодил - проходил.

В качестве примера можно посмотреть на разбор фразы "Мяукая, голодные кошки ловят жирненьких хрюнделей":
Collapse )

rupostagger - простой пакет для частеречной разметки русскоязычных предложений

Привел в порядок и выложил пакет rupostagger - простую (и не SOTA) реализацию алгоритма для разметки слов тегами. Пакет не делает ничего, кроме разметки, поэтому токенизацию надо делать самостоятельно. Я использую пакет под 2 и 3 веткой питона, под Windows и Linux. Батарейки (обученная русская языковая модель) входят в комплект, ничего самостоятельно обучать не надо. Также используется русская словарная база - отдельный пакет ruword2tags, и слогоделитель rusyllabs,  они указаны в requirements.txt.

После установки (pip install git+https://github.com/Koziev/rupostagger) использовать так:
Collapse )

Как SentencePiece токенизирует русскоязычный текст

SentencePiece - питоновская библиотека для unsupervised tokenization. Для японского и и китайского, видимо, является очень хорошей альтернативой токенизаторам с handcrafted rules (типа MeCab, который и я когда-то использовал). А для английского языка дает в нейросетевых моделях (гугловский трансформер и BERT) такую приятную вещь, как заранее фиксированный размер словаря.

А как выглядит результат токенизации для русскоязычного текста, учитывая темную сторону русского языка - слишком богатое словоизменение? Далее - краткие результаты эксперимента.
Collapse )

Весело начался год собаки

Накручивая нейросетку поверх CRF для нормализации результатов разбора данных для ETL процедуры, случайно обнаружил, что модель для CRF разбила датасет в пропорции 20% на тренировку и 80% на валидацию. Спасибо остатку от деления на пять:
Collapse )

Сеточная регрессия char-векторов в word2vector встраивания

При использовании word2vector представлений слов для синтаксического парсинга реальных текстов, а не искусственно подобранных предложений, всегда возникает проблема out-of-vocabulary слов. Эти несловарные токены возникают по разным причинам, включая опечатки, слияние соседних слов, ошибочное разделение одного слова на несколько, образование новых слов с помощью продуктивных приставок или составных слов:
Collapse )

Визуализация пространства встраиваний в char-rnn модели word2word. Интерполяция слов.

(оглавление)

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


Как посмотреть на распределение векторов слов в этом пространстве?

Collapse )

Оценка семантической релевантности фраз через их векторы

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

Итак, сначала я натренировал модель sequence2sequence на перефразировках и перестановках.

Далее, беру кодирующую часть этой модели, отсекаю вторую синтезирующую. Беру много-много (ну не совсем, примерно 100 тысяч, больше в 32 Гб оперативки не влезло почему-то) пар предложений с явно известной похожестью. К примеру "лай собаки" по смыслу близко к "собака лает" и "лающая собака", а "кошка лежит на диване" и "диван лежит на кошке" описывают разные по смыслу ситуации.

Для предложений в парах получаем векторы с помощью первой модели. И обучаем простую feed forward модель с парой слоев, которая на входе получает два вектора фразы, а на выходе - признак "релевантно/нерелевантно". Эта модель должна научиться учитывать синтаксические фичи, которые встраиваются в вектор фразы первой моделью.

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

Получается примерно так (average word2vector cos(v1,v2) это косинус между средними векторами слов в каждом из предложений, то есть фактически bag-of-words модель)
Collapse )

К примеру, последняя пара проверочных фраз:
Collapse )
По-видимому, тут мы видим, как bag-of-words модель вчистую проигрывает новой модели, которая учитывает (наверное) семантическую близость однокоренных слов "лай" и "лает". Если подтвердиться, то плучим очень полезный инструмент для NLP.

Буду проверять дальше.

Сиамские сети для получения вектора фразы (и детекторов семантических инвариантов текста)

На нашем подиуме - новая модель. Называется Siamese Networks.

Касательно использования для обработки текста - см. к примеру http://www.mit.edu/~jonasm/info/MuellerThyagarajan_AAAI16.pdf "Siamese Recurrent Architectures for Learning Sentence Similarity"
Обработка визуальной информации - см. http://vision.ia.ac.cn/zh/senimar/reports/Siamese-Network-Architecture-and-Applications-in-Computer-Vision.pdf

Идея очень простая. Берем пары предложений, описывающих разным обрабом одно и то же. Эти предложения содержат семантические инварианты, которые мы хотим научиться детектировать в любом тексте. Это - позитивные паттерны.

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

Каждая пара пропускается через две копии сетки и затем сводится через функцию вычисления близости получившихся векторов:
Collapse )
Обучение заключается в том, что финальная сетка учится определять, что исходные предложения в паре связаны или не связаны друг с другом. Так как предложения эта сетка (точнее, слой) видит как два вектора признаков, то фактически мы в ходе backprop'а заставляем сетки-кодировщики сформировать правила выделения семантических инвариантов. Сетки-кодировщики - это копия одной и той же сетки, отсюда и название.

После обучения у нас в руках оказывается сетка, которая для заданного предложения строит вектор заданной размерности (например, 64 или 256), в котором закодирована семантика.

Пока качество получающихся семантических векторов я проверяю обкатанным ранее способом - через косинусную меру близости разных тестовых фраз. Хотя мне кажется, нужна другая валидационная метрика.
Collapse )

Перефразировки и глубинная категория определенности в русском языке

Если смотреть на некоторые перефразировки, то можно заметить торчащие уши некой категории "определенности/количества", которая в английском языке и некоторых других выражается артиклями:

Слышен собачий лай. (одна собака или несколько? собака известна слушателю или это некая абстрактная собака?)
Слышен лай собаки.
Слышен лай собак.

И прилагательное собачий, и существительное собака в этих случаях называет одно и тоже качество, но есть вышеупомянутая разница в определенности (confidence?). Не удивлюсь, если эта категория замечена и как-то умно называется в "текст<=>смысл" и т.д.