Recategorizar automaticamente tópicos de um fórum importado detectando palavras-chave nos títulos?

Olá,

Estou importando um fórum antigo e grande sobre monociclismo.

As categorias antigas não eram as melhores, e muitas coisas diferentes estavam misturadas.

Então, estou reorganizando as categorias.

No início, pensei em recategorizar manualmente as últimas centenas de tópicos mais recentes e manter os antigos como estão.
A ideia seria focar no futuro, não no passado. Não importa tanto se os tópicos antigos estão mal categorizados; o mais importante é que eles continuem disponíveis.

Mas estou me perguntando se recategorizar tópicos automaticamente, mirando em palavras-chave, poderia, na verdade, fazer um bom trabalho.

Atualmente, a grande maioria dos nossos tópicos — mais da metade do total! — está em uma única categoria (:scream:).

Poderia mirar nessas palavras-chave nos títulos: “aprender”, “aprendizado”, “treinar”, “treinamento”, “postura”, etc… e colocar todos esses tópicos na categoria #dicas-de-andar.
O mesmo poderia ser feito com “quadro”, “roda”, “pneu”, “sela”, etc… Isso iria para #monocicletas-e-equipamentos.

Vou mirar em palavras delimitadas por espaços e tentar antecipar expressões de várias palavras, evitando um pouco de “falsos positivos”. Exemplo: “wheelwalking” (andar de roda) é uma manobra de monociclista que provavelmente deveria ser encontrada em #dicas-de-andar, então, se eu mirar apenas em “roda” sem pensar muito, haverá falsos positivos que poderiam ter sido facilmente evitados (dito isso, poderia mover tópicos com “roda” de A para B e, em seguida, mover tópicos com “wheelwalking” de B para C…).

Alguém aqui já fez algo assim? Vocês têm sugestões ou ideias para minimizar o risco de “falsos positivos”? Existem coisas óbvias (ou não) que preciso saber antes de fazer isso?

Cerca de 70.000 tópicos precisam ser analisados.

Um conselho: não encare isso como algo que precisa ser feito certo na primeira tentativa.

Sua ideia de buscar palavras-chave é a mesma abordagem inicial que eu tomaria. Não tenha medo de descartar todo o trabalho feito na sua primeira tentativa. Se o resultado não for o que você busca, aproveite o que aprendeu na primeira tentativa e comece tudo de novo do zero.


EDIT

Ao fazer uma busca rápida por algumas ferramentas gratuitas para análise de palavras, encontrei esta página de informações sobre Análise de Texto. Leitura agradável.

Já abordei projetos semelhantes usando aprendizado não supervisionado com o algoritmo K-means. Seria um experimento bem legal, e talvez o algoritmo até encontre uma categorização melhor :wink:

Você pode ler sobre essa abordagem aqui: https://towardsdatascience.com/applying-machine-learning-to-classify-an-unsupervised-text-document-e7bb6265f52

Assim como @EricGT disse: não tenha medo de iterar, mas “próximo o suficiente” já é suficiente. E talvez tenha alguns usuários do TL3 prontos para recategorizar quando necessário.

Isso é interessante!

Provavelmente não terei tempo nem habilidades para tentar essa abordagem (o fórum está fora do ar há mais de um mês, e ainda tenho muito trabalho a fazer!).

Após uma primeira tentativa, escolher palavras-chave manualmente parece ter resultados bastante bons, embora eu ainda não tenha recategorizado e apenas tenha brincado com consultas 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%'

Essa consulta retorna 33.000 tópicos de 52.000 da categoria principal que poderiam ser recategorizados. O número parece realista, mas eu provavelmente ainda preciso adicionar mais palavras-chave.

O método parece confiável o suficiente.

O que você acabou fazendo aqui?

Se os tópicos tiverem palavras-chave únicas o suficiente (assumo que você esteja iterando por todas as respostas dos tópicos e contando as palavras-chave em cada postagem), poderia ser viável categorizar automaticamente um tópico com base na presença de palavras-chave únicas e específicas suficientes nesse tópico.

(Isso é principalmente útil para migrações, embora, já que em um fórum ativo você desejaria que o tópico estivesse na categoria correta desde o início.)

Movi tópicos para outras categorias verificando palavras-chave em seus títulos. Funcionou bem o suficiente para ser melhor do que a bagunça que era antes.

Essa é uma boa observação; a presença consistente de uma palavra específica em muitos títulos de tópicos é uma forte evidência de que uma nova categoria é necessária. :thinking:

Você fez isso por meio de uma consulta? Se sim, qual foi o modelo da consulta? Foram necessárias outras atividades após a execução da consulta para garantir a integridade do banco de dados?

Parece que foi feito em um script de importação, então teria sido modificado para inferir uma categoria do título.

Você está fazendo uma importação? De qual software? Se já existe no Discourse, você poderia fazer isso pelo Rails.

Pelo que me lembro, desde que o ajudei em muitos de seus trabalhos relacionados ao Discourse, lembro-me de ele ter usado um script Rails pós-importação. Ele selecionou os tópicos por palavras-chave em seus títulos, depois usou comandos oficialmente documentados para movê-los, como Administrative Bulk Operations.

Também me lembro que mover tópicos com tags, comandos oficiais e tarefas rake não atualizou completamente algumas tabelas, nem o trabalho relacionado do Sidekiq.
Não sei se ainda é o caso, mas isso pode ser algo a se prestar atenção em Bulk tagged topics, then moved topics into another category, but the category tag selector doesn't show tags - #3 by Canapin.

Espero que ajude!