Нужна помощь в создании подходящей модели для прогнозирования семантического сходства между двумя предложениями - PullRequest
0 голосов
/ 09 октября 2018

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

1. Используя модель word2vec в пакете gensim, векторизуйте каждое слово, присутствующее в рассматриваемых предложениях

2. Вычислите средний вектор для всех слов в каждом предложении / документе

import numpy as np
from scipy import spatial

index2word_set = set(model.wv.index2word)

def avg_feature_vector(sentence, model, num_features, index2word_set):
    words = sentence.split()
    feature_vec = np.zeros((num_features, ), dtype='float32')
    n_words = 0
    for word in words:
        if word in index2word_set:
            n_words += 1
            feature_vec = np.add(feature_vec, model[word])
    if (n_words > 0):
        feature_vec = np.divide(feature_vec, n_words)
    return feature_vec

3. Далее вычислите косинусное сходство между этими двумя усредненными векторами

s1_afv = avg_feature_vector('this is a sentence', model=model, 
num_features=300, index2word_set=index2word_set)
s2_afv = avg_feature_vector('this is also sentence', model=model, 
num_features=300, index2word_set=index2word_set)
sim = 1 - spatial.distance.cosine(s1_afv, s2_afv)
print(sim)

Контрольный вопрос stackoverflow: Как рассчитать сходство предложений с помощью модели gensim word2vec с python

Требуется помощь для следующей задачи:

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

1Какая модель лучше всего подходит для этой задачи

2.Следующее более важно, как обучить эту модель?

Должен ли я создать матрицу, в которой каждая строка будет содержать два предложения: sen1 и sen2, и я бы векторизовал их и вычислил косинусное сходство (согласно вышеупомянутому подходу)

Затем для обучающих данных:

X_Train: средние векторы для sen1 и sen2 и их значение сходства косинусов

y_Train (прогноз): набор двоичных значений (1 или аналогичный, если сходство косинусов> 0,7 и 0 в противном случае)

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

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

1 Ответ

0 голосов
/ 09 октября 2018

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

Вы можете использовать заранее обученные векторы слов другого человека, но если у вас есть хороший большой обучающий набор текста изваш домен, эти словосочетания могут работать лучше.Вам следует поискать учебник о том, как тренировать свои собственные словосочетания с помощью gensim.Например, в его каталоге docs/notebooks есть демонстрационная записная книжка Jupyter word2vec.ipynb, которую вы также можете просмотреть онлайн по адресу:

https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/word2vec.ipynb

Ваш текущий *Функция 1011 * имеет ряд проблем.В частности:

  • , если вы передадите model, он уже включает в себя фиксированный список index2word и уже определенное количество измерений - так что нет необходимостичтобы передать их в избыточном

  • , вы перебираете все слова в модели, а не только слова в вашем предложении, поэтому не рассчитываете только на основе вашего предложения

  • есть лучшие, более питонские способы выполнения различных математических операций с массивами, которые вы пытаетесь - включая в библиотеку numpy простую функцию mean(), которая избавит вас от сложения и разделения при созданиисреднее

Вы можете решить эти проблемы в качестве упражнения, но вместо этого вы можете использовать служебные методы для слов-векторов model.В частности, посмотрите на n_similarity() - он, в частности, принимает два набора слов, автоматически усредняет каждый набор, а затем сообщает значение сходства (ближе к 1,0 для более похожих, ближе к -1,0 для наименее похожих) междудва набора.См .:

https://radimrehurek.com/gensim/models/keyedvectors.html#gensim.models.keyedvectors.Word2VecKeyedVectors.n_similarity

Итак, если у вас было два предложения (в виде строк) в sent1 и sent2, и набор слов-векторов (либо только что обученных вамиили загружен откуда-либо еще) в kv_model, вы можете получить сходство предложения с помощью:

kv_model.n_similarity(sent1.split(), sent2.split())

(вы все равно можете получить ошибки, если какой-либо из токенов-слов не известен модели.)

Если вы на самом деле создадите средние векторы для разных предложений и сохраните их в каком-то списке / dict / dataframe / etc, или просто запомните где-нибудь попарные сходства, это будет зависеть от того, что вы хотите делать дальше.

И после того, как у вас есть основы, работающие над этой простой мерой сходства текста, вы можете заняться другими методами.Например, другой способ сравнения двух текстов с использованием слов-векторов, но не с помощью простого среднего, называется «Расстояние для Word Mover».(Однако вычислить это немного медленнее.)

Еще один метод свертывания текстов в один вектор для сравнения доступен в gensim как Doc2Vec - он работает так же, какWord2Vec, но также создает векторы для каждого длинного текста, а не просто слова для каждого отдельного слова.

...