#python #matrix #nlp #word-embedding
#python #матрица #nlp #встраивание слов
Вопрос:
Я хотел бы запустить анализ PCA в списке расстояния попарного предложения (расстояние перемещения слов) У меня было. Пока я получил оценку сходства для каждой пары предложений. Сохранены все оценки попарного сходства в списке. Мой главный вопрос:
Как построить матрицу, содержащую эти оценки сходства с индексом исходных предложений? В настоящее время список содержит только оценку каждой пары. Пока не нашел способ сопоставить оценки обратно с самим предложением.
Мой идеальный фрейм данных выглядит следующим образом:
> Sentence1 Sentence2 Sentence3
Sentence1. 1 0.5 0.8
Sentence2 0.5 1 0.4
Sentence3 0.8 0.4 1
Однако список оценок сходства, который у меня есть, выглядит следующим образом, без индекса:
[0.5, 0.8, 0.4]
Как мне преобразовать его в фрейм данных, на котором я могу запустить PCA? Спасибо!
—-шаги, которые я предпринял для построения оценки попарного сходства
# Tokenize all sentences in a column
tokenized_sentences = [s.split() for s in df[col]]
# calculate distance between 2 responses using wmd
def find_similar_docs(sentence_1, sentence_2):
distance = model.wv.wmdistance(sentence_1, sentence_2)
return distance
# find response pairs
pairs_sentences = list(combinations(tokenized_sentences, 2))
# get all similiarity scores between sentences
list_of_sim = []
for sent_pair in pairs_sentences:
sim_curr_pair = find_similar_docs(sent_pair[0], sent_pair[1])
list_of_sim.append(sim_curr_pair)
Было бы намного проще, если бы у меня был «1» вместо маркированного предложения ([«Я», «открытый», «общение», «культура»]) в качестве индекса. 🙂 Так что я немного застрял здесь…
Ответ №1:
Создайте матрицу расстояний с помощью numpy, затем преобразуйте в фрейм данных pandas.
import numpy as np
import pandas as pd
# calculate distance between 2 responses using wmd
def find_similar_docs(sentence_1, sentence_2):
distance = model.wv.wmdistance(sentence_1, sentence_2)
return distance
# create distance matrix
tokenized_sentences = [s.split() for s in df[col]]
l = len(tokenized_sentences)
distances = np.zeros((l, l))
for i in range(l):
for j in range(l):
distances[i, j] = find_similar_docs(tokenized_sentences[i], tokenized_sentences[j])
# make pandas dataframe
labels = ['sentence' str(i 1) for i in range(l)]
df = pd.DataFrame(data=distances, index=labels, columns=labels)
print(df)
Комментарии:
1. Спасибо! Я хотел бы использовать исходный индекс, связанный с этими оценками. Например, это может быть sentence_2 и sentence_4, связанные с 0.5. Есть ли у меня способ извлечь эту информацию и использовать ее в качестве меток?
2. Мне нужно было бы знать, как был создан список оценок сходства, чтобы получить исходные метки / индекс.
3. Спасибо за ваше предложение! Только что обновил мой оригинальный пост.
4. Спасибо! Через 3 часа это сработало! Быстрый последующий вопрос, имена столбцов «предложение 1», «предложение 2». Вы знаете, есть ли у меня способ отследить, к какому предложению относится предложение 1 в исходном фрейме данных? Еще раз спасибо!
5.
Sentence1
было бы эквивалентноtokenized_sentences[0]