Косинусное сходство списка значений друг с другом - PullRequest
1 голос
/ 11 марта 2019

Я пытаюсь найти косинусное сходство списка строк.Я использовал вектор sklearn tfidf, чтобы сначала преобразовать текст в числовой вектор, а затем использовал парный код cosine_sdentifity, чтобы найти оценку для каждой пары строк.

Строки кажутся похожими, но я получаю странный ответ.Первое и третье значение в массиве строк похожи, кроме слова TRENTON, но косинусное сходство равно 0. Аналогично, 1-я, 3-я и 4-я строки одинаковы, за исключением пробела между ЗЕЛЕНЫМ и ЧИЛЛИ, а сходство косинуса равно нулю,Разве это не странно?

Мой код:

from sklearn.metrics import pairwise_kernels
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.feature_extraction.text import TfidfVectorizer

tfidf_vectorizer=TfidfVectorizer()

values =['GREENCHILLI TRENTON'
,'GREENCHILLI'
,'GREEN CHILLI'
,'GREEN CHILLI']

X_train_counts = tfidf_vectorizer.fit_transform(values)
similarities = cosine_similarity(X_train_counts) 
print(similarities)

Вывод

 [[1.        0.6191303 0.        0.       ]
 [0.6191303 1.        0.        0.       ]
 [0.        0.        1.        1.       ]
 [0.        0.        1.        1.       ]]

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Первое и третье значение в значениях строкового массива аналогично, за исключением слова Трентон, но косинусное сходство равно 0. Точно так же 1-я, 3-я и 4-я строки - это одно и то же пространство между ЗЕЛЕНЫМ и ЧИЛИ, а косинусное сходство равно нулю разве это не странно?

Это не так странно, как вы думаете. Вы получите ненулевое сходство косинусов, только если у вас есть точные совпадения слов между сравниваемыми строками. Я постараюсь объяснить, что происходит:

Когда векторизатор TF-IDF создает векторы из вашего списка строк, он начинает с составления списка всех встречающихся слов.

Итак, в вашем случае список будет выглядеть так:

GREENCHILLI TRENTON GREEN CHILLI

Теперь каждое слово становится осью в системе координат, которую использует алгоритм. Все оси перпендикулярны друг другу.

Таким образом, когда вы сравниваете «GREENCHILLI TRENTON» с «GREEN CHILLI», алгоритм создает два вектора. Один из 'GREENCHILLI TRENTON', который имеет компонент, параллельный 'GREENCHILLI', и компонент, параллельный 'TRENTON'. Вектор из строки 'GREEN CHILI' содержит компоненты в направлении 'GREEN' и 'CHILLI' вашей системы координат. Когда вы вычисляете скалярное произведение между двумя, вы получите ноль. Таким образом, косинусное сходство также равно нулю.

Таким образом, разрыв в «GREEN CHILLI» имеет все значение, если сравнивать его с «GREENCHILLI». Буквы больше не имеют значения, когда векторизатор создал свою систему координат на основе всех слов, найденных в вашем списке, потому что он идентифицирует «GREENCHILLI», «GREEN» и «CHILLI» как разные слова и превращает их в перпендикулярные оси в его эталонная система координат.

Надеюсь, это прояснит ситуацию. Я предлагаю прочитать следующую серию статей для более глубокого понимания происходящего:

http://blog.christianperone.com/2011/09/machine-learning-text-feature-extraction-tf-idf-part-i/

0 голосов
/ 11 марта 2019

запятая (,) пропущена между двумя последними зелеными чили, поэтому tfidf рассматривает их как только 3 записи, а не 4.

Если вы исправите это, вы увидите ниже косинусное сходство

[[1. 0.6191303 0. 0. ] [0.6191303 1. 0. 0. ] [0. 0. 1. 1. ] [0. 0. 1. 1. ]]

Как интерпретировать вышеуказанную матрицу: значение в n-й строке представляет собой косинусное сходство этого вектора tfidf со всеми другими векторами (в последовательном порядке). Таким образом, вся диагональ будет 1, потому что каждый вектор похож на себя.

...