카테고리 없음

뉴스분석 및 요약서비스(키워드 순위, 주요기사 필터링)

hearai 2025. 1. 7. 22:51

 오늘은 주요 기사 모아보기 탭을 만들고, 그곳에서 필터링한 정보를 볼 수 있도록 기획했다. 10개 종합신문사를 15분마다 크롤링하고, 10개 기사 중 1위에 오른 기사는 "실시간 주요 뉴스"에 업로드 된다. 종합적인 시각을 갖는 것이 목표기에 언론사를 가나다 순으로 배열하였다. 

 

중요 키워드는 단어 빈도수(TF), 단어의 중요도(IDF), 기사 순위 가중치(상위 랭크 기사에 등장하면 더 중요하게 취급)를 고려하여 선정되었다. 대통령의 계엄령 선포와 관련된 사건들은 현시점 대한민국에서 뜨거운 감자이다. 언론사들의 최상위에 랭크된 기사들은 달랐지만 TOP10 실시간 랭킹은 주요 사건들을 다루고 있어 중요 키워드는 그 흐름을 잘 반영하고 있다. 키워드를 클릭하면 관련 기사를 한 곳에서 볼 수 있도록 하였고, 기사들을 아래에서 위로 5초 간격으로 슬라이드하여 키워드 내용의 이해를 도왔다.

 

🥕 랭킹 숫자를 제외했더니 기사 제목의 숫자까지 제외되는 문제

처음 크롤링 코드는 랭킹 전체를 가져오고, view에서 제목 앞의 숫자를 제거하려고 했다. 하지만 제목의 가장 앞에 "6번 째"와 같이 숫자가 있을 경우 "번 째"와 같이 출력되었다. 이 문제를 개선하고자 크롤링한 뉴스의 HTML을 확인하였고, 크롤러 방식을 BeautifulSoup의 decompose() 메서드를 사용하여 순위 요소를 제거하였다.

for idx, article in enumerate(articles, 1):
    try:
        # 순위 요소 찾기
        rank_num = article.select_one('.list_ranking_num')
        if rank_num:
            rank_num.decompose()  # 순위 텍스트 제거
        
        title = article.get_text(strip=True)
        url = article['href']
        
        # 제목에서 조회수 부분 제거
        if '조회수' in title:
            title = title.split('조회수')[0].strip()

 

🥕 "공수처", "공수처장"이 "공수"로 키워드 랭크되는 문제

복합 명사가 부적절하게 분리되는 문제는 복합명사 우선 추출로직을 개선함으로써 해결했다. 복합명사 패턴(기관/조직, 직책, 사건/사안 등)을 우선적으로 처리하고, 조사를 제거하며, 일반 명사를 추출하도록 했다. 즉, 정규표현식을 활용해 패턴을 정의하고, 복합명사를 먼저 추출해서 분리를 방지했다. 또한 추출된 부분은 마스킹하여 중복을 방지했고, 같은 제목에 등장하는 키워드들의 연관 관계를 파악하도록 했다.

# 1. 복합명사 우선 추출 (조사 제거 전에)
for pattern in COMPOUND_PATTERNS:
    matches = re.finditer(pattern, working_title)
    for match in matches:
        compound_word = match.group(0)
        if compound_word not in stop_words:
            title_nouns.append(compound_word)
            # 추출된 부분을 ■로 치환하여 중복 추출 방지
            working_title = working_title.replace(match.group(0), '■' * len(match.group(0)))
# 키워드 그룹화(set자료구조를 사용하여 중복을 제거하고, 연관키워들은 그룹으로 관리)
keyword_groups[main_keyword] = {existing, keyword}
keyword_groups[main_keyword].add(keyword)

# 정렬 및 필터링(빈도수 기준 정렬, 상위N개만 반환하여 성능 최적화)
sorted_keywords = sorted(final_keywords, key=lambda k: counts[k], reverse=True)
return [(k, counts[k], keyword_groups[k]) for k in sorted_keywords[:limit]]

 

<키워드별 주요 기사>는 타이틀에 "윤석열", "법원" 등이 포함된 중복 기사를 허용해 보여주고 있다. <언론사별 주요 기사>는 중복 없이 반영되어 그 수가 줄어들었다. 

 

이것들을 한 눈에 볼 수 있도록 필터링 기능을 추가하였고, AI트렌드 분석(LLM)기능을 추가할 예정이다. 분석에는 종합신문의 TOP 키워드가 다루는 이슈와 관점, 연관성들을 다룸으로써 사용자의 관심에 따른 맞춤 인사이트를 제공할 것으로 보여진다.