Найдите корреляцию между двумя списками текстов.

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

Допустим, у меня есть несколько списков текстов, такие как:

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 и метод корреляции Пирсона, вы получите четкое понимание взаимосвязей между перечисленными списками. Обратите внимание, что качество полученных результатов будет зависеть от используемой модели и её способности адекватно представлять смысл текстов.

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

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