Category: общество

Category was added automatically. Read all entries about "общество".

а вот простейшая seq2seq модель для генерации реплик в читчат боте что выдает

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

Датасеты по сочетаемости слов в группах из 2, 3 и 4 слов (mutual information)

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

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

Сравнение разных способов представления слов для NLP задачи построения языковой модели

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

Неудачный эксперимент: генерация морфологических признаков слов через w2v и кластеризацию

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

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

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

Collapse )

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

Текущее: грустное о некоторых CRF тулкитах

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

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

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

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

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

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

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

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

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

Датасет для unsupervised обучения синтаксической модели для русского языка

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

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

Collapse )

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

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

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

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

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

Collapse )

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

Collapse )

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

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

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

Частеречная разметка по векторам слов с помощью RNNSharp

(предыстория тут http://kelijah.livejournal.com/177045.html)

Новый результат - ошибаемость частеречной разметки русского текста упала до:

Tag error rate=3,3119224650003%

И это уже очень неплохо.

Collapse )

Статистика по словосочетаниям НАРЕЧИЕ+ГЛАГОЛ и ГЛАГОЛ+НАРЕЧИЕ по tree bank

[Продолжение]
Объем использованного tree bank: 317,780,920 слов
Собирались ребра с глаголом (инфинитив, глагол, деепричастие) и наречием.
Отдельно учитывались наречия справа и слева от глагола, так как для русского языка есть определенные нормы в этом плане.
Результаты отсортированы по mutual information.

ТОП для adv+v:
Collapse )

ТОП для v+adv:
Collapse )