?

Log in

No account? Create an account

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

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

Entries by category: общество

а вот простейшая seq2seq модель для генерации реплик в читчат боте что выдает
kelijah
После обучения на объединенном датасете диалогов из Толоки + мои датасеты для чатбота, модель, не учитывающая контекст, а только текст заданного вопроса, выдает такую "болтовню":
Read more...Collapse )

Изменения в порядке генерации ответов в чатботе
kelijah
В коде релиза 0.0.2.2 кроме всяких правок ошибок и более точных NLP моделек сделана одна существенная модификация в генераторе ответов.
Раньше чатбот на вопросы, относящиеся к нему "лично", генерировал ответ общим алгоритмом, то есть искал релевантный факт в базе знаний, брал отуда необходимый фрагмент и строил ответ. Выглядело это примерно так:
Read more...Collapse )

Профили в чатботе
kelijah
В новом релизе чатбота я добавил "профили" - текстовые файлы (json), в которых указываются пути к файлам с фактами и правилами. С их помощью, думаю, будет проще создавать разные "характеры". В этих же профилях в будущем будут доступны тонкие настройки характера бота (ну не прямо как тут, конечно, хотя...). Сейчас сделан базовый отладочный профиль, который позволяет чатботу отвечать на десяток простых вопросов о самом себе, примерно так:
Read more...Collapse )

Изменения в грамматическом словаре касательно составных прилагательных
kelijah
В "грамматическом словаре русского языка" закончена большая чистка русского лексикона. Из словарной базы убраны почти все составные прилагательные такого вида "ярко-зеленый", "багрово-красный" и т.д. В итоге словарь стал меньше, но мощность описываемой им лексики - больше. Далее - пояснения мотивации и последствия.

Read more...Collapse )

Датасеты по сочетаемости слов в группах из 2, 3 и 4 слов (mutual information)
kelijah
В репозитории https://github.com/Koziev/NLP_Datasets/tree/master/MutualInfo выложены датасеты со статистикой по устойчивым сочетаниям слов. Датасеты получены с помощью C# кода, выложенного тут (см. описание) и урезаны до 100,000 первых записей, так как выложить полные файлы размером более 2 Гб на гитхаб невозможно.

Внутри файлов можно увидеть такие данные:
Read more...Collapse )

Сравнение разных способов представления слов для NLP задачи построения языковой модели
kelijah
В слаке ODS недавно проскочила тема про варианты представления категориальных переменных для решающих деревьев. В частности, приводилась ссылка https://medium.com/data-design/visiting-categorical-features-and-encoding-in-decision-trees-53400fa65931. А я как раз хотел еще раз поднять тему с использованием Brown Clustering представлений слов для NLP. Вот и получилось совместить оба вопроса в одном бенчмарке - см. далее подробности.
Read more...Collapse )

Неудачный эксперимент: генерация морфологических признаков слов через w2v и кластеризацию
kelijah
Сама идея простая. Делал её экспериментальную реализацию для для Парсера. Потом вторая попытка - для morphorueval2017. Особого эффекта добиться не удалось, но возможно в каком-то другом сценарии анализа текста она будет полезной.

Далее описываю реализацию для morphorueval.
Есть набор корпусов, предоставленных организаторами конкурса.
Мы берем из них только слова, генерируем текстовый файл в формате: одна строка - одно предложение. Слова разделены пробелами. Занимается этим простой скриптик generate_w2v_corpus.py.
Далее выполняется встраивание слов корпуса в векторное пространство через gensim - второй скриптик train_w2v.py.
Далее выполняется кластеризация слов с помощью K-Means - см. скрипт word_clusters.sklearn.py
Наконец, номера кластеров слов используем как отдельный категориальный признак в любом алгоритме.

Если посмотреть на содержимое кластеров, то обычно можно понять, какие морфологические признаки использованы для объединения:

Read more...Collapse )

Главная проблема - небольшой объем текстового корпуса, на котором обучается word2vec. Из-за этого некоторые кластеры получаются неконсистентными.

Похоже, что это типовые синтаксические конструкции
kelijah
Немного изменил параметры кластеризации встраиваний предложений.
Read more...Collapse )

Текущее: грустное о некоторых CRF тулкитах
kelijah
Делаю эксперимент с частеречной разметкой по бессловарной русской морфологии... По сути получилась стандартная задача sequence labelling, которую в данном случае естественно решать с помощью conditional random fields, благо цепочка событий-слов одномерна и фичи пока бинарные.

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

Когда-то, увидев работу CRF++ в составе японского парсера Cabocha, я начал с ним экспериментировать и очень быстро уперся в следующее ограничение. Обучающие паттерны допускают только одну фичу на слово. Потом с помощью специальных правил-шаблонов одиночные фичи у слов можно объединить в униграммные...триграммные фичи. Но суть остается та же - ровно одна фича на слово:

Пример формата обучающего датасета...Collapse )
Это убивает преимущество CRF перед HMM. В итоге, я стал работать с CRFSuite, в котором для каждого слова можно задавать множество фич, причем наборы фич могут почти не пересекаться, то есть быть sparse. Такой подход сильно упрощает обучение. Кроме того, либа написана на C++ и достаточно просто прикрутилась к моему POS Tagger'у.

И вот теперь решил поискать что-то на замену CRFSuite.

Сначала SharpCRF. Одна фича на токен!
Read more...Collapse )
Беда. Попытка спилить в исходниках генерацию фич из шаблонов успехом не увенчалось. Там довольно простой C# код, но на одном из этапов я не смог разобраться с причинами ошибки и оставил попытки.

Затем Wapiti. Смотрю примеры датасетов в архиве - опять эти проклятые шаблоны для генерации фич из одиночных фич для слов.

Пока остановился на CRF ADF, в котором наборы признаков для CRF можно задавать напрямую без ограничений. Работает медленно, вроде бы не параллелиться, но для проверки самой идей бессловарной морфологии годится. Исходники на C#, но я в них по не лазал, так как бинарник успешно заработал "из коробки".

PS: FlexCRFs вроде бы тоже свободен от этого неудобного ограничения на задание признаков. Хотя документация у них не ахти, особенно описание формата файлов с датасетами.

Датасет для unsupervised обучения синтаксической модели для русского языка
kelijah
Мой "текстоперегонный" куб сделал очередную итерацию, скушав пару десятков гигабайтов текстов из википедии, новостей и так далее, и выдав примерно 6 Гб с очищенными предложениями.

Если посмотреть на группу самых маленьких предложений по 4 токена, то с одной стороны 90 Мб файл ничего интересного не показывает:

Read more...Collapse )

Поищем теперь среди этих предложений перестановочные ДУБЛИКАТЫ. То есть нас интересуют пары (или группы) предложений, в которых русский почти свободный порядок слов показывает себя во всей силе:

Я был счастлив!
Счастлив я был!
Я счастлив был!

Исходный список содержит почти 3 миллиона предложений, так что он слишком большой для решения задачи в лоб перебором всех со всеми. Но, к счастью, умные дяди давно разработали подходящий алгоритм, см. краткую инфу https://en.wikipedia.org/wiki/MinHash или подробнейшее описание тут http://infolab.stanford.edu/~ullman/mmds/ch3.pdf

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

Я сделал реализацию алгоритма на C#. Более того, я потом реализовал эту вкусняшку на pl/sql для поиска дублей в базе, хотя мучения с переводом матричных вычислений на временные таблицы отравили все удовольствие. Как бы то ни было, C# реализация кушает многомиллионные коллекции строк и выдает группы дубликатов, которые для коротких предложений очень похожи просто на bag-of-words:

Read more...Collapse )

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

Read more...Collapse )

Как нетрудно видеть, каждая такая группа представляет семантически эквивалентное высказывание. То есть любое предложение в группе с точки зрения латентных семантических репрезентаций эквивалетно любому другому. Что приводит нас к задаче sequence2sequence. Как говорят математики в таких случаях - задача сводится к решенной, бинго.

Всего таких групп - десятки тысяч. Это означает, что у нас есть хороший, достаточно объемный датасет, годный для нейросетевого обучения. По крайней мере, есть резон попытаться.

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