Во время работы над проектом, который связан с проблемой классификации текста по нескольким классам. Идея заключалась в том, чтобы научить модель прогнозировать категорию (из 16 возможных категорий) отчета на основе произвольного текста.
Для подготовки данных я использовал CountVectorizer и TfIdfVectorizer из scikit-learn.
CountVectorizer преобразует корпус в токены (отдельные слова) и предоставляет словарь корпуса, который присваивает каждому токену уникальный целочисленный идентификатор. Поскольку большинство алгоритмов машинного обучения, как правило, работают с числами, а не со словами, это формулирует корпус таким образом, чтобы его можно было использовать в этих моделях машинного обучения.
3378 {'main': 1914, 'breaker': 718, 'put': 2351, 'position': 2275, 'loco': 1866, 'ableunable': 392, ... }
«3378» — это общая длина словарного запаса корпуса. Это означает, что в корпусе присутствует 3378 уникальных слов/строк.
В приведенном выше примере; «main» соответствует идентификатору «1914» в словаре, «break» соответствует идентификатору «718» и так далее.
Далее, чтобы понять, какие токены имеют более высокий балл на основе частоты терминов — оценка обратной частоты документов (TfIdf) каждого класса. Мы можем преобразовать данные в разреженный набор данных/матрицу, выполнив следующие действия:
Вышеприведенный вывод показывает оценку 3378 токенов (столбцов) для каждого документа (строки) в корпусе, а также связанный с ним класс.
После этого мы можем суммировать баллы для каждого из 3378 токенов по 16 классам в нашем наборе данных.
Вооружившись этой информацией, мы теперь можем начать понимать важность каждого токена в идентификации определенного класса. Более высокий балл TfIdf может означать 1 из 2 вещей.
- Токен имеет высокую частоту появления в документе
- Токен редко встречается в корпусе
В приведенном выше примере выделенное значение 2,155245 для идентификатора токена «3376» может означать, что присутствие этого токена в конкретном документе будет означать более высокую вероятность того, что документ относится к классу «COMS».
Но что это за слово с идентификатором токена «3376»?
С помощью этой функции ниже мы можем получить первые n слов каждого класса и отобразить их.
Обертывание этой функции в цикле позволит нам исследовать первые n слов каждого класса в нашем наборе данных.
Я использовал эту информацию для дальнейшей очистки свободного текста. Если бы были какие-либо общие слова/токены, которые находились в первых 10 местах любого класса, я бы вернулся и удалил их из исходного набора данных, прежде чем снова обучать модель.
Общие слова, такие как «неисправный», «тестирование», которые я знал интуитивно, не указывали на какой-либо конкретный класс. Выполнение этого дополнительного шага по «разработке функций» помогло повысить точность прогнозирования некоторых неэффективных классов.
Надеюсь, это было полезно для некоторых из вас.
Спасибо за прочтение и поделитесь со мной своими мыслями!