Использование ScikitLearn TfidfVectorizer в поисковой системе

Я смотрю на создание поисковой системы, где я могу получить предложения (которые представляют документ) из предварительно обработанного файла PDF, используя ключевые слова.

Мне интересно, есть ли встроенная функция в scikit-learn, чтобы показывать данные аналогично пакету вывода слов, то есть все слова были бы в виде столбцов (в пандах), все документы в виде строк и значения tf-idf как значения

Всего 2 ответа


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

Причина в том, что такие матрицы терминов-документов являются разреженными (т.е. большинство их записей на самом деле равны 0), и эта разреженность используется для их эффективного хранения в соответствующих структурах данных. Преобразование их в не разреженные структуры (то есть кадры данных pandas), скорее всего, переполнит память вашей машины; цитирование из соответствующих документов scikit-learn:

Поскольку в большинстве документов обычно используется очень небольшое подмножество слов, используемых в корпусе, результирующая матрица будет иметь множество значений функций, которые являются нулями (как правило, более 99% из них).

Например, коллекция из 10 000 коротких текстовых документов (например, электронных писем) будет использовать словарь размером порядка 100 000 уникальных слов, в то время как каждый документ будет использовать от 100 до 1000 уникальных слов по отдельности.

Чтобы иметь возможность хранить такую ​​матрицу в памяти, а также ускорить алгебраические операции матрица / вектор, реализации обычно используют разреженное представление, такое как реализации, доступные в пакете scipy.sparse .

Тем не менее, вы можете сделать это в образовательных целях; Вот как, адаптируя пример в документации TfidfVectorizer :

from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd

corpus = [
...     'This is the first document.',
...     'This document is the second document.',
...     'And this is the third one.',
...     'Is this the first document?',
... ]

vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)

df = pd.DataFrame.sparse.from_spmatrix(X, columns = vectorizer.get_feature_names())
df
# result:


    and         document    first       is          one         second      the         third       this
0   0.000000    0.469791    0.580286    0.384085    0.000000    0.000000    0.384085    0.000000    0.384085
1   0.000000    0.687624    0.000000    0.281089    0.000000    0.538648    0.281089    0.000000    0.281089
2   0.511849    0.000000    0.000000    0.267104    0.511849    0.000000    0.267104    0.511849    0.267104
3   0.000000    0.469791    0.580286    0.384085    0.000000    0.000000    0.384085    0.000000    0.384085

Вы в scikit изучите TfIdfVectorizer и TfIdfTransformer .

Результат - тот, который вам нужен, со следующим различием между ними:

TfIdfVectorizer принимает необработанные документы на входе.

TfIdfTransformer принимает матрицу с количеством работ для каждого документа во входных данных.


Есть идеи?

10000