본문 바로가기
블로그

[블로그] 생성형 AI를 활용한 카테고리 정리 후기

by 민됴리 2024. 4. 2.
반응형

갑자기 블로그 카테고리를 정리하는 이유

통일성도 없고 지저분하기만 한 글들

블로그에 글이 100개 넘게 쌓였습니다. 그런데 글들의 제목과 카테고리에 통일성이 없어서 지저분하게 보입니다. 마지막으로 카테고리를 정리한 게 언제인지 기억도 가물가물하네요. 코드가 길어지면 리팩토링을 해서 여러 파일로 나누는 것처럼, 카테고리를 '리팩토링'하기로 결심했습니다. 제가 카테고리를 리팩토링한 방법은 다음과 같습니다.

 

1. 현재 블로그에 있는 글 목록을 추출한다.

2. 추출한 글 목록 데이터를 전처리한다.

3. 비슷한 주제를 가진 글들끼리 군집화한다.

 

처음에는 글 제목 하나하나를 캡처해서 수동으로 글 목록을 추출하다가 너무 비효율적인 거 같아서 크롬에서 개발자 모드를 켠 후 코딩으로 추출했습니다. 데이터 전처리는 카테고라이징하지 않을 글들을 글 목록에서 제외하고 제목 앞에 붙은 [ ]를 제거하는 방식으로 진행했습니다. 마지막으로 군집화는 생성형 AI ChatGPT 4와 Claude 3.0를 사용한 뒤 '인간의 힘(직접함)'으로 마무리했습니다.

 

블로그에 있는 글 목록 추출하기

글 제목 하나하나를 캡처하려는 바보가 있었다...?

처음에는 아무 생각 없이 글 제목을 하나하나 캡처해서 피그잼에 붙여 넣었습니다. 피그잼을 사용하면 이미지를 움직이는 게 편해서 군집화하기 용이하다는 생각이 들었기 때문입니다. 그런데 100개가 넘는 글을 캡처 -> 붙여넣기 하려면 엄청나게 많은 시간이 낭비될 것 같아서 굳이 이렇게 해야 하나? 싶었습니다. 그래서 다른 방법을 고민했습니다.

 

var postConts = document.getElementsByClassName('post_cont')

var data = []

for (var i = 0; i < postConts.length; i++) {
    var title = postConts[i].querySelector('.tit_post a').textContent;
    var info = postConts[i].querySelectorAll('.txt_info');
    var date = info[1].textContent;

    data.push({
        title: title,
        date: date,
    });
}

console.log(data)

잠깐 고민하고 코드로 해결했습니다. 관리자 페이지에서 '글 관리'를 누르면 글 정보가 동일한 태그의 동일한 속성에 규칙적으로 있기 때문입니다. 그리고 제목, 날짜 등 다양한 정보를 쉽고 빠르게 가져올 수 있습니다. 코드 사용법은 다음과 같습니다.

 

(왼쪽)개발자 모드를 켜서 코드 입력 / (가운데)글 정보가 추출된다 / (오른쪽)페이지를 이동해도 쉽게 정보 추출 가능

개발자 모드를 켜고 위 코드를 복사 붙여넣기 합니다. 그러면 가운데 사진과 같이 글 목록이 추출됩니다. 사실 카테고리를 정리하는데 날짜 정보는 필요 없지만, 카테고라이징과 별개로 날짜 정보를 사용할 곳이 따로 있어서 날짜 정보도 추출했습니다. 지금 사용한 방법의 단점은 현재 보고 있는 페이지의 정보만 추출할 수 있다는 것입니다. 하지만, 개발자 모드를 끄지 않고 페이지만 이동해서 계속 같은 명령어를 입력하면 오른쪽 사진과 같이 손쉽게 제목 목록을 가져올 수 있습니다.

 

(왼쪽)Copy Object / (오른쪽)JSON 객체가 복사된다

추출된 글 정보 리스트에 마우스 우클릭을 하고 'Copy object'를 누르면 글 리스트가 복사됩니다. 복사한 것들은 메모장에 붙여두기 합니다. 저는 공개글과 비공개글을 따로 복사했습니다. 왜냐하면, 비공개글에서는 빼야 할 글들이 몇 개 있었기 때문입니다. 일종의 데이터 전처리를 하는 과정이라고 생각하면 될 것 같습니다.

 

이렇게 해서 글 목록 추출이 끝났습니다. 오랜만에 개발자 모드를 사용해보고 날짜 데이터도 추출할 수 있어서 나름 만족했습니다. 조금 더 생각해보면 더 효율적으로 글 정보를 가져올 수 있는 방법이 있을 거 같은데, 당장은 떠오르지 않네요. 

 

글 목록 데이터 전처리하기

(왼쪽)굳이 카테고라이징하고 싶지 않은 글들을 / (오른쪽)지웠다

가장 먼저 위와 같이 비공개 글에서 공개하고 싶지 않은 글들을 목록에서 지웠습니다. 이 글들은 카테고리가 따로 없거나 다른 글들과 동일한 카테고리에 들어가도 되기 때문입니다.

 

그 후 공개 글에서 카테고리가 명확한 것들도 지웠습니다. 대표적으로 문제풀이와 관련된 글이 있습니다. 이 글들은 카테고리가 절대 바뀔 일이 없기 때문입니다.

 

마지막으로 bias를 방지하기 위해 제목 앞에 적은 [Label]들을 지웠습니다. 제목은 길어봤자 50글자 정도로 짧기 때문에 LLM이 Label들을 중요한 내용으로 인식해서 잘못된 결과를 낼 것이라고 생각했기 때문입니다.

 

예를 들어서 제목이 "[꿀팁] 조별과제에 도움이 되는 구글 문서 활용법 ① - 댓글 작성"이라면 [꿀팁]을 지우고 "조별과제에 도움이 되는 구글 문서 활용법 ① - 댓글 작성"로 수정했습니다.

 

하지만, 일부 Label들은 유지했습니다. 예를 들어서 '[GitHub/기초] Git과 GitHub' 같은 경우에는 Label을 지우든 말든 같은 결과를 낼 것 같아서 굳이 지우지 않았습니다.

 

비슷한 주제를 가진 글들끼리 군집화하기

그럼 대망의 군집화를 해보겠습니다.
사실 말이 군집화지... 그냥 LLM을 사용한 것에 불과합니다.

 

(왼쪽)Claude 3.0 / (오른쪽)ChatGPT 4

다음은 내가 블로그에 작성한 글들의 제목이야.
글들의 제목을 토대로 대분류, 소분류로 글들의  카테고리를 만들어줘.
그다음에 각 카테고리에 맞게 글들을 분류해 줘.

 

군집화는 ChatGPT 4와 Claude 3.0을 사용했습니다. 위 프롬포트를 각 챗봇에 입력했습니다.

 

결과는 놀라웠습니다. 처음에는 ChatGPT의 성능이 더 좋게 느껴졌습니다. 왜냐하면, ChatGPT는 제가 요구한 대로 카테고리를 먼저 만들고 그다음에 글을 배치해줬기 때문입니다. 또한, 개발과 관련해서 되게 세세하게 카테고라이징을 해줬습니다. 반면, Claude는 어떤 카테고리가 있을지 얘기하지 않고 바로 카테고라이징을 했기 때문에 제 명령을 무시했다는 생각이 들었습니다. 그런데 막상 카테고리화된 결과를 살펴보니 Claude가 더 잘했다는 생각이 들었습니다.

 

코딩하거나 서비스 기획할 때도 Claude의 성능이 더 좋다고 느꼈는GPT5가 나오기 전까지는 
Claude를 쓰는 게 좋을 것 같습니다. 더구나 ChatGPT 보다 가격도 저렴하니 안 쓸 이유가 없다고 생각이 들어서 바로 결제했습니다.

 

(왼쪽, 가운데)ChatGPT 4의 출력 / (오른쪽)Claude 3.0의 출력

하지만 두 당연하게도 AI 모두 완벽한 결과는 내지 못했기 때문에 두 AI의 결과를 참고해서 카테고라이징을 했습니다. 명함 관리 애플리케이션 '리멤버'도 OCR이 완벽하지 않기 때문에 타이피스트들이 명함 정보를 수동으로 입력해준다고 하는데, 비슷한 것을 한 것 같습니다. 

 

결과

(왼쪽, 오른쪽, 가운데)카테고리와 제목들이 깔끔해졌다

 

최종적으로 지금 여러분이 보는 블로그의 카테고리가 만들어졌습니다. 정말 깔끔해졌네요. 글들의 카테고리를 옮긴 다음에 그리고 글들 앞에 더 적절한 Label들을 붙였습니다. 코드 리팩토링이 그러하듯 완벽할 수는 없지만, 만족할 만한 결과가 나왔습니다.

 

마치며

만약 벡터 DB에다가 글의 제목과 글의 요약본을 넣은 다음에 유사한 것끼리 묶어서 뽑아낸다면 더 좋은 결과가 나올지도...? 그렇지만 이번에는 거기까지 하지는 않겠습니다. 언젠가 글이 500개 이상이 된다면 그렇게 할지도.

그리고 나중에 글이 더 많아지면 글목록 추출도 수동으로 하는 거에 한계가 있을 수 있기 때문에 글 목록 추출을 자동화해야겠습니다.

암튼 오랜만에 블로그 카테고리를 정리한 것도 좋았고, 하나의 TASK에 대해서지만 ChatGPT와 Claude의 성능을 비교하게 된 점도 좋았습니다.

 

그리고 다시 한번 느끼지만, 카테고리 분류에는 정답이 없는 거 같습니다...
마치 개발과 같달까?

반응형