Использование преобразования Sklearn TfidfVectorizer

Я пытаюсь получить вектор tf-idf для одного документа, используя объект TfidfVectorizer Sklearn. Я создаю словарь на основе некоторых учебных документов и использую fit_transform для обучения TfidfVectorizer. Затем я хочу найти векторы tf-idf для любого заданного тестового документа.

from sklearn.feature_extraction.text import TfidfVectorizer

self.vocabulary = "a list of words I want to look for in the documents".split()
self.vect = TfidfVectorizer(sublinear_tf=True, max_df=0.5, analyzer='word', 
                 stop_words='english')
self.vect.fit_transform(self.vocabulary)

...

doc = "some string I want to get tf-idf vector for"
tfidf = self.vect.transform(doc)

Проблема в том, что это возвращает матрицу с n строками, где n - размер моей строки документа. Я хочу, чтобы он возвращал только один вектор, представляющий tf-idf для всей строки. Как я могу сделать так, чтобы строка отображалась как единый документ, а не каждый символ как документ? Кроме того, я новичок в интеллектуальном анализе текста, поэтому, если я делаю что-то не так концептуально, было бы здорово узнать. Любая помощь приветствуется.


person Sterling    schedule 21.11.2013    source источник


Ответы (1)


Если вы хотите вычислить tf-idf только для заданного словаря, используйте аргумент vocabulary в конструкторе TfidfVectorizer,

vocabulary = "a list of words I want to look for in the documents".split()
vect = TfidfVectorizer(sublinear_tf=True, max_df=0.5, analyzer='word', 
           stop_words='english', vocabulary=vocabulary)

Затем, чтобы соответствовать, т.е. вычислить количество, с заданным corpus, то есть итерацией документов, используйте fit:

vect.fit(corpus)

Метод fit_transform является сокращением для

vect.fit(corpus)
corpus_tf_idf = vect.transform(corpus) 

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

doc_tfidf = vect.transform([doc])
person alko    schedule 21.11.2013
comment
Так в чем разница между fit_transform и transform? Я прочитал документацию, но не совсем понимаю. Мы используем fit_transform для подсчета вхождений каждого термина в список документов? Затем преобразование ... берет эти подсчеты и вычисляет вектор tf-idf для списка документов? - person Sterling; 22.11.2013
comment
@Sterling вы используете fit или fit_transform (см. Обновление) для обучения преобразованию tfidf и transform для применения без обновления счетчиков - person alko; 22.11.2013
comment
когда параметр словаря в TfidfVectorizer является входной переменной и не выводится из корпуса, каков эффект подгонки к корпусу? это необходимо? - person Moniba; 22.08.2019