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

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

Previous Entry Share Next Entry
Матрица соответствия шинглов в задаче определения релевантности факта и вопроса
kelijah
Далее - пример того, как некоторые особенности технологии подготовки датасета, наложившись на свойства самого языка, могут проявить себя в NLP модели весьма необычным образом.

Постановка задачи

Модель должна определять релевантность предложения-факта (далее - "предпосылка") и предложения-вопроса. Релевантность включает в себя такие случаи, как:

1) тривиальные лексические перестановки, валидные в силу относительно свободного порядка слов в русском языке:

"продам диван абсолютно новый"
"продам абсолютно новый диван"

Некоторые примеры таких пар можно найти в файлах в репозитории https://github.com/Koziev/NLP_Datasets/tree/master/ParaphraseDetection/Data.

2) синтаксические перестановки и словообразовательные вариации, представляющие эквивалентное выражение семантики с использованием синтаксических и морфологических альтернатив русской грамматики:

"А поев, он сразу отойдет."
"Он поест и сразу отойдет."

или

"Страдает и становится злым."
"От страданий становится злым."

Если допустить определенные потери фактологических нюансов, то в эту категорию попадают и пары типа:

"они пытались решить проблему"
"их попытка решить пороблему"

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

3) вопросы к какому-то аспекту факта:

"Теща уехала к родственникам в Рязань."
"Куда теща уехала?"

4) некоторые другие случаи, включающие в себя продуктивную синонимию типа "бесследно - следов нет" и так далее.

Исходные тексты и датасет для воспроизведения

Все необходимое лежит в репозитории https://github.com/Koziev/chatbot. В частности, готовый датасет с релевантными и нерелевантными парами https://github.com/Koziev/chatbot/blob/master/data/premise_question_relevancy.csv, сгенерированный кодом https://github.com/Koziev/chatbot/blob/master/PyModels/prepare_relevancy_dataset.py

Тетрадка с кодом исследования фичи доступна по ссылке: https://github.com/Koziev/chatbot/blob/master/PyModels/%D0%9C%D0%B0%D0%BD%D0%B8%D0%BF%D1%83%D0%BB%D1%8F%D1%86%D0%B8%D0%B8%20%D1%81%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9%20%D1%88%D0%B8%D0%BD%D0%B3%D0%BB%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE%20%D1%81%D0%BE%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%81%D1%82%D0%B2%D0%B8%D1%8F%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9.ipynb

Обучение и валидация классификатора на базе XGBoost реализованы в файле https://github.com/Koziev/chatbot/blob/master/PyModels/xgb_relevancy3.py

Матрица соответствия шинглов

Исследуемый вектор признаков получается таким способом (см. функцию get_shingle_image). На входе имеет две строки. Нарезаем их на шинглы - перекрывающиеся символьные 3-граммы. Получаем n1 и n2 шинглов соответственно, по количеству символов в строках. Далее заполняем матрицу n1*n2 значениями 1 и 0 согласно равенству соответствующих шимглов.

Для предложений разной длины получаются матрицы разного размера. Приведем их к одному размеру, представив как черно-белое изображение и использовав стандартный алгоритм масштабирования из библиотеки scikit-image (http://scikit-image.org/). В тетрадке
реализовано приведение к размеру 16*16.

Например, для двух предложений

"кошка отчаянно ловит серую мышку"
"серую мышку хочет поймать кошка"

получаем такую матрицу соответствия шинглов:



А после масштабирования:



Яркости пикселов в получившейся матрице как раз и будут действительными числовыми признаками, которые будут подаваться на вход классификатора.

Модель классификатора XGBoost

Описанная процедура получения признаков полностью исключает из модели любую информацию о конкретных словах во фразах. Остается только информация о структуре преобразования одного предложения в другое. Для тривиального случая равных строк матрица соответствия будет просто диагональной. Тем не менее, классификатор, даже лишенный доступа к самим словам, достигает относительно неплохой точности - f1 score на валидации дает больше 0.9. У меня есть сильные подозрения, что часть такой высокой точности объясняется достаточно небольшим набором правил получения вопроса для предпосылки в датасете. Эти структурные правила улавливаются классификатором даже без учета лексического наполнения текста. Я попробовал кластеризовать эти векторы признаков (k-means, см. тетрадку), но сходу ничего визуально осмысленного получить не удалось, тем не менее подозрение о причинах работоспособности модели остается.

?

Log in

No account? Create an account