Найти тему

Создание простого классификатора сайтов на базе Gensim LSI.

Для отбора сайтов малого бизнеса потребовался классификатор сайтов. Было необходимо создать функцию, которая принимала на вход ссылку и классифицировала сайт по 70 категориям, для сайтов не подходящих не под одну из категорий необходимо было присваивать категорию другое.

Базой для обучения нейросети в данном проекте был список с ссылками на сайты разбитый по категориям.

Задача классификации разбивалась на 3 этапа: 1. Парсинг сайта. 2. Выделение и предобработка текста. 3. Предсказание категории по полученному тексту.

Проект реализовывался на python. Для парсинга была использована библиотека requests. Практика показала, что при запросе на загрузку сайта зи ColabNotebooks получается очень мало отказов, по причине что запрос изет от робота, т.к. сайты распознавали запрос с серверов Google и отвечали роботу. При парсинге с компьютера, отказов было существенно больше. Поэтому парсинг сайтов для обучения был произведен с ColabNotebook.

Т.к. классифицировать необходимо было только русскоязычные сайты выделение и предобработка текста сильно упрощалась. В полученном html коде достаточно было выкинуть все, что не относится к русским буквам, оставались только русские слова.

Далее по тексту, выделенному с первой страницы сайта нужно было предсказать категорию. Определения категории по текстовому контенту, проще всего делать по ключевым словам и терминам, поэтом первый вариант, который приходит в голову randomforst, бустинг, либо нейросетевой классификатор, поверх bag of words (BOW) либо поверх TfIdf. Предсказывать класс сайта на основе частотности слов, должно быть проще всего. И теоритически TfIdf должен показать лучший результат, чем BOW, т.к. TfIdf хранит относительную частотность слов, а BOW просто наличие или отсутствие слова на первой странице сайта.

Практически примерно так и получилось. При использовании TfIdf точность классификации была приблизительно на 0.5% выше. Randomforst, и нейросетевой классификатор, собранный из обычных линейных слоев показали близкие результаты. Но при дальнейшей настройке нейросетевого классификатора путем увеличения l2 регуляризации в слоях, вплоть до 0.1, точность нейросетевого классификатора превысила на 1-2% точность randomforst. Для дальнейших экспериментов был оставлен только нейросетевой классификатор из-за возможности более гибкой настройки.

На 13 категориях точность классификации получалась в районе 94-96%, этого было недостаточно, т.к. планировалось увеличить количество категорий и каждый % был существенен. Поэтому были опробованы другие возможные методики.

Анализ последовательности слов с помощью токенизации, эмбединга и LSTM либо 1D сверток, показал плохой результат, точность 60%

Попытка перевода всего текста с сайта в вектор с помощью пред обученного русскоязычного трансформера BERT от LABSE, и тренировка классификатора поверх векторов показала точность 78-80%. BERT очень хорошо извлекал смысл фраз и метрика sklearn.metrics.pairwise.cosine_distances показывала адекватные результаты для похожих фраз. Если кому-то нужен смысл фразы рекомендую BERT от LABSE, его просто установить и использовать.

Далее были опробованы модели LDA, LSI, doc2vec из библиотеки gensim. В случае doc2vec получали вектор. В случае LDA, LSI получали набор тем, и степень принадлежности сайта к разным темам. Лучше всего показала себя тренировка классификатора поверх набора тем, полученного из LSI модели. Точность на 13 категориях поднялась до 98%. Наилучшее количество тем для LSI модели опытным путем было определено как 5*количество категорий сайтов.

Эксперименты пока незакончены, но на данный момент нейросетевой классификатор поверх LSI модели это лучший рабочий вариант.

Ссылка на github с примером парсинга и использования LSI модели и классификатора : https://github.com/A1171/Suite_Classifier/tree/main

Пример на gthub написан для 8 категорий.