프로젝트 개요

프로젝트 배경

소셜미디어 접근성이 점점 낮아지고 있다. 누구나 정보를 생산하고, 무분별하게 생산된 거의 모든 정보에 누구나 쉽게 접근할 수 있다. 각종 커뮤니티, 메신저 등은 물론이고, 언론사도 낚시성 기사, 어뷰징 기사, 광고성 기자 등 낮은 품질의 컨텐츠를 생산하고 있다. 또한, 취재과정에서 충분한 사실 확인 과정을 거치지 않고 보도한다. 잘못된 정보를 제대로 판단하지 못한 상태에서 이 정보가 확산되고 사실과 다른 여론이 형성되어 피해를 입는 사례가 늘어나고 있다. 이러한 상황 속에서 대중은 비판적으로 사고하고 수용하며, 편향적인 정보를 걸러내는 능력을 키울 필요가 있다. 그러나 미디어 리터러시를 함양하는 것은 단시간에 불가능하며, 개인의 능력만으로는 한계가 있다. LLM을 적용하여 일종의 ‘뉴스 분석 보고서’를 만들고, 이를 통해 해답을 얻거나, 그 방법을 학습할 수 있을 것이라고 판단하였다.

주요 기능

뉴스 분석 보고서는 ChatGPT를 이용하여 핵심단어, 자극적인 단어, 추측성 단어를 찾으며, 기사를 3줄로 요약한다. 쉽고 빠른 이해와 판단을 돕고, 필요한 정보에 집중할 수 있도록 ChatGPT의 결과에 시각적으로 변화를 준다.

  1. 핵심단어: 기사를 읽기 전 핵심 단어를 파악하고, 기사가 강조하고자 하는 정보에 집중할 수 있도록 한다.
  2. 자극적인 단어: 편향성을 파악하고, 객체화된 사실과 의견을 구분할 수 있으며, 감정적인 조작을 인식하고 경계할 수 있다.
  3. 추측성 단어: 저자의 주장이나 가설을 나타내는 데 사용될 수 있으므로, 주장과 사실을 구분하기 위한 정보가 된다.
  4. 요약: 전문을 읽으면서 빠뜨린 내용은 없는지, 전하고자 하는 정보를 제대로 수용했는지 파악한다.

프레임워크

Frame

구현

네이버 기사 크롤링

#-----Naver News 크롤링
def get_article_content(url):
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/98.0.4758.102"}
    news = requests.get(url, headers=headers)
    news_html = BeautifulSoup(news.text, "html.parser")

    # 뉴스 제목 가져오기
    title = news_html.select_one("#ct > div.media_end_head.go_trans > div.media_end_head_title > h2")
    if title == None:
        title = news_html.select_one("#content > div.end_ct > div > h2")

    # 뉴스 본문 가져오기
    content = news_html.select("div#dic_area")
    if content == []:
        content = news_html.select("#articeBody")

    # 기사 텍스트만 가져오기
    content = ''.join(str(content))

    # html태그제거 및 텍스트 다듬기
    pattern1 = '<[^>]*>'
    title = re.sub(pattern=pattern1, repl='', string=str(title))
    content = re.sub(pattern=pattern1, repl='', string=content)
    pattern2 = """[\n\n\n\n\n// flash 오류를 우회하기 위한 함수 추가\nfunction _flash_removeCallback() {}"""
    content = content.replace(pattern2, '')

    try:
        html_date = news_html.select_one(
            "div#ct> div.media_end_head.go_trans > div.media_end_head_info.nv_notrans > div.media_end_head_info_datestamp > div > span")
        news_date = html_date.attrs['data-date-time']
    except AttributeError:
        news_date = news_html.select_one("#content > div.end_ct > div > div.article_info > span > em")
        news_date = re.sub(pattern=pattern1, repl='', string=str(news_date))

    return title, content, news_date

ChatGPT API

def gpt_api(content, text):
    payload = {
        "model": "gpt-3.5-turbo",
        "messages": [{"role": "user",
                      "content": content + "기사: " + text
                      }],
        "temperature": 0.6,
        "top_p": 1.0,
        "n": 1,
        "stream": False,
        "presence_penalty": 0,
        "frequency_penalty": 0,
    }
    return payload

프롬프트 작성

|내용|prompt|역할| |—|—|—| |핵심 단어|[아래의 기사]에서 핵심 단어를 5가지 뽑아주세요. 결과는 python의 list 형태로 알려주세요.|기사를 읽기 전 핵심 단어를 파악하고, 기사가 강조하고자 하는 정보에 집중할 수 있도록 한다.| |추측성 단어|추측성 단어는 글의 저자가 확신을 가지고 주장하지 않고 추측이나 예상에 기반하여 이야기하는 단어나 표현을 말합니다.추측성 단어는 가능성이나 추측을 나타내는 단어, 조건부나 가정적인 표현, 주관적인 표현입니다. 추측성 단어의 예시로는 예측, 추측, 가능성, 아마, 어쩌면, 상당히, 거의 확실하게, 아마도 등과 같은 단어들이 있습니다. 추측성 표현의 예시로는 ~이면, ~라면, ~것 같다, ~인 것 같다, ~할 수도 있다 등과 같은 표현들이 있습니다. 주관적인 표현의 예시로는 생각에는, 느낀 바로는, 개인적으로 등과 같은 표현이 있습니다. [아래의 기사]에서 추측성 단어를 찾고 python의 list 형태로 만들어주세요. 추측성 단어가 없으면 ‘없음’이라고만 답변하세요.|저자의 주장이나 가설을 나타내는 데 사용될 수 있으므로, 주장과 사실을 구분하기 위한 정보가 된다.| |자극적인 단어|자극적인 단어는 감정이나 강한 표현을 포함하고 있어 독자의 관심을 끌거나 주장을 강화하는 역할을 합니다. 자극적인 단어는 강한 감정을 일으킬 수 있는 단어, 강조나 비교에 사용되는 단어, 강렬한 이미지를 상상케 하는 단어입니다. 그 예시로는 충격적인, 파격적인, 강렬한, 끔찍한, 아비규환, 최대, 최고, 절대적으로, 상당히, 극도로 등이 있습니다. [아래의 기사]에서 자극적인 단어를 찾고 python의 list 형태로 만들어주세요. 자극적인 단어가 없으면 ‘없음’이라고만 답변하세요.|편향성을 파악하고, 객체화된 사실과 의견을 구분할 수 있으며, 감정적인 조작을 인식하고 경계할 수 있다.| |3줄 요약|[아래의 기사]의 내용을 번호를 매겨 3줄로 요약해주세요. [아래의 기사] 제목은 {title}입니다.|전문을 읽으면서 빠뜨린 내용은 없는지, 전하고자 하는 정보를 제대로 수용했는지 파악한다.|

Streamlit 앱

image