Я работаю над корпусом ~ 100 тыс. Исследовательских работ. Я рассматриваю три поля:TfIdfVectorizer: Как векторный инструмент с фиксированным вокалом обрабатывает новые слова?
- открытого текста
- название
- аннотация
Я использовал TfIdfVectorizer, чтобы получить представление TfIdf в незашифрованном поле и кормить таким образом, возникла Vocab обратно в Векторизаторы названия и абстрактные, чтобы гарантировать, что все три представления работают над одним и тем же vocab. Моя идея заключалась в том, что, поскольку поле открытого текста намного больше, чем два других, это, скорее всего, словар будет охватывать все слова в других полях. Но как бы 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)
Vocab имеет ~ 900K слов.
Во время векторизации я не столкнулся каких-либо проблем, но позже, когда я хотел, чтобы сравнить сходство векторизованных названий с использованием 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?
Edit:
Формы разреженных csr_matrices равны.
>> titles_tfidf.shape
(96582, 852885)
>> plaintexts_tfidf.shape
(96582, 852885)
Это была моя первая мысль, как хорошо, но размеры разреженных csr_matrices равны: plaintexts_tfidf.shape (96582, 852885) titles_tfidf (96582, 852885) – nadre