가져온 포럼의 주제를 제목 키워드를 기준으로 자동으로 다시 분류할 수 있나요?

안녕하세요,

유니사이클링에 관한 오래되고 방대한 포럼을 가져오고 있습니다.

기존 카테고리는 최상이 아니었고, 다양한 내용들이 뒤섞여 있었습니다.

그래서 카테고리를 재구성하고 있습니다.

처음에는 최근 몇백 개의 주제에 대해서는 수동으로 카테고리를 다시 지정하고, 오래된 주제들은 그대로 두는 것을 고려했습니다.

미래를 지향하되 과거에는 집착하지 않겠다는 것이었습니다. 오래된 주제가 잘못 분류되어 있더라도 크게 문제가 되지 않으며, 가장 중요한 것은 여전히 접근 가능하다는 점입니다.

하지만 키워드를 대상으로 주제를 자동으로 재분류하는 것이 실제로 좋은 결과를 낼 수 있을지 궁금합니다.

현재 우리 포럼 주제의 압도적 다수(전체의 절반 이상!)가 단일 카테고리에 속해 있습니다. (:scream:)

제목에 포함된 “learn”, “learning”, “train”, “training”, “posture” 등의 키워드를 대상으로 할 수 있습니다. 그리고 이 모든 주제를 #riding-advice 카테고리에 넣을 수 있습니다.

“frame”, “wheel”, “tire”, “saddle” 등도 마찬가지입니다. 이 경우 #unicycles-and-equipments 카테고리에 들어가게 됩니다.

공백으로 감싸진 단어들을 대상으로 하고, 여러 단어로 이루어진 표현을 미리 파악하여 "잘못된 매칭(false positive)"을 조금이라도 방지하려 합니다. 예: "wheelwalking"은 유니사이클 트릭의 일종으로, 아마 #riding-advice에서 찾아야 할 것입니다. 따라서 "wheel"만 무심코 대상으로 삼으면 쉽게 피할 수 있었던 잘못된 매칭이 발생할 수 있습니다(물론, "wheel"이 포함된 주제를 A에서 B로 옮긴 다음, "wheelwalking"이 포함된 주제를 B에서 C로 옮기는 방식도 가능합니다).

여기서 이런 작업을 해본 분이 계신가요? "잘못된 매칭"의 위험을 최소화할 수 있는 제안이나 아이디어가 있을까요? 이 작업을 하기 전에 알아야 할 명백하거나(혹은 그렇지 않은) 사항들이 있을까요?

약 70,000개의 주제를 살펴봐야 합니다.

하나의 조언을 드리자면, 처음부터 완벽하게 해야 한다는 부담을 느끼지 마세요.

키워드를 찾는다는 아이디어는 제가 취할 첫 번째 접근 방식과 동일합니다. 첫 번째 시도에서 한 모든 작업을 버리지 마세요. 결과가 원하는 바와 다르면, 첫 번째 시도에서 배운 점을 바탕으로 처음부터 다시 시작하면 됩니다.


수정

단어 분석을 위한 무료 도구를 빠르게 검색하던 중 텍스트 분석에 대한 이 정보 페이지를 발견했습니다. 좋은 읽을거리입니다.

이전에는 K-평균 군집화를 활용한 비지도 학습으로 유사한 프로젝트를 진행해 본 적이 있습니다. 꽤 흥미로운 실험이 될 것 같고, 알고리즘이 더 나은 분류 체계를 만들어낼 수도 있겠네요 :slight_smile:

이러한 접근 방식에 대해서는 여기서 읽을 수 있습니다: 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%'

이 쿼리는 메인 카테고리에서 재분류가 가능한 52,000개 주제 중 33,000개를 반환합니다. 숫자는 현실적으로 보이지만, 여전히 더 많은 키워드를 추가해야 할 것 같습니다.

이 방법은 충분히 신뢰할 수 있는 것 같습니다.

결국 여기서는 어떤 작업을 하셨나요?

토픽에 충분히 고유한 키워드가 있다면 (모든 토픽의 답변을 순회하면서 각 게시물에 포함된 키워드를 카운트하는 것으로 가정합니다), 해당 토픽에 충분히 고유하고 구체적인 키워드가 존재하는지 여부 기반으로 토픽을 자동으로 분류하는 것이 _가능_할 수 있습니다.

(다만, 이는 주로 마이그레이션 시에 유용합니다. 라이브 포럼에서는 처음부터 토픽이 올바른 카테고리에 있어야 하므로.)

제목의 키워드를 확인하여 주제들을 다른 카테고리로 이동시켰습니다. 이전의 엉망진창 상태보다는 훨씬 낫게 작동했습니다.

좋은 지적이에요. 특정 단어가 주제 제목에 반복적으로 등장한다는 것은 새로운 카테고리가 필요하다는 강력한 근거가 되죠. :thinking:

쿼리를 사용하여 이 작업을 수행하셨나요? 그렇다면 쿼리 템플릿은 무엇이었나요? 쿼리를 실행한 후 데이터베이스 무결성을 보장하기 위해 추가로 수행해야 하는 작업이 있었나요?

가져오기(import) 스크립트로 처리된 것 같습니다. 그러면 제목에서 카테고리를 추론하도록 수정되었을 것입니다.

가져오기를 하고 계신가요? 어떤 소프트웨어에서 가져오시는 건가요? 이미 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 에 언급된 사항에 주의할 필요가 있을 수 있습니다.

도움이 되셨으면 좋겠습니다!