코딩관계론

중복 뉴스 필터링을 위한 최적화 방안 본문

개발/Hot-Stock

중복 뉴스 필터링을 위한 최적화 방안

개발자_티모 2024. 12. 9. 16:59
반응형

문제 정의

오리엔트정공과 같은 특정 주식의 상승 이유를 설명하는 뉴스를 제공할 때,

  • 같은 주제의 뉴스가 반복적으로 노출되어 사용자들이 피로감을 느끼는 문제가 발생했습니다.
  • 특히, 2024-12-09일 주가 상승 이유는 **"탄핵", "이재명"**이라는 공통된 주제로 요약될 수 있음에도 불구하고, 중복된 뉴스가 다수 표시되어 불편함을 초래했습니다.
  • 따라서 이러한 주식들을 필터링할 수 있는 방법이 필요합니다.

next-stock

 

첫 번째 시도: 키워드 기반 클러스터링

처음에는 GPT에게 뉴스를 분석하여 핵심 키워드를 추출하도록 했습니다.
각 뉴스에서 얻은 키워드 리스트를 바탕으로 공통된 키워드를 가진 뉴스를 묶어주는 방식을 고려했으나, 단순한 키워드 비교로는 한계가 있었습니다.

한계 사례

다음과 같은 뉴스 목록이 있다고 가정합니다.

  • 뉴스 1: [이재명, 정치 테마주]
  • 뉴스 2: [정치 테마주]
  • 뉴스 3: [이재명, 탄핵 정국]
  • 뉴스 4: [탄핵 정국]

문제:

  • 뉴스 1과 뉴스 2는 **"정치 테마주"**라는 공통 키워드를 기반으로 묶을 수 있습니다.
  • 뉴스 3과 뉴스 4는 **"탄핵 정국"**이라는 공통 키워드를 기반으로 묶을 수 있습니다.
  • 하지만 뉴스 1과 뉴스 3은 **"이재명"**이라는 키워드를 공유하지만 다른 키워드는 공유하지 않기 때문에
    단순한 키워드 비교 방식으로는 모든 뉴스를 하나의 그룹으로 묶을 수 없습니다.


해결 방법 1.  유니온 파인드(Union-Find) 알고리즘 도입

유니온 파인드 개념

유니온 파인드는 서로 연결된 요소들을 효율적으로 그룹화하는 알고리즘입니다.
이 방식을 사용하면 직접적으로 연결되지 않은 요소들도 간접적으로 연결된 경우 하나의 그룹으로 묶을 수 있습니다.

적용 방식

  1. 키워드 추출
    • 각 뉴스에서 핵심 키워드 리스트를 추출합니다.
      예시:
    • 뉴스 1 → [이재명, 정치 테마주]
    • 뉴스 2 → [정치 테마주]
    • 뉴스 3 → [이재명, 탄핵 정국]
    • 뉴스 4 → [탄핵 정국]
  2. 키워드 매핑
    • 각 키워드를 노드로 간주하고, 같은 뉴스에 등장한 키워드들끼리 간선으로 연결합니다.
      예시:
    • 뉴스 1에서 이재명정치 테마주가 연결됨.
    • 뉴스 2에서 정치 테마주가 단독으로 연결됨.
    • 뉴스 3에서 이재명탄핵 정국이 연결됨.
    • 뉴스 4에서 탄핵 정국이 단독으로 연결됨.
  3. 유니온 파인드로 그룹화
    • 연결된 키워드들을 기반으로 유니온 파인드 알고리즘을 사용하여 그룹을 찾습니다.
    • 최종적으로 연결된 모든 키워드를 포함하는 하나의 클러스터를 생성합니다.
      결과:
    • 뉴스 1, 뉴스 2, 뉴스 3, 뉴스 4는 모두 간접적으로 연결되어 하나의 그룹으로 묶입니다.

 

해결 방법 2.  뉴스에서 테마 추출하기

1. TOT 방식으로 테마 이름 도출

TOT(Tree of Thoughts) 프롬프트 방식을 활용하여,
GPT에게 뉴스 내용을 기반으로 테마 이름을 추출하도록 요청합니다.

  • 목표:
    • 뉴스마다 GPT가 다르게 인식할 수 있는 테마 이름을 기존 테마 이름에 최대한 유사하게 도출하도록 유도합니다.
    • 이를 통해 동일한 이슈에 대한 뉴스를 하나의 통일된 테마로 묶을 수 있습니다.
프롬프트 설계 예시:

"다음 뉴스 내용에서 공통된 주제나 테마를 추출하여 하나의 통일된 테마 이름을 도출하세요.  
가능한 한 기존 테마 이름과 유사한 형태로 통일하세요.  
기존 테마 예시: ['이재명 테마주', '정치 테마주', '방산주']  

뉴스: <뉴스 내용 입력>  
도출할 테마 이름:"

 

2. 편집 거리 기반 검증 및 통일화

테마 이름을 도출한 후에도 GPT가 제시한 테마가 약간씩 다르게 표현될 수 있습니다.
예를 들어, 다음과 같은 결과가 발생할 수 있습니다.

  • '방산주' vs '방산 주' → 띄어쓰기 차이
  • '오징어게임' vs '오징어게임2' → 접미어(숫자) 차이

이러한 문제를 해결하기 위해 **편집 거리(Levenshtein Distance)**를 활용하여 유사한 테마들을 통일하는 방식을 도입했습니다.

편집 거리 임계값 설정

편집 거리 기반 통일화에서 가장 중요한 점은 편집 거리 임계값을 몇으로 설정할 것인가입니다.
나는 편집 거리 임계값을 1로 설정했습니다.

  • 이 설정은 단순한 표현 차이만 해결하기 위한 것이며,
    극단적으로 다른 테마를 같은 테마로 묶는 오류를 방지하기 위한 목적입니다.
  • 처음에는 한글 자모 분리 방식, 특정 글자 수 이상일 때만 편집 거리 적용 등 다양한 방법을 시도했으나,
    비효율적이거나 잘못된 결과가 도출되는 문제가 있어 최종적으로 편집 거리 1로 제한했습니다.

추가 개선: 부가 단어 제거 후 편집 거리 실행

편집 거리 실행 전에 **'관련주', '기술', '테마'**와 같은 부가적인 단어를 제거했습니다.
이 과정은 외부 도움을 받아 사전에 정의된 불필요한 단어들을 필터링한 후,
핵심 테마만 남겨 정확하게 편집 거리 검증을 실행할 수 있도록 했습니다.

 

 

결과

최종적으로, 위 과정을 거친 결과 같은 날짜에 중복된 뉴스가 제거되어 사용자에게 핵심 정보만 제공되는 것을 확인할 수 있었습니다.

반응형