Использовать sklearn TfidfVectorizer с уже токенизированными входами?

У меня есть список токенизированных предложений, и я хотел бы разместить его в векторизаторе tfidf. Я пробовал следующее:

tokenized_list_of_sentences = [['this', 'is', 'one'], ['this', 'is', 'another']]

def identity_tokenizer(text):
  return text

tfidf = TfidfVectorizer(tokenizer=identity_tokenizer, stop_words='english')    
tfidf.fit_transform(tokenized_list_of_sentences)

какие ошибки как

AttributeError: 'list' object has no attribute 'lower'

Есть ли способ сделать это? У меня миллиард предложений, и я не хочу снова их токенизировать. Они токенизируются перед другим этапом перед этим.


person greenberet123    schedule 07.02.2018    source источник
comment
Чтобы иметь возможность помочь, добавьте полное сообщение об ошибке и добавьте минимальный код, необходимый для воспроизведения ошибки.   -  person Mohamed Ali JAMAOUI    schedule 07.02.2018


Ответы (3)


Попробуйте инициализировать объект TfidfVectorizer с параметром lowercase=False (при условии, что это действительно нужно, поскольку на предыдущих этапах вы указали свои токены в нижнем регистре).

tokenized_list_of_sentences = [['this', 'is', 'one', 'basketball'], ['this', 'is', 'a', 'football']]

def identity_tokenizer(text):
    return text

tfidf = TfidfVectorizer(tokenizer=identity_tokenizer, stop_words='english', lowercase=False)    
tfidf.fit_transform(tokenized_list_of_sentences)

Обратите внимание, что я изменил предложения, поскольку они, по-видимому, содержали только стоп-слова, что вызвало еще одну ошибку из-за пустого словаря.

person pmlk    schedule 05.06.2018
comment
Есть идеи, как сохранить и загрузить объект TfidfVectorizer? Если я использую внешнюю функцию, такую ​​как в этом примере? Я получаю ошибки при загрузке. - person Lior Magen; 27.01.2020

Попробуйте preprocessor вместо tokenizer.

    return lambda x: strip_accents(x.lower())
AttributeError: 'list' object has no attribute 'lower'

Если x в приведенном выше сообщении об ошибке является списком, то выполнение x.lower() для списка вызовет ошибку.

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

tokenized_sentences = [['this', 'is', 'one', 'cat', 'or', 'dog'],
                       ['this', 'is', 'another', 'dog']]

tfidf = TfidfVectorizer(preprocessor=' '.join, stop_words='english')
tfidf.fit_transform(tokenized_sentences)

Возврат:

<2x2 sparse matrix of type '<class 'numpy.float64'>'
    with 3 stored elements in Compressed Sparse Row format>

Функции:

>>> tfidf.get_feature_names()
['cat', 'dog']

ОБНОВЛЕНИЕ: может быть, использовать lambdas на токенизаторе и препроцессоре?

tokenized_sentences = [['this', 'is', 'one', 'cat', 'or', 'dog'],
                       ['this', 'is', 'another', 'dog']]

tfidf = TfidfVectorizer(tokenizer=lambda x: x,
                        preprocessor=lambda x: x, stop_words='english')
tfidf.fit_transform(tokenized_sentences)

<2x2 sparse matrix of type '<class 'numpy.float64'>'
    with 3 stored elements in Compressed Sparse Row format>
>>> tfidf.get_feature_names()
['cat', 'dog']
person Jarad    schedule 07.02.2018
comment
Это повторно токенизирует ввод, к которому присоединился препроцессор. Я не хочу снова тратить ресурсы на ретокенизацию. - person greenberet123; 08.02.2018