Как рассчитать косинусное сходство из TfidfVectorizer?

У меня есть два CSV-файла - обучающий и тестовый, по 18000 отзывов каждый. Мне нужно использовать файл поезда для извлечения функций и расчета метрики сходства между каждым обзором в файле поезда и каждым обзором в тестовом файле.

Я создал словарь на основе слов из набора поезда и теста - я удалил стоп-слова, но не удалил опечатки и корень.

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

Это фрагмент кода, который соответствует данным моего поезда vocabulary:

vect = TfidfVectorizer(sublinear_tf=True, min_df=0.5,      vocabulary=vocabulary)
X = vect.fit_transform(train_list)
vocab = vect.get_feature_names()
# train_matrix = X.todense()
train_idf = vect.idf_
print vocab
print X.todense()

Результат, который я получаю от X.todense ():

[[ 0.  0.  0. ...,  0.  0.  0.]
 [ 0.  0.  0. ...,  0.  0.  0.]
 [ 0.  0.  0. ...,  0.  0.  0.]
 ..., 
 [ 0.  0.  0. ...,  0.  0.  0.]
 [ 0.  0.  0. ...,  0.  0.  0.]
 [ 0.  0.  0. ...,  0.  0.  0.]]

Если я просто напечатаю X, это будет выглядеть так:

(0, 28137)  0.114440020953
(0, 27547)  0.238913278498
(0, 26519)  0.14777362826
(0, 26297)  0.247716207254
(0, 26118)  0.178776605168
(0, 26032)  0.15139993147
(0, 25771)  0.10334152493
(0, 25559)  0.157584788446
(0, 25542)  0.0909693864147
(0, 25538)  0.179738937276
(0, 21762)  0.112899547719
(0, 21471)  0.159940534946
(0, 21001)  0.0931693893501
(0, 13960)  0.134069984961
(0, 12535)  0.198190713402
(0, 11918)  0.142570540903
:   :
(18505, 18173)  0.237810781785
(18505, 17418)  0.233931974117
(18505, 17412)  0.129587180209
(18505, 17017)  0.130917070234
(18505, 17014)  0.137794139419
(18505, 15943)  0.130040669343
(18505, 15837)  0.0790013472346
(18505, 11865)  0.158061557865
(18505, 10896)  0.0708161593204
(18505, 10698)  0.0846731116968
(18505, 10516)  0.116681527108
(18505, 8668)   0.122364898181
(18505, 7956)   0.174450779875
(18505, 1111)   0.191477939381
(18505, 73) 0.257945257626

Я не знаю, как прочитать вывод X.todense () или распечатать X, и я не уверен, как найти косинусное расстояние между тестовым набором и набором поездов (возможно, используя попарное сходство? - http://scikit-learn.org/stable/modules/generated/sklearn.metrics.pairwise.pairwise_distances.html?)

Редактировать:

Я повторил те же шаги для своих тестовых данных. Теперь у меня есть две разреженные матрицы X и Y типа scipy.sparse.csr.csr_matrix, но поскольку они обе разреженные и имеют тип (doc, term) tf-idf, я не могу напрямую получить косинусное сходство между X и Y прямым умножением.

Преобразование X и Y с помощью todense() дает мне ошибку MemoryError - что означает, что это неэффективно.

Что я должен делать дальше?

Мне нужно получить какую-то матрицу с попарным косинусным сходством размеров 18000 * 18000 или разреженную матрицу, но я не знаю, как это сделать.

Это для домашнего задания, и на данном этапе мне никакое чтение документации по sklearn не помогает.


person boltthrower    schedule 11.09.2016    source источник


Ответы (2)


Вы почти там. Использование vect.fit_transform возвращает разреженное представление матрицы терминов документа. Это документ- матричное представление вашей обучающей выборки. Затем вам нужно будет преобразовать набор для тестирования с помощью той же модели. Подсказка: используйте метод transform на test_list. Вам повезло, потому что sklearn.metrics.pairwise.pairwise_distances(X, Y) принимает разреженные матрицы для X и Y, когда передается metric='euclidean' (то есть метрика, которую вы хотите). Все, что вам нужно сделать, должно быть довольно просто.

person juanpa.arrivillaga    schedule 11.09.2016
comment
Спасибо за подсказку. Думаю, я почти закончил - за исключением того, что pairwise_distances требует тяжелой обработки, и моя система не может с этим справиться. - person boltthrower; 11.09.2016
comment
pairwise_distances (X, Y) выдает ошибку MemoryError. File "/home/bt/amzreview/local/lib/python2.7/site-packages/scipy/sparse/base.py", line 1009, in _process_toarray_args return np.zeros(self.shape, dtype=self.dtype, order=order) - person boltthrower; 12.09.2016

Я думаю, вы могли бы использовать pariwise_distances

Вот пример, который я использую:

tf = TfidfVectorizer(tokenizer=normalize, decode_error = 'ignore',max_features=10000)

tfidf_matrix = tf.fit_transform(aux['enlarged_description'])

#cosine_similarities = linear_kernel(tfidf_matrix, tfidf_matrix)
X = pairwise_distances(tfidf_matrix, metric = metrics,n_jobs = -2 )
person Rafael Valero    schedule 27.07.2018