Страницы

Поиск по вопросам

четверг, 20 июня 2019 г.

Где я ошибаюсь в алгоритме классификации текстов?

Здравствуйте. У меня такая проблема. В связи скудностью информации по классификации текстовых сообщений на русском языке возникли некоторые вопросы и не до конца понятен четкий алгоритм действий.
Дано - csv файл с запросами (10000), которые надо распределить на категории. Я так понял такой алгоритм:
Берём файл и проводим нормализацию - удаляем стоп-слова и знаки препинания, приводим все слова к единой форме (или правильно сказать в начальную форму, т.е. выполняется стемминг). Потом делим всю выборку на тестовую и обучающую (30 к 70). Получается вручную размечаем корпус по категориям? Или можно использовать TF-IDF для выделения часто встречающихся слов? Переводим слова в векторную форму. Тут тоже вопрос - как лучше? Использовать Bag of Words? Получается для каждого запроса строить отдельно вектор с встречающимся в них словах или делать сразу для всей категории (или возможно для всей выборки)? То есть на выходе мы должны получить несколько векторов или один большой вектор (с часто входящими словами?) для целой категории? Подаем полученный/ые вектор/а на вход какому-нибудь из алгоритмов классификации. Обучаем его. Берем запрос из тестовой выборки, так же приводим его в нормальную форму и подаем на вход алгоритма и смотрим ответ.
Вроде как-то так. И сразу последний вопрос - чтобы по 10 раз не обучать классификатор и не хранить все в памяти можно как-нибудь (например, если мы возьмем нейронную сеть) записывать веса и при загрузке просто распределять уже их и готово или каждый раз придется проходить обучение? Заранее всем спасибо


Ответ

1) Классификация звучит как-то размыто. Какие конкретно классы нужны? Вариантов масса - спам\неспам, извлечение тематики и т.д. Можно даже предоставить пару примеров исходных текстов.
2) Нормализация и стемминг алгоритмы похожие, но все же разные. Нормализация - приведение слова к единственному числу, именительному падежу, инфинитив для глагола, настоящее время и т.д. Стемминг - крайне грубая операция, которая просто отсекает суффиксы и окончания. Зато быстрая. Ну и как правильно было отмечено, перед нормализацией удаляются стоп-слова - предлоги, междометия всякие. Может даже имена собственные - даже на этом шаге есть над чем поразмышлять.
3) Если изначально нет обучающей выборки с размеченными классами, то задача резко усложняется. TF-IDF - всего лишь способ представить слова в виде векторов - он не сможет автоматически извлечь какие-то слова, которые характеризовали бы предложение. У TF-IDF нет такого параметра, как "важность", "вес" слова. (Кстати, выходом частотной модели векторизации будет множество векторов - по одному вектору на каждое уникальное слово). Есть только частота, а я бы поостерегся утверждать, что какое-то одно слово характеризует весь текст или предложение, основываясь только на частоте. Таким образом, если нет обучающей выборки, то это тупик. И нужно смотреть на другие алгоритмы - LDA, LSI - они способны разбить множество входных текстов на категории, на "темы", основываясь на содержании этих текстов. Неизвестен патентный статус. Меня результаты работы этих алгоритмов не впечатлили.
4) Если есть обучающая выборка, то все также не очень просто. Нельзя просто так взять и обучить классификатор на входных данных переменной длины - в разных документах или предложениях разное количество векторов. А все классичиеские классификаторы работают с входным вектором одинаковой длины. Выходов здесь можно придумать также массу - интерполировать недостающие значения, заполнять пустышками, попытаться отсеивать незначащие признаки.
Таким образом, готового алгоритма в виде "скормили" массив документов и все сделалось хорошо не существует. Наиболее близки LDA, LSI. А строить гипотезы можно очень долго, осбенно, если задача толком неясна.
На чем реализовывать? Так как метка языка не была указана осммелюсь посоветовать писать это все на python. Уже написаны прекрасные библиотеки для всего, чего угодно. gensim, NLTK - для работы с текстом; skikit-learn, numpy, scipy, FANN, PyBrain, Theano - для работы с числами; pymorhy2 - для нормализации русского текста, но нормализация проводится без контекста (то есть не получится отличить "сталь" от "стать" в слове "стали").

Комментариев нет:

Отправить комментарий