Автоматически пере categorизировать темы из импортированного форума, ориентируясь на ключевые слова в заголовках?

Привет,

Я импортирую старый и большой форум о езде на моноколесе.

Старые категории были не очень удачными, и множество разных тем были смешаны вместе.

Поэтому я занимаюсь реорганизацией категорий.

Сначала я думал вручную перекатегоризировать последние несколько сотен тем, а старые оставить как есть.
Идея в том, чтобы ориентироваться на будущее, а не на прошлое. Не так важно, если старые темы плохо категоризированы, главное, что они всё ещё доступны.

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

В настоящее время подавляющее большинство наших тем — более половины от общего числа! — находится в одной категории (:scream:).

Я мог бы искать в заголовках такие ключевые слова, как «learn» (учиться), «learning» (обучение), «train» (тренироваться), «training» (тренировка), «posture» (поза) и т. д. и помещать все эти темы в категорию #riding-advice.

То же самое можно сделать с «frame» (рама), «wheel» (колесо), «tire» (шина), «saddle» (седло) и т. д. — это попадёт в категорию #unicycles-and-equipments.

Я буду искать слова, отделённые пробелами, и постараюсь учесть многословные выражения, чтобы немного снизить количество «ложных срабатываний». Например: «wheelwalking» — это трюк на моноколесе, который, вероятно, должен находиться в категории #riding-advice. Поэтому, если я буду искать только «wheel» без должной осторожности, возникнут ложные срабатывания, которых можно было бы легко избежать (хотя, в принципе, я мог бы сначала переместить темы со словом «wheel» из категории А в категорию Б, а затем переместить темы со словом «wheelwalking» из категории Б в категорию В…).

Кто-нибудь из вас уже делал что-то подобное? Есть ли у вас предложения или идеи, как минимизировать риск «ложных срабатываний»? Есть ли очевидные (или неочевидные) вещи, которые мне нужно знать перед тем, как приступать к этому?

Придётся просмотреть около 70 000 тем.

Один совет: не воспринимайте это как задачу, которую нужно выполнить идеально с первого раза.

Ваш подход к поиску ключевых слов совпадает с тем, который я бы использовал в первую очередь. Не бойтесь выбросить всю работу, проделанную при первой попытке. Если результат не соответствует вашим ожиданиям, возьмите то, что вы узнали из первой попытки, и начните заново с нуля.


РЕДАКТИРОВАНИЕ

При быстром поиске бесплатных инструментов для анализа слов я наткнулся на эту информационную страницу о текстовом анализе. Приятное чтение.

Раньше я подходил к подобным задачам, используя методы обучения без учителя с кластеризацией K-means. Это был бы довольно интересный эксперимент, и, возможно, алгоритм даже предложит более удачную категоризацию :wink:

О таком подходе можно прочитать здесь: https://towardsdatascience.com/applying-machine-learning-to-classify-an-unsupervised-text-document-e7bb6265f52

Как и @EricGT сказал: не бойтесь итераций, но «достаточно близко» — это уже хорошо. И, возможно, стоит иметь под рукой нескольких пользователей уровня TL3 для повторной категоризации при необходимости.

Это интересно!

У меня, вероятно, не будет ни времени, ни навыков, чтобы попробовать этот подход (форум уже более месяца не работает, а у меня ещё много дел!).

После первой попытки ручное выбор ключевых слов даёт довольно хорошие результаты, хотя я ещё не перекатегоризировал данные, а просто поэкспериментировал с SQL-запросами.

select title from topics
where category_id = 10
and lower(title) not like '%saddle%'
and lower(title) not like '%crank%'
and lower(title) not like '%pedal%'
and lower(title) not like '%rim%'
and lower(title) not like '%carbon%'
and lower(title) not like '%spoke%'
and lower(title) not like '%wheel%'
and lower(title) not like '%frame%'
and lower(title) not like '%hub%'
and lower(title) not like '%tubeless%'
and lower(title) not like '%disk%'
and lower(title) not like '%hydraulic%'
and lower(title) not like '%duro%'
and lower(title) not like '%dominator%'
and lower(title) not like '%torker%'
and lower(title) not like '%nimbus%'
and lower(title) not like '%bearing%'
and lower(title) not like '%pad%'
and lower(title) not like '%repair%'
and lower(title) not like '%handlebar%'
and lower(title) not like '%kh%'
and lower(title) not like '%kris holm%'
and lower(title) not like '%coker%'
and lower(title) not like '%tube%'
and lower(title) not like '%build%'
and lower(title) not like '%29er%'
and lower(title) not like '%36er%'

and lower(title) not like '%backwards%'
and lower(title) not like '%riding%'
and lower(title) not like '%foot%'
and lower(title) not like '%train%'
and lower(title) not like '%training%'
and lower(title) not like '%learn%'
and lower(title) not like '%learning%'
and lower(title) not like '%dismount%'
and lower(title) not like '%habit%'
and lower(title) not like '%idle%'
and lower(title) not like '%idling%'
and lower(title) not like '%freemount%'
and lower(title) not like '%free mount%'
and lower(title) not like '%free mounting%'

Этот запрос возвращает 33 000 тем из 52 000 из основной категории, которые можно перекатегоризировать. Число кажется реалистичным, но, вероятно, мне всё ещё нужно добавить больше ключевых слов.

Метод кажется достаточно надёжным.

Что в итоге вы здесь сделали?

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

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

Я переместил темы в другие категории, проверяя ключевые слова в их заголовках. Это сработало достаточно хорошо, чтобы стать лучше, чем был беспорядок до этого.

Это верное замечание: если какое-то конкретное слово регулярно встречается во многих заголовках тем, это веское основание для создания новой категории. :thinking:

Вы сделали это через запрос? Если да, какой был шаблон запроса? Требовалась ли какая-либо другая активность после выполнения запроса для обеспечения целостности базы данных?

Похоже, это было сделано в скрипте импорта, поэтому он, вероятно, был изменён для определения категории на основе заголовка.

Вы выполняете импорт? Из какой программы? Если запись уже существует в Discourse, это можно сделать через Rails.

Насколько я помню, поскольку я помогал ему во многих его задачах, связанных с Discourse, он использовал скрипт на Rails после импорта. Он выбирал темы по ключевым словам в их заголовках, а затем использовал официально задокументированные команды для их перемещения, например, Administrative Bulk Operations.

Также я помню, что при перемещении тем с тегами, используя официальные команды и rake-задачи, некоторые таблицы обновлялись не полностью, и это же касалось связанного периодического задания Sidekiq.
Не знаю, актуально ли это до сих пор, но стоит обратить на это внимание по ссылке: Bulk tagged topics, then moved topics into another category, but the category tag selector doesn't show tags - #3 by Canapin.

Надеюсь, это поможет!