Построение фрейма данных из списка оценок расстояния попарного перемещения слов

#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]