#python #scikit-learn #tf-idf #tfidfvectorizer
#python #scikit-учиться #tf-idf #tfidfvectorizer
Вопрос:
Я пытаюсь найти косинусное сходство списка строк. Сначала я использовал sklearn tfidf vector для преобразования текста в числовой вектор, а затем использовал pairwise cosine_similarity api, чтобы найти оценку для каждой пары строк.
Строки кажутся похожими, но я получаю странный ответ. Первое и третье значения в массиве строк похожи, за исключением слова TRENTON, но косинусное сходство равно 0. Аналогично, 1-я, 3-я и 4-я строки одинаковы, за исключением пробела между GREEN и CHILLI, а косинусное сходство равно нулю. Разве это не странно?
Мой код:
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. ]]
Ответ №1:
coma (,) отсутствует между двумя последними ЗЕЛЕНЫМИ перцами ЧИЛИ, поэтому tfidf обрабатывает их только как 3 записи, а не как 4.
Если вы исправите это, вы должны увидеть ниже косинусное сходство
[[1. 0.6191303 0. 0. ]
[0.6191303 1. 0. 0. ]
[0. 0. 1. 1. ]
[0. 0. 1. 1. ]]
Как интерпретировать приведенную выше матрицу: значение в n-й строке является косинусным сходством этого вектора tfidf со всеми другими векторами (в последовательном порядке). Таким образом, вся диагональ будет равна 1, потому что каждый вектор похож на себя.
Ответ №2:
Первое и третье значения в строковом массиве values похожи, за исключением слова Trenton, но косинусное сходство равно 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/