Как вычислить среднее значение векторного представления слов и затем сравнить строки, используя sklearn.metrics.pairwise.

Вопрос или проблема

Я абсолютно новичок в этой теме, поэтому я так запутался и застрял в этом коде на некоторое время, но я не уверен, как правильно решить это.
Моя цель – написать короткое текстовое встраивание с использованием векторного представления из текста. Встраивания слов агрегируются путем усреднения для вывода векторного представления для текста.
Я сгенерировал векторы модели, используя gensim.models, а затем прогнал каждое слово через модель и проверил, находится ли слово в ней. Если да, я встраиваю его, а затем агрегирую среднее (не уверен, правильно ли это). После этого я хочу сравнить его с косинусной схожестью, но я не уверен, как это сделать.

from sklearn.metrics.pairwise import cosine_similarity

first_sentence_list = ['водитель', 'движется', 'в', 'коляску', 'с', 'ребенком', ',', 'уезжает']
second_sentence_list = ['водитель', 'движется', 'в', 'маму', ',', 'коляску', 'с', 'ребенком', 'затем', 'уезжает']

//

def meanEmbeddings(text_list):
    model = load_wiki_en_vectors()

    test = []
//цикл по данному предложению
    for word in text_list:
        try:
            word_embeding = model.get_vector(word, norm=True)
            test.append(np.mean(word_embeding, axis=0)) // не уверен, правильно ли я делаю усреднение здесь
        except KeyError:
            continue
    return test


res_1 = meanEmbeddings(first_sentence)
//[0.0023045307, 0.0033775743, ...]
res_2 = meanEmbeddings(second_sentence)
//[0.0023045307, 0.0033775743,...]

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


cos = cosine_similarity([res_1], [res_2])

Это должно работать, вам не нужно добавлять.

   def meanEmbeddings(model, words):
        # удалить слова вне словаря
        words = [word for word in words if word in model.vocab]
        if len(words) >= 1:
            return np.mean(model[words], axis=0)
        else:
            return []

Попробуйте это. Это усреднит встраивания слов для получения встраиваний предложений.

# импорт библиотек
import gensim
from sklearn.metrics.pairwise import cosine_similarity

# загрузка word2vec
model = gensim.models.KeyedVectors.load_word2vec_format('путь к word2vec, например GoogleNews-vectors-negative300.bin', binary=True)

# ваши входные данные
first_sentence_list = ['водитель', 'движется', 'в', 'коляску', 'с', 'ребенком', ',', 'уезжает']
second_sentence_list = ['водитель', 'движется', 'в', 'маму', ',', 'коляску', 'с', 'ребенком', 'затем', 'уезжает']

# удалить слова вне словаря
first = [word for word in first_sentence_list if word in model.key_to_index]
second = [word for word in second_sentence_list if word in model.key_to_index]

# усреднить встраивания слов, чтобы получить встраивания предложений
first_sent_embedding = np.mean(model[first], axis=0)
second_sent_embedding = np.mean(model[second], axis=0)

# вычислить схожести
result = cosine_similarity(first_sent_embedding.reshape(1, -1), second_sent_embedding.reshape(1, -1))

print(result)

Ответ или решение

Как рассчитать среднее значение векторного представления слов и сравнить строки с помощью sklearn.metrics.pairwise

Работа с векторными представлениями слов и их агрегирование для получения текстовых векторов представляет собой важную задачу в области обработки естественного языка (NLP). Давайте подробно рассмотрим, как можно посчитать средний вектор слов и сравнить два предложения, используя библиотеку scikit-learn.

1. Подготовка данных

Начнем с определения предложений, которые мы хотим сравнить. Например:

first_sentence_list = ['водитель', 'сдает', 'в', 'прогулочную', 'коляску', 'с', 'ребенком', ',', 'уезжает']
second_sentence_list = ['водитель', 'сдает', 'в', 'маму', ',', 'прогулочную', 'коляску', 'с', 'ребенком', 'затем', 'уезжает']

2. Загрузка модели векторного представления слов

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

import gensim
import numpy as np

# Загрузка предобученной модели Word2Vec
model = gensim.models.KeyedVectors.load_word2vec_format('путь_к_модели.bin', binary=True)

3. Функция для расчета среднего вектора

Функция meanEmbeddings будет находить векторы слов для каждого слова в предложении и вычислять их среднее значение. Необходимо также отсекать слова, которые отсутствуют в модели:

def meanEmbeddings(model, words):
    # Убираем слова, отсутствующие в vocab модели
    words = [word for word in words if word in model.key_to_index]

    # Проверяем, есть ли векторы для слов
    if len(words) >= 1:
        return np.mean(model[words], axis=0)
    else:
        return None

4. Рассчет средних векторов для предложений

Теперь используем функцию для получения векторов предложений:

first_sent_embedding = meanEmbeddings(model, first_sentence_list)
second_sent_embedding = meanEmbeddings(model, second_sentence_list)

5. Сравнение предложений с помощью косинусной схожести

Для сравнения двух текстовых векторов воспользуемся функцией cosine_similarity из библиотеки scikit-learn. Обратите внимание, что векторы необходимо преобразовать в нужный формат:

from sklearn.metrics.pairwise import cosine_similarity

if first_sent_embedding is not None and second_sent_embedding is not None:
    result = cosine_similarity(first_sent_embedding.reshape(1, -1), second_sent_embedding.reshape(1, -1))
    print(f"Косинусная схожесть: {result[0][0]}")
else:
    print("Один из векторов не был рассчитан. Проверьте входные данные.")

Заключение

С помощью описанных шагов вы можете рассчитать среднее значение векторов слов и сравнить два предложения используя косинусную схожесть. Данная методология позволяет эффективно извлекать семантическую информацию из текста и применять ее в задачах анализа данных и машинного обучения. Важно отметить, что корректная работа с моделями и обработка текста являются ключевыми для получения надежных результатов в NLP.

Оцените материал
Добавить комментарий

Капча загружается...