Использование ScikitLearn TfidfVectorizer в поисковой системе - PullRequest
0 голосов
/ 23 марта 2020

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

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

Ответы [ 2 ]

1 голос
/ 23 марта 2020

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

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

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

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

Чтобы иметь возможность хранить такую ​​матрицу в памяти, а также ускорить алгебраические операции c матрица / вектор операций, реализации обычно используют разреженное представление. такие как реализации, доступные в пакете 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
0 голосов
/ 23 марта 2020

Вы учитесь в scikit * TfIdfVectorizer принимает необработанные документы на входе.

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

...