【发布时间】:2017-06-23 10:27:05
【问题描述】:
我正在处理大约 10 万篇研究论文的语料库。我正在考虑三个领域:
- 纯文本
- 标题
- 摘要
我使用 TfIdfVectorizer 来获取纯文本字段的 TfIdf 表示,并将由此产生的词汇反馈到标题和摘要的矢量化器中,以确保所有三种表示都在同一个词汇上工作。我的想法是,由于明文字段比其他两个字段大得多,它的词汇很可能会涵盖其他字段中的所有单词。但如果不是这样,TfIdfVectorizer 将如何处理新词/标记?
这是我的代码示例:
vectorizer = TfidfVectorizer(min_df=2)
plaintexts_tfidf = vectorizer.fit_transform(plaintexts)
vocab = vectorizer.vocabulary_
# later in an another script after loading the vocab from disk
vectorizer = TfidfVectorizer(min_df=2, vocabulary=vocab)
titles_tfidf = vectorizer.fit_transform(titles)
这个词汇有大约 90 万个单词。
在矢量化期间我没有遇到任何问题,但后来当我想使用 sklearn.metrics.pairwise.cosine_similarity 比较矢量化标题之间的相似度时,我遇到了这个错误:
>> titles_sim = cosine_similarity(titles_tfidf)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-237-5aa86fe892da> in <module>()
----> 1 titles_sim = cosine_similarity(titles)
/usr/local/lib/python3.5/dist-packages/sklearn/metrics/pairwise.py in cosine_similarity(X, Y, dense_output)
916 Y_normalized = normalize(Y, copy=True)
917
--> 918 K = safe_sparse_dot(X_normalized, Y_normalized.T, dense_output=dense_output)
919
920 return K
/usr/local/lib/python3.5/dist-packages/sklearn/utils/extmath.py in safe_sparse_dot(a, b, dense_output)
184 ret = a * b
185 if dense_output and hasattr(ret, "toarray"):
--> 186 ret = ret.toarray()
187 return ret
188 else:
/usr/local/lib/python3.5/dist-packages/scipy/sparse/compressed.py in toarray(self, order, out)
918 def toarray(self, order=None, out=None):
919 """See the docstring for `spmatrix.toarray`."""
--> 920 return self.tocoo(copy=False).toarray(order=order, out=out)
921
922 ##############################################################
/usr/local/lib/python3.5/dist-packages/scipy/sparse/coo.py in toarray(self, order, out)
256 M,N = self.shape
257 coo_todense(M, N, self.nnz, self.row, self.col, self.data,
--> 258 B.ravel('A'), fortran)
259 return B
260
ValueError: could not convert integer scalar
我不确定这是否相关,但我真的看不出这里出了什么问题。也因为我在计算明文向量的相似度时没有遇到错误。
我错过了什么吗?有没有更好的方法来使用 Vectorizer?
编辑:
稀疏的 csr_matrices 的形状是相等的。
>> titles_tfidf.shape
(96582, 852885)
>> plaintexts_tfidf.shape
(96582, 852885)
【问题讨论】:
-
这也是我的第一个想法,但是稀疏 csr_matrices 的尺寸是相等的:plaintexts_tfidf.shape (96582, 852885)titles_tfidf (96582, 852885)
标签: python scikit-learn tf-idf cosine-similarity