Вопрос или проблема
Допустим, у меня есть несколько списков текстов, такие как:
A = ["девочка", "женщина", "королева"]
B = ["мальчик", "мужчина", "король"]
C = ["пожарный", "строительный рабочий", "механик"]
D = ["медсестра", "учитель начальных классов", "эстетист"]
Могу ли я вычислить корреляции между списками, чтобы в итоге получить матрицу корреляций между каждым списком?
Первое очевидное действие – применить техники эмбеддинга, такие как BERT или Word2Vec, ко всем спискам, но что дальше?
Мне хотелось бы получить что-то, показывающее, что A коррелирует с D, B коррелирует с C, A негативно коррелирует с B и т. д.
Ответ или решение
Чтобы рассчитать корреляцию между списками текстов, такими как A, B, C и D, вы можете использовать методы векторизации для представления текстов в числовом формате. Далее я опишу пошаговый метод, который поможет создать корреляционную матрицу между вашими списками текстов.
Шаг 1: Векторизация текстов
Первым шагом является преобразование текстов в векторы. Вы можете использовать такие техники, как:
- Word2Vec: Эта модель обучает представления слов на базе контекста, в котором они появляются.
- BERT: Данная модель создает контекстуализированные векторные представления слов, учитывая всю фразу.
Для примера, будем использовать BERT с библиотекой transformers
от Hugging Face.
from transformers import BertTokenizer, BertModel
import torch
def get_embeddings(text_list):
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')
# Объединяем тексты в одну строку для обработки
inputs = tokenizer(text_list, return_tensors='pt', padding=True, truncation=True)
with torch.no_grad():
outputs = model(**inputs)
# Берем усредненное представление векторов по всем токенам
embeddings = outputs.last_hidden_state.mean(dim=1)
return embeddings
# Применение функции к спискам
A = ["girl", "woman", "queen"]
B = ["boy", "man", "king"]
C = ["firefighter", "construction worker", "mechanic"]
D = ["nurse", "elementary school teacher", "esthetician"]
embeddings_A = get_embeddings(A)
embeddings_B = get_embeddings(B)
embeddings_C = get_embeddings(C)
embeddings_D = get_embeddings(D)
Шаг 2: Вычисление корреляции
Теперь у нас есть векторные представления для каждого списка. Следующий шаг — вычислить корреляцию между этими векторами. Вы можете использовать корреляцию Пирсона для этой цели.
import numpy as np
from scipy.stats import pearsonr
def calculate_correlation(vector1, vector2):
return pearsonr(vector1.numpy(), vector2.numpy())[0]
# Вычисляем корреляции между всеми парами списков
correlation_matrix = np.zeros((4, 4))
lists = [embeddings_A, embeddings_B, embeddings_C, embeddings_D]
for i in range(len(lists)):
for j in range(len(lists)):
if i != j:
correlation_matrix[i][j] = calculate_correlation(lists[i], lists[j])
# Условные имена для заполнения матрицы
list_names = ['A', 'B', 'C', 'D']
print("Корреляционная матрица:")
print(correlation_matrix)
Шаг 3: Интерпретация результатов
После выполнения кода вы получите корреляционную матрицу, где каждый элемент отражает степень корреляции между двумя текстовыми списками. Положительные значения указывают на корреляцию, а отрицательные – на обратную корреляцию.
Заключение
С помощью вышеописанных шагов вы можете вычислить корреляцию между данными текстами. Используя векторизацию на основе BERT или Word2Vec и метод корреляции Пирсона, вы получите четкое понимание взаимосвязей между перечисленными списками. Обратите внимание, что качество полученных результатов будет зависеть от используемой модели и её способности адекватно представлять смысл текстов.