- Вопрос или проблема
- Ответ или решение
- Как рассчитать среднее значение векторного представления слов и сравнить строки с помощью sklearn.metrics.pairwise
- 1. Подготовка данных
- 2. Загрузка модели векторного представления слов
- 3. Функция для расчета среднего вектора
- 4. Рассчет средних векторов для предложений
- 5. Сравнение предложений с помощью косинусной схожести
- Заключение
Вопрос или проблема
Я абсолютно новичок в этой теме, поэтому я так запутался и застрял в этом коде на некоторое время, но я не уверен, как правильно решить это.
Моя цель – написать короткое текстовое встраивание с использованием векторного представления из текста. Встраивания слов агрегируются путем усреднения для вывода векторного представления для текста.
Я сгенерировал векторы модели, используя 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.