?

Log in

No account? Create an account

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

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

Entries by tag: семантика

Движок логического вывода на базе DNN моделей ("умный" chatbot)
kelijah
Далее - результаты работы тестовой версии chatbot'а на базе нейросетевого движка логического вывода:

Read more...Collapse )

Зачем нужны эти хитрые модели для встраивания слов и предложений в векторное пространство?
kelijah
Read more...Collapse )

Кластеризация контекстов употребления многозначных слов
kelijah
Контексты употребления собраны по предложениям длиной от 4 до 6 токенов (включая финальный терминатор, если он есть). Затем получаем средний вектор фразы по w2v векторам слов, исключая само ключевое слово, и скармливаем все это в k-means.

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

Для "визуализации" кластеров просто выводятся 10 ближайших по косинусу фраз из корпуса.

Кластеры для ЗАВЯЗАТЬ...Collapse )





Кластеры для РАЗБИТЬ...Collapse )

Оценка семантической релевантности фраз через их векторы
kelijah
Оказалось, что если сравнивать релевантность двух фраз не через прямой расчет косинуса между их векторами, а посредством дополнительной модели, то можно получить интересные (хотя и не всегда однозначно хорошие) результаты.

Итак, сначала я натренировал модель sequence2sequence на перефразировках и перестановках.

Далее, беру кодирующую часть этой модели, отсекаю вторую синтезирующую. Беру много-много (ну не совсем, примерно 100 тысяч, больше в 32 Гб оперативки не влезло почему-то) пар предложений с явно известной похожестью. К примеру "лай собаки" по смыслу близко к "собака лает" и "лающая собака", а "кошка лежит на диване" и "диван лежит на кошке" описывают разные по смыслу ситуации.

Для предложений в парах получаем векторы с помощью первой модели. И обучаем простую feed forward модель с парой слоев, которая на входе получает два вектора фразы, а на выходе - признак "релевантно/нерелевантно". Эта модель должна научиться учитывать синтаксические фичи, которые встраиваются в вектор фразы первой моделью.

И уже эту модель после обучения можно использовать для проверки похожести двух фраз.

Получается примерно так (average word2vector cos(v1,v2) это косинус между средними векторами слов в каждом из предложений, то есть фактически bag-of-words модель)
Read more...Collapse )

К примеру, последняя пара проверочных фраз:
Read more...Collapse )
По-видимому, тут мы видим, как bag-of-words модель вчистую проигрывает новой модели, которая учитывает (наверное) семантическую близость однокоренных слов "лай" и "лает". Если подтвердиться, то плучим очень полезный инструмент для NLP.

Буду проверять дальше.

Сиамские сети для получения вектора фразы (и детекторов семантических инвариантов текста)
kelijah
На нашем подиуме - новая модель. Называется Siamese Networks.

Касательно использования для обработки текста - см. к примеру http://www.mit.edu/~jonasm/info/MuellerThyagarajan_AAAI16.pdf "Siamese Recurrent Architectures for Learning Sentence Similarity"
Обработка визуальной информации - см. http://vision.ia.ac.cn/zh/senimar/reports/Siamese-Network-Architecture-and-Applications-in-Computer-Vision.pdf

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

К этим парам добавляем пары, в которых предложения никак не связаны по смыслу. Это - негативные паттерны.

Каждая пара пропускается через две копии сетки и затем сводится через функцию вычисления близости получившихся векторов:
ascii art - сиамская сеткаCollapse )
Обучение заключается в том, что финальная сетка учится определять, что исходные предложения в паре связаны или не связаны друг с другом. Так как предложения эта сетка (точнее, слой) видит как два вектора признаков, то фактически мы в ходе backprop'а заставляем сетки-кодировщики сформировать правила выделения семантических инвариантов. Сетки-кодировщики - это копия одной и той же сетки, отсюда и название.

После обучения у нас в руках оказывается сетка, которая для заданного предложения строит вектор заданной размерности (например, 64 или 256), в котором закодирована семантика.

Пока качество получающихся семантических векторов я проверяю обкатанным ранее способом - через косинусную меру близости разных тестовых фраз. Хотя мне кажется, нужна другая валидационная метрика.
Read more...Collapse )

Перефразировки и глубинная категория определенности в русском языке
kelijah
Если смотреть на некоторые перефразировки, то можно заметить торчащие уши некой категории "определенности/количества", которая в английском языке и некоторых других выражается артиклями:

Слышен собачий лай. (одна собака или несколько? собака известна слушателю или это некая абстрактная собака?)
Слышен лай собаки.
Слышен лай собак.

И прилагательное собачий, и существительное собака в этих случаях называет одно и тоже качество, но есть вышеупомянутая разница в определенности (confidence?). Не удивлюсь, если эта категория замечена и как-то умно называется в "текст<=>смысл" и т.д.

Похожесть фраз в рекуррентной модели (phrase2vector)
kelijah
Странно и немного неожиданно, но sequence2sequence модель, обученная на маленьком кусочке описанного ранее датасета, научилась похоже не только делать "word bagging", но и учитывать побуквенную похожесть
слов.

Быстрая проверка похожести фраз через косинус векторов на выходе кодирующей рекуррентной сетки дает такую картинку:
Read more...Collapse )

Буду делать более тщательную проверку, чтобы исключить случайности.

Датасет для 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
Disclaimer: если бы не необходимость иметь достаточно большую статистику употребления, word2vector модель могла бы неплохо объяснить феномен понимания смысла слов без явного учителя.

Использую мой корпус отзывов и gensim.
В нем есть слово 'анекстура'. Что оно значит?
Read more...Collapse )

Skip-gram и открой окно пошире...
kelijah
Продолжая http://kelijah.livejournal.com/167972.html.
В word2vector модели при генерации поставил cbow=0 и слелал размер окна 10.
Плюс изменил порядок сравнения близости контекстов.
Итог - неточность снятия омонимии и определения нужного смысла для многозначных слов упала в 3 раза, до ~8%:
Листинг тестового прогона для tf-idf и word2vector алгоритмов...Collapse )