Использование TFI / DF и CountVectorizer в конвейере / gridSearch - PullRequest
1 голос
/ 13 октября 2019

Я пытаюсь использовать TFI / DF и CountVectorizer в одном конвейере. я сделал следующее:

pipe = Pipeline([
    ('tfic', TfidfVectorizer()),
    ('cvec',  CountVectorizer()),
    ('lr' ,LogisticRegression())
])

и параметры:

pipe_parms = {
    'cvec__max_features' : [100,500],
    'cvec__ngram_range' : [(1,1),(1,2)],
    'cvec__stop_words' : [ 'english', None]
}

gridSearch:

gs = GridSearchCV(pipe, param_grid= pipe_parms, cv=3)

Я получил ошибку

ниже не найдено.

Использование countVectorizer или TfidfVectorizer работает, но не то и другое.

Я читал другие вопросы по stackoverflow, и они указали, что вместо этого следует использовать TfidfTransformer(), если яхочу, чтобы оба работали, используя один конвейер. При этом я получаю сообщение об ошибке «не удалось преобразовать строку в число с плавающей точкой»

Есть ли способ использовать два векторизатора в одном конвейере? или какие другие методы вы предлагаете.

Спасибо

Редактировать: Я нашел решение объединить 2 параллельных преобразователя (в данном случае векторизаторы count и Tfidf) с помощью FeatureUnion. Я написал короткую запись в блоге об этом здесь: https://link.medium.com/OPzIU0T3N0

1 Ответ

0 голосов
/ 14 октября 2019

Надеюсь, мое объяснение прояснит вам, что здесь происходит.

Сначала вы попытались применить TfidfVectorizer преобразование. Это изменит коллекцию текстов в TfidfVector, который состоит из чисел. Скажем, у вас есть этот список текстов

texts = [
    'I am a bird',
    'a crow is a bird',
    'bird fly high in the sky',
    'bird bird bird',
    'black bird in the dead of night',
    'crow is black bird'
]

работает

TfidfVectorizer().fit_transform(texts).todense()

приведет к

matrix([[0.91399636, 0.40572238, 0.        , 0.        , 0.        ,
         0.        , 0.        , 0.        , 0.        , 0.        ,
         0.        , 0.        , 0.        ],
        [0.        , 0.35748457, 0.        , 0.66038049, 0.        ,
         0.        , 0.        , 0.        , 0.66038049, 0.        ,
         0.        , 0.        , 0.        ],
...])

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

CountVectorizer().fit_transform(
    TfidfVectorizer().fit_transform(texts).todense()
)

в соответствии с документацией scikit-learn CountVectorizer принимает последовательность строк или байтов вместо числа.

Есть ли способ использовать два векторизатора в одном конвейере? или какие другие методы вы предлагаете?

Я предлагаю вам использовать один из CountVectorizer или TfidfVectorizer, не используйте оба в 1 конвейере. С точки зрения непрофессионала, CountVectorizer будет выводить частоту каждого слова в наборе строк, которые вы передали, в то время как TfidfVectorizer также будет выводить нормализованную частоту каждого слова. При этом оба метода служат одной и той же цели: преобразование набора текстов в числа с использованием частоты. Таким образом, вам следует использовать только один из них.

будет рад добавить мой ответ, если вы уточните подробнее, почему вы хотите использовать оба векторизатора в одном конвейере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...