?

Log in

No account? Create an account

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

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

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

Профили в чатботе
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 )

Похоже, что это типовые синтаксические конструкции
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% "функционального" определения синтаксиса естественного языка. Недостающая часть связана с тем, что латентные репрезентации высказывания должны позволять ответить (сгенерировать ответ) на вопрос к любой части предложения, а также выполнить более сложную перефразировку. Но для таких задач у меня пока нет датасетов подходящего размера, так что сосредоточимся на трансформационном синтаксисе...

Словосочетания сущ + сущ в род. падеже
kelijah
Продолжение статистики по корпусу из http://kelijah.livejournal.com/165490.html.
Собраны словосочетания с существительными, к которым присоеденены существительные в родительном падеже.
Сортировка по абсолютной частоте:
TOP 100 словосочетаний по частотеCollapse )

Сортировка по mutual information:
TOP 100 словосочетаний по mutual information...Collapse )

Видны артефакты парсинга. Например, Юрий|лужок - это ошибочный разбор для "Юрий Лужков". Упрощенная морфологическая модель считает "Лужков" только формой существительного "лужок", отсюда и результат в парсере. На это накладывается еще и склонность mutual information выносить в топ всякие опечатки, которые встречаются очень редко, соответственно дают малый знаменатель в формуле MI.