Я пытаюсь установить набор данных, в котором есть столбцы event_type и notes (свободный текст). перед вызовом модели MultinomialNB я обработал текст и преобразовал его в массив, чтобы векторизовать его и вычислить tfidf здесь ниже предоставленного кода:
Преобразование типов событий из строки в целое число для удобства обработки
ACLED['category_id'] = ACLED['event_type'].factorize()[0]
category_id_ACLED = ACLED[['event_type', 'category_id']].drop_d
uplicates().sort_values('category_id')
category_to_id = dict(category_id_ACLED.values)
id_to_category = dict(category_id_ACLED[['category_id', 'event_type']].values)
Текстовое представление
Я также преобразовал заметки и category_id в функции и метки следующим образом:
tfidf = TfidfVectorizer(sublinear_tf=True, min_df=5, norm='l2', encoding='latin-1', ngram_range=(1, 2), stop_words='english')
features = tfidf.fit_transform(ACLED.notes).toarray()
labels = ACLED.category_id
print(features.shape)
Затем я разделил набор данных на обучающие и тестовые наборы, используя функции и метки:
X_train, X_test, y_train, y_test = train_test_split(features ,labels, random_state=0)
print('Original dataset shape {}'.format(Counter(y_train)))
выход
Original dataset shape Counter({1: 1280, 2: 819, 0: 676, 3: 593, 4: 138, 5: 53, 7: 50, 6: 21, 8: 10})
Поскольку классы не сбалансированы, я использовал SMOTE для решения проблемы меньшинства и создания синтетических копий
Применение случайной избыточной выборки для преодоления несбалансированных классов
sm = SMOTE(random_state=42)
X_resampled, y_resampled = sm.fit_sample(X_train, y_train)
print('Resampled dataset shape {}'.format(Counter(y_resampled)))
вывод после передискретизации
Resampled dataset shape Counter({3: 1280, 1: 1280, 2: 1280, 0: 1280, 7: 1280, 6: 1280, 4: 1280, 5: 1280, 8: 1280})
Все до сих пор работало нормально, пока я не попытался вычислить частоту членов с помощью CountVectorizer () следующим образом:
count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(X_resampled)
tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)
Ошибка вывода:
'numpy.ndarray' object has no attribute 'lower'
Я пытался использовать функцию ravel () для выравнивания массива, но ошибка сохраняется, любые идеи, заранее спасибо