Как добавить функции, отличные от BOW, в модели классификации scikit-learn - PullRequest
2 голосов
/ 22 мая 2019

Я пытаюсь построить модель классификации текста. Моя цель состоит в том, чтобы классифицировать каждый абзац в 10000 документах на наличие в нем информации о «Трудовой забастовке» или нет.

Сначала я выполнил основные этапы предварительной обработки и преобразовал абзацы в матрицу терминологического документа (CountVectorizer). Затем введите эту матрицу в такие модели, как логистическая регрессия и SVM, предоставляемые Scikit-Learn.

Тем не менее, я обнаружил, что информация по теме документов, предоставленная предварительно обученной моделью LDA, будет полезна для классификации текста на уровне абзацев.

Поэтому я хочу также предоставить информацию по темам вместе с информацией о BOW для каждого текста.

После ответа на подобный вопрос, я думаю, что просто добавление номера темы в последнем столбце матрицы терминов-документов.

Например, пусть 'text_train' будет моим учебным корпусом (скажем, 40000 абзацев), а 'topic' будет списком номеров тем, присвоенных каждому абзацу моделью LDA.

vectorizer = CountVectorizer(ngram_range=(1,3))
X = vectorizer.fit_transform(text_train)  
X.toarray() #shape (40000, 643898)
topic = coo_matrix([topic]).T #shape (40000, 1)
hstack([X.toarray(), topic]).toarray() #shape (40000, 643899)

Возвращает желаемую матрицу, последний столбец которой содержит информацию по темам.

Однако, поскольку номера тем не имеют кардинального (или порядкового) порядка, как у элементов матрицы терминов-документов, я обеспокоен тем, что некоторая линейная модель машинного обучения может не подходить для этой работы.

Это правда? Тогда есть ли другие решения, которые я могу принять?

1 Ответ

2 голосов
/ 22 мая 2019

Да, вы правы;Столбец Topic не является кардинальной / порядковой особенностью.

Вы можете использовать oneHotEncoding () функции topic и затем добавить ее с выводом countVectorizer.

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

...