Есть ли способ добавить столбец «чувства» после применения CountVectorizer или TfIdfTransformer к кадру данных? - PullRequest
0 голосов
/ 01 апреля 2020

Я работаю с отзывами в магазине приложений, чтобы классифицировать их как класс "0" или класс "1" на основе текста в обзоре и настроения, которое несет обзор.

На моих этапах классификации я применяю следующие методы к моему фрейму данных:

def get_sentiment(s):
    vs = analyzer.polarity_scores(s)
    if vs['compound'] >= 0.5:
        return 1
    elif vs['compound'] <= -0.5:
        return -1
    else:
        return 0 
df['sentiment'] = df['review'].apply(get_sentiment)

Для простоты данные уже помечены как класс '0' или '1 ', но я тренирую модель для классификации новых экземпляров, которые еще не были маркированы. Короче говоря, данные, с которыми я работаю, уже помечены. Они находятся в столбце classification.

Затем в моем методе разделения теста поезда сделайте следующее:

msg_train, msg_test, label_train, label_test = train_test_split(df.drop('classification', axis=1), df['classification'], test_size=0.3, random_state=42)

Таким образом, в кадре данных для параметра X есть review и sentiment, а для параметра y - только classification, на котором я тренирую свою модель.

Поскольку нормализация повторяется, для простоты я запускаю конвейер следующим образом:

pipeline1 = Pipeline([
    ('bow', CountVectorizer(analyzer=clean_review)),
    ('tfidf', TfidfTransformer()),
    ('classifier', MultinomialNB())
])

Где функция clean_review выглядит следующим образом:

def clean_review(sentence):
    no_punc = [c for c in sentence if c not in string.punctuation]
    no_punc = ''.join(no_punc)
    no_stopwords = [w.lower() for w in no_punc.split() if w not in stopwords_set]    
    stemmed_words = [ps.stem(w) for w in no_stopwords]
    return stemmed_words

Где stopwords_set - это набор стоп-слов engli sh из библиотеки nltk, а ps из модуля PortStemmer в библиотеке nltk (для определения слова).

Я получаю следующую ошибку: ValueError: Found input variables with inconsistent numbers of samples: [2, 505]

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

Может ли кто-нибудь еще помочь мне понять, что может означать эта ошибка?

Моя конечная цель - создать информационный фрейм, к которому применены CountVectorizer и TfIdfTransformer, но при этом сохранить столбец для настроения каждого обзора.

Затем я хотел бы иметь возможность обучить классификатор MultinomialNB на этом кадре данных и применить эту модель к другим задачам.

1 Ответ

0 голосов
/ 01 апреля 2020

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

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

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