Category: еда

Релиз чатбота 0.0.1 (альфа) - вербальные формы, сценарии и прочее

В проекте русскоязычного чатбота сделан релиз с большими изменениями в коде бота. В основном работа велась над возможность задавать поведение бота через вручную задаваемые правила - сценарии и вербальные формы.

Collapse )

Вербальные формы в чатботе: в ближайшем релизе

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

B:> День добрый
H:> хочу заказать что-нибудь поесть
B:> Что заказать?
H:> пиццу с анчоусами
B:> Сколько порций?
H:> две
B:> Заказываю: что="пиццу с анчоусами", сколько="две"

Аугментация и генерация NLP датасетов с помощью ruword2tags.RuFlexer

В библиотеку ruword2tags добавлен новый класс RuFlexer, содержащий инструменты для генеративных текстовых моделей. Сейчас этот класс предоставляет единственный метод find_forms_by_tags для подбора форм слова с заданными тегами. Например, чтобы найти форму слова "кошка" для творительного падежа множественного числа, надо написать примерно такой код:
Collapse )
PS: Юрий Бабуров подкинул еще хорошую статью по теме аугментации в NLP: https://towardsdatascience.com/these-are-the-easiest-data-augmentation-techniques-in-natural-language-processing-you-can-think-of-88e393fd610
Касательно упоминаемой в этой статье подстановки синонимов для русскоязычных датасетов я, возможно, выложу и свой примерчик.

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

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

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

Небольшое сравнение качества двух сетевых моделей определения синонимичности фраз

Модель №1 - нейросетка с triple loss nn_synonymy_tripleloss.py
Модель №2 - нейросетевой бинарный классификатор nn_synonymy.py
Модели обучаются на идентичном датасете, содержащем ~60 тысяч пар синонимичных предложений.
При тестировании каждая модель ранжирует предложения из тестового списка по близости к вводимой строке. Выводится 10 ближайших предложений.

Результаты для модели №1

Collapse )

Результаты для модели №2
Collapse )

Модуль поддержания разговора (smalltalk режим) для чатбота

В кодовую базу чат-бота добавлен небольшой модуль, которые позволяет в ответ на реплики пользователя, не являющиеся вопросами, отвечать для поддержания разговора (с условным названием smalltalk режим - см. также описание светской беседы в вики). В комплекте с общим retrieval-based алгоритмом чатбота и динамическим обновлением базы знаний из диалога получается более плавное общение (Q - мои реплики, A - ответы чат-бота):

Q:> привет
A:> Здравствуй

Q:> как тебя зовут?
A:> кеша

Q:> меня зовут Илья
A:> Привет!

Q:> я сегодня ел арбуз
A:> Арбуз очень вкусный был?

Q:> что я сегодня ел?
A:> арбуз




Collapse )

небольшое ручное сравнение vanilla w2v и fasttext на русском 10Гб корпусе

Обучил word2vector и fasttext модели на одном и том же текстовом корпусе:10 Гб всяких текстов, включая социальные медиа, изобилующие опечатками и словообразовательным творчеством масс.
Параметры для w2v: CBOW=0 WIN=5 DIM=32 MIN_COUNT=1
Параметры для fasttext: SIZE=64 WINDOW=5 CBOW=0 MIN_COUNT=1
Далее сравниваю выдаваемую похожесть для нескольких пар слов с помощью 1 и 2.
Результаты под катом. Можно заметить, что в некоторых случаях fasttext дает намного лучшие результаты (борщ и борщец), корректнее учитывая русские продуктивные суффиксы. Но исправление опечаток fasttext не тянет (трактор и тракктор).

Collapse )

Collapse )

Перестановочная нормализация фраз в результатах оценки сентимента

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

Выдержка из результатов тестового прогона по моей базе оценок из отзывов:

Collapse )

Сейчас в базе 23990 уникальных словосочетаний по которым сделана оценка или обнаружен факт наличия/отсутствия какого-то аспекта. Общее количество оценок и фактов равно 9677415. Думаю, можно попытаться поучить RNN/LSTM модель нормализовать словосочетания по такому шаблону:

Collapse )

100% качества добиться, наверное, вряд ли получится из-за ограничений на объем памяти в сетке, но общие закономерности рекуррентная модель должна уловить. Например:

приведение к нейтральной форме:
анимация бедноватенькая ==> бедноватая анимация

приведение главного существительного к словарной форме и пересогласование зависимого прилагательного:
анимационные программы очень веселые ==> очень веселая анимационная программа

и так далее.

Как будем проверять word embeddings

1. Если/когда заработает вторая модель получения word embeddings - то для нее проверка будет аналогичная нижеописанной.

2. Получение кластеров и просмотр их содержимого является только предварительной, грубой оценкой. Практического применения этим кластерам я пока не вижу. Если смутные мысли по поводу использования для machine translation, но смутность и необходимость получения еще и японских векторов пока меня расстраивает.

3. Сделаем POS Tagger на Support Vector Machine классификаторе, на входе - только полученные вектора для слов, на выходе - целевые теги (часть речи + падеж + число + ....). Сравнение с разметкой эталонного корпуса сразу покажет числовую оценку качества, от которой уже можно отталкиваться при подборе гиперпараметров модели.

4. Если вдруг POS Tagger на векторах окажется на уровне текущего варианта, то встанет вопрос о введении в него работы с неизвестными словами. Это будем решать по факту.

5. Если качество будет хорошим, то, к.м.к, можно будет добавить марковскую модель и получить MEMM со всеми плюшками глобальной оптимизации цепочки тегов.

6. Отдельная проверка - через использование векторов для shift-reduce парсера. С этой штукой будем возиться только после окончания проверки на pos tagging модели.

Будем повышать точность связывания для групп существительных

С глаголами (деепричастиями и причастиями) вроде бы разобрались, новый алгоритм учета валентностей работает очень неплохо. В сочетании со статистическим POS Tagger'ом - получилась вообще конфетка.

Теперь попробую повысить семантическую точность связывания в группах существительного. Главным образом -  порядок присоединения предложного дополнения в ситуациях, когда есть конкуренция между глаголом, существительным и другим предложным паттерном:

"у меня вести из столицы от вашего сына"