Category: еда

Category was added automatically. Read all entries about "еда".

Чатбот: полная переделка модели генерации ответа на seq2seq with attention

Репозиторий проекта чатбота: https://github.com/Koziev/chatbot
Докер-образ: https://github.com/Koziev/chatbot/releases/tag/0.0.2.10-alpha

Доработки в новом релизе чатбота

1. Полностью переработан код, строящий ответ на основе вопроса и предпосылок. Вместо нескольких моделей, делавших это для разных типов вопросов, теперь оставлена единственная sequence2sequence модель с "классическим" attention. На текущем датасете из ~81000 троек предпосылка-вопрос-ответ эта модель учится около 10 часов, что намного меньше суммарного времени старого ансамбля моделей. К тому же, качество новой модели выше.
Collapse )
Тестовый диалог с ботом

Вопросы идут без особого порядка, только для тестирования отдельных частей пайплайна бота и моделей. Реплики бота идут с префиксом B, фразы человека предваряются префиксом H.

Collapse )

Текущие концептуальные проблемы, над которыми предстоить серьезно поработать

1. У чатбота нет психического (эмоционального) состояния. Поэтому он не может устать от однотипных вопросов, обидиться на оскорбительные замечания, удивиться необычному факту и так далее. Ответы бота зачастую стереотипны.

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

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

4. Движок бота имеет ограниченные возможности по интерпретации неполных ответов человека, анафоры, элипсиса. Вопросы типа "зачем?", "почему?", "а еще?", а также местоимения 3-го лица (он, она etc) обычно ставят его в тупик, выражающийся в нерелевантном ответе.

5. В диалоговый движок заложена возможность строить ответ на основе 2х и более предпосылок. Таким образом, бот теоретически может выполнять сложные рассуждения, используя части и взаимосвязь множества фактов. Но текущая реализация механизма подбора релевантных фактов нормально работает только для случая, когда для ответа вообще не нужны дополнительные предпосылки (Чему равно 2 плюс 2?) или достаточно найти одну релевантную предпосылку в базе данных.

Малые стихотворные формы в генераторе текста

Стихогенератор - из лучшего на актуальные темы:

Где родился, там и заразился

Щи да каша чума наша

Новое брюхо к лечению глухо

И напоминание для аллергиков (лето ведь еще не отменили):

На каждый цветок не накинешь платок

 

Новый набор с русскоязычными паттернами noun+NP,gen

Побочный результат подготовки датасета для генеративной модели - список из почти миллиона словосочетаний Noun+NP,gen:
Collapse )
Архив выложен в репозиторий NLP Datasets. Паттерны собирались автоматически без модерации и предобработки спеллчеком, поэтому там есть некоторое количество мусора типа "кожа лица кофе".

Аугментация и генерация 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 )

небольшое ручное сравнение 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'ом - получилась вообще конфетка.

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

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