Astrohas
@Astrohas
Python/Django Developer

Что посоветуете для сравнения двух предложений по смыслу?

Здравствуете, уважаемы тостерчане! В одном проекте специализирующем на тестах, требуется семантическое и смысловое сравнение двух коротких (2-5 слов) предложений. Что можете посоветовать?
Пока что думаю над канонизацией и анализом через pymorphy2 а потом на основе базы синонимов унифицировать в один формат а потом сравнить.
Хотелось бы узнать ваш опыт по этому направлению.
  • Вопрос задан
  • 1297 просмотров
Решения вопроса 2
@SolidMinus
Унифицирование подойдет как препроцессинг текста. Т.е, есть некоторое множество < K, V >, где K - числовое описание класса синонима ( например, различные синонимы в один класс ), V - тензор синонимов, где по 0-й оси отложены вектора со словами, содержащие кодированные ( Unicode, так понимаю в данном случае ) слова. Стоит обратная задача нахождения по V соответствующего K, почти как словарь, но наоборот. Предложение трансформируется в последовательность K_i, после чего эта унифицированная, как вы правильно сказали, анализируется. Перед анализом унифицированный вектор надо отобразить в пространство фиксированной размерностью, чтобы все предложения были как бы одинаковой длины. Можно просто дописать нули, например, чтобы вектор стал с 5 компонентами ( максимальная длина предложения )

Тут два варианта. 1-й более эффективный и сложный, 2-й более простой
1) LSTM-сети. Почему LSTM? Потому что данный вид RNN сетей наиболее подходит для анализа последовательностей.
По выходу определяете смысловой класс. Т.е, имеем RNN с 5 входами, и выходами, равными количеству смысловых классов, дающее k-мерный вектор распределения вероятностей по классам. argmax(output) будет наш класс. Типичная задача мультиклассовой классификации, но при помощи RNN сетей. Если с рнн не разберетесь, можно обычную MLP-сеть, но выход будет хреновеньким, т.к это последовательность завязанная на предыдущих состояниях элемента. У нас не бывает предложений вроде "привет нет да пока эх машина".

Нужно предобучение на огромной базе размеченной вручную. Т.е, такой вектор - такой класс.

2) Можно пойти по простому пути, без нейронных сетей использовать норму разницы между двумя векторами. Требуемым, и введенным, чем меньше норма - тем более близкое по смыслу предложение. Ведь числовая последовательность предложения является вектором в n-мерном пространстве. В нашем случае после нормализации в 5-мерном пространстве. А норма - это обобщение расстояния на большие размерности, т.е при разницы векторов предложений мы получаем третий вектор, чья длина - расстояние между векторами. Можно использовать различные метрики. Какая больше нравится. Я бы предпочел метрику минковского c p = 2.

Предобучение не требуется, никаких сложностей тоже. Просто школьная арифметика. Но и предложения, например:

"Сегодня я пошел в школу снова" и "Завтра я поеду в командировку опять" могут показаться одинаковыми по смыслу. О чем и говорил Максим Чернятевич, имея ввиду, что с базой синонимов можно сделать только самый простой анализ, т.к после нормализации по синонимам в один вектор, скорее будут полностью равны.
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы