2016-05-26 3 views
0

Я вычислил tf-idf моих документов на основе терминов. Затем я применил LSA для уменьшения размерности термов. «Similarity_dist» содержит значения, которые являются отрицательными (см. таблицу ниже). Как вычислить расстояние косинуса с диапазоном 0-1?Как обрабатывать отрицательные значения сходства косинусов

tf_vectorizer = CountVectorizer(max_df=0.95, min_df=2, tokenizer=tokenize_and_stem, stop_words='english') 
%time tf = tf_vectorizer.fit_transform(descriptions) 
print(tf.shape) 
svd = TruncatedSVD(100) 
normalizer = Normalizer(copy=False) 
lsa = make_pipeline(svd, normalizer) 
tfidf_desc = lsa.fit_transform(tfidf_matrix_desc) 
explained_variance = svd.explained_variance_ratio_.sum() 
print("Explained variance of the SVD step: {}%".format(int(explained_variance * 100))) 

similarity_dist = cosine_similarity(tfidf_desc) 
pd.DataFrame(similarity_dist,index=descriptions.index, columns=descriptions.index).head(10) 

print(tfidf_matrix_desc.min(),tfidf_matrix_desc.max()) 
#0.0 0.736443429828 

print(tfidf_desc.min(),tfidf_desc.max()) 
#-0.518015429416 0.988306783341 

print(similarity_dist.max(),similarity_dist.min()) 
#1.0 -0.272010919022 

enter image description here

+0

Weird. Ожидается, что Tfidfs будет положительным, поэтому косинус должен быть в числе 0 и 1. Обычно нормализуем, чтобы облегчить вычисление косинуса, поскольку это точечный продукт для нормированной матрицы. Ваш код не показывает косинус-вызов, а также использует svd вместо lda, как вы заявили. Не могли бы вы опубликовать весь код, который вы используете? – Rabbit

+0

Извините, я применил LSA, а не LDA. Я обновил код. Значения 'tfidf_matrix_desc' находятся между 0-1, tfidf_desc содержит отрицательные значения (см. инструкции печати). – kitchenprinzessin

ответ

0

cosine_similarity находится в диапазоне от -1 до 1

косинуса расстояние определяется как:

cosine_distance = 1 - cosine_similarity 

, следовательно, cosine_distance будет находиться в диапазоне от 0 до 2

См. https://en.wikipedia.org/wiki/Cosine_similarity

Косинусное расстояние - это термин, который часто используется для дополнения в положительном пространстве, то есть: D_C (A, B) = 1 - S_C (A, B).

Примечание: если вы обязательно иметь его в диапазоне от 0 до 1, вы можете использовать cosine_distance/2

+0

Не могли бы вы объяснить, что расстояние должно быть разделено на 2? Косинус-сходство между doc0, doc0 (таблица выше) равно 1, поэтому я думаю, что метод sklearn возвращает сходство в положительном пространстве, или я что-то не хватает? – kitchenprinzessin

+0

cosine_similarity определяется как значение от -1 до 1, cosine_distance определяется как: 1 - cosine_similarity -> следовательно, диапазон cosine_distance составляет от 0 до 2. – Yaron

Смежные вопросы