Search
Duplicate
🌄

생활 속 NLP - 오전 편

Created
2022/07/30
Editor
21세기 대한민국의 대학생 이딥다의 방에서는 벌써 세 번째 알람이 울리고 있습니다. 알람이 한참을 울리던 끝에 딥다는 미동도 않은 채로 “시리야, 알람 꺼줘”라고 말합니다. 시리의 답을 들으며 힘겹게 몸을 일으킨 딥다는 부엌으로 걸어가 물을 한 잔 마신 뒤, 식탁 위에 있던 핸드폰으로 어제 올라온 뉴스가 요약된 메일을 읽기 시작해요. 주식 뉴스 서비스에서 추천해주는 주식을 확인하며, 딥다는 갑부가 되는 상상을 그려보곤 실시간 강의를 듣기 시작해요.
이어 아침 겸 점심을 간단하게 해치운 딥다는 어제 미처 마무리하지 못한 레포트 과제를 시작합니다. 자료를 찾기 위해 검색한 영어권 사이트의 글을 한글로 번역해 정보를 얻고, 혹시라도 맞춤법이 틀릴까 싶어 맞춤법 검사도 돌려봅니다. 꽤 오랜 시간을 매달려 끝낸 레포트는 표절률 검사 사이트에 올려 표절률을 확인해보고 메일로 제출합니다. 과제를 끝낸 딥다는 한 어플에 들어가 영화 취향을 검색한 뒤 추천을 받고 자신의 취향을 저격한 영화를 틉니다. 엔딩 크레딧까지 보고 나서야 당장 내일 있을 AI 면접 후기를 찾아보며 준비하고, 딥다는 늦은 저녁이 되어서야 침대에 눕습니다.
딥다의 하루, 어떻게 보셨나요?
짧게 읽어본 딥다의 생활 속에는 우리의 삶을 편리하게 만들어준 공통적인 기술이 숨어 있습니다. 바로 자연어처리(NLP, Natural Language Processing)인데요. 딥다가 사용한 시리부터 뉴스 요약 메일, 레포트 과제를 하기 위해 사용한 사이트와 기능들, 영화 취향 검색 어플, ai 면접 등 이 모든 것을 가능하게 만드는 기초적인 기술이라고 할 수 있습니다. 지금부터 두 편에 걸쳐, 각 서비스에 적용된 자연어처리 기술을 확인해보고 어떤 특징을 가지고 있는지 알아볼게요.

음성 어시스턴트Voice assistant

딥다가 알람을 끄기 위해 불렀던 ‘시리’는 애플 사의 인공지능 개인 비서 서비스입니다. 직접 손가락으로 화면을 터치해 특정 어플을 클릭하지 않고도 시리를 불러 음성으로 지시하면 시리가 대신 전화를 걸거나 문자를 보내주고, 곧바로 알람을 설정하거나 음악을 실행할 수 있습니다. 심지어는 날씨 또는 환율 등 궁금한 것들을 시리에게 물어보면 즉시 답을 알려줄 수도 있죠.
시리와 유사한 서비스에는 삼성의 빅스비, 구글의 구글 어시스턴트, 아마존의 알렉사 등이 있는데요. 이 서비스들을 총칭해 음성 인식 비서, 음성 어시스턴트라고 이야기할 수 있어요. 음성 어시스턴트 기술의 핵심 기능은 컴퓨터가 사용자의 발화에 내재된 의도를 파악하고 의도에 걸맞은 업무를 대신 수행할 수 있도록 하는 것이라고 할 수 있습니다.

음성 어시스턴트의 원리는?

음성 어시스턴트가 작동되기 위해서는 사용자의 음성이 들어오면 이를 인식하고 / 인식한 음성을 텍스트로 변환해 의도에 맞게 데이터를 처리한 뒤 / 사용자에게 제공할 정보에 대한 텍스트를 오디오로 변환하는 과정을 거쳐야 해요. 지금부터 조금 더 구체적으로 알아볼게요.
1. 음성 입력 및 인식
음성 어시스턴트 서비스는 사용자의 호출어Invoke keyword를 인식하는 것부터 시작합니다. “시리야”, “하이 빅스비” 등과 같은 호출어로 음성 어시스턴트가 실행되면, 이후에 입력되는 사용자의 음성을 인식해 본격적인 프로그램이 시작되는 거죠. 이때 사용자가 서비스를 사용할 때 취하는 대화는 신변잡기 대화, 질의응답 대화, 목적지향 대화로 구분해볼 수 있어요.
호출어를 비롯한 사용자의 음성은 STT(Speech-to-Text) 기술로 인식할 수 있습니다. STT는 사람의 음성 언어를 컴퓨터가 해석해 텍스트 데이터로 전환해 주는 기술이에요. STT 기술의 기본적인 구조는 다음과 같이 그려볼 수 있어요.
우선, 입력된 음성 데이터에서 필요한 데이터만을 취하기 위해 잡음을 처리하고 음성 특징을 추출합니다. 전처리 과정이라고도 할 수 있어요. 잡음을 처리하기 위한 방법 중에는 주변 소음의 역 위상을 갖는 음파를 발생시켜 소음이 상쇄되도록 하는 기존 노이즈 제거 기술도 있고, 딥러닝을 활용해 잡음을 필터링하는 기술도 있습니다. 잡음을 제거하는 딥러닝과 더 깨끗한 음성 데이터를 판단하는 딥러닝 두 가지를 사용해, 두 딥러닝이 판단을 반복하는 과정을 거쳐 원음에 가까운 깨끗한 음질을 추출하는 방식을 사용하기도 해요.
다음은 추출한 데이터를 텍스트화하는 과정입니다. 이 과정에서 사용하는 알고리즘은 디코더(Decoder)라고 하고, 디코딩 단계라 칭하기도 해요. 기존에 구축한 음성 모델과 어휘/발음 사전을 바탕으로 추출한 음성 데이터를 텍스트 정보로 변환하는 과정이라 할 수 있어요. 이때 음성 모델은 음향모델(Acoustic Model, AM)과 언어모델(Language Model, LM)로 구성되어 있어요. 음향 모델은 음성 데이터에서 나타나는 음향적 특성을 모델링해 학습한 모델, 언어 모델은 문장의 어휘, 문장 구조와 같은 문법적 특성을 학습한 모델을 의미합니다. 음향 모델로는 화자를 식별하거나 성별 등을 인식할 수 있어요.
그리고 사용자의 국적, 억양, 어투, 추임새, 언어적 습관을 비롯한 방언 등을 고려했을 때, 음성 데이터로부터 사용자의 확실한 의도를 찾기 위해서는 음향 모델과 언어 모델을 활용하는 것이 효과적이겠죠? 아니 근데 솔직히 진짜 발화에 담긴 필수적인 표현을 구분해내는 과정은 필요할 테니까요!
최근 연구되고 있는 자료에 따르면 STT의 마지막 단계에서 후처리를 진행하기도 해요. 후처리에는 띄어쓰기 오류 보정, 철자 오류 보정, 음성인식 결과 재순위화가 포함됩니다.
띄어쓰기 오류 보정은 모든 띄어쓰기를 삭제한 뒤 기계학습 모델로 띄어쓰기를 할 위치를 결정하는 방법을 의미해요.
정보과학회지 35(8), 2017.8, 9-18(10 pages) Communications of the Korean Institute of Information Scientists and Engineers 35(8), 2017.8, 9-18(10 pages)
철자오류 보정은 사전과 통계 정보를 주로 이용합니다. 사전을 이용하는 경우, 모든 문장의 각 단어를 사전에서 검색하고 검색되지 않은 단어를 철자 오류로 가정해요. 메타폰 알고리즘 등을 사용해 그 단어와 가까운 단어로 대체하는 방법이 곧 사전을 통한 철자오류 보정이에요. 통계 정보의 경우, 단어에서 특정 음절 또는 알파벳이 삭제되거나 대체될 확률을 바탕으로 사용자가 의도한 단어를 계산하는 보정이라고 볼 수 있어요.
정보과학회지 35(8), 2017.8, 9-18(10 pages) Communications of the Korean Institute of Information Scientists and Engineers 35(8), 2017.8, 9-18(10 pages)
음성인식 결과 재순위화 모델은 음성인식 결과 도출된 형태소열의 후보군을 두고, 옳은 형태소열을 만드는 최종 문장을 구성하는 모델이에요.
정보과학회지 35(8), 2017.8, 9-18(10 pages) Communications of the Korean Institute of Information Scientists and Engineers 35(8), 2017.8, 9-18(10 pages)
2. 자연어 이해와 자연어 생성
STT를 거쳐 텍스트 데이터를 수집한 뒤에는 텍스트에 숨은 의도intent와 개체entity를 추출해야 해요. 즉, 음성 데이터에서 추출해 전환한 텍스트 데이터 중에 사용자가 원하는 바를 담은 표현이 어떤 것인지를 파악하는 과정을 거쳐야 하는 거죠.
여기서 사용자의 의도는 대화의 성격에 따라 다르게 설정되어 있을 거예요. 담화를 원하는지, 질의응답을 원하는지, 또는 목적지향 대화를 원하는지에 따라서요! 이를 파악하는 과정이 곧 자연어 이해(National Language Understanding, NLU)이고, 수집한 정보를 활용하는 대화관리, 그 결과를 바탕으로 사용자에게 전달할 응답을 자연어 텍스트로 만들어주는 것이 자연어 생성(National Language Generation, NLG)에 해당해요.
우선 사용자의 의도를 파악하는 과정은 담화 분석, 어떤 응답을 생성할지를 결정하는 과정은 대화 모델링이라고 정의해요. 이때 대화 모델은 영역 지식 모델과 담화 모델로 구분되는데, 전자는 응답을 생성하기 위해 참조할 수 있는 지식을 관리하는 모델, 후자는 대화 흐름을 제어하는 모델이에요. 충분한 말뭉치로 학습된 모델을 활용해, STT로 얻은 텍스트의 의미를 파악하고 이에 대한 응답을 구성할 데이터를 확정하는 거죠.
응답을 생성하는 자연어 생성 단계에서는 최종적으로 텍스트 답변을 도출해요. 이 응답은 우리가 사용하는 자연어 형태로 구성되어 정보를 원활하고 정확하게 전달할 수 있는 것을 목적으로 합니다. Stent et al이 제안한 바에 따라 적절성, 유창성, 가독성, 다양성을 만족할 수 있도록 그리고 문맥, 문장의 길이 등이 적절할 수 있도록 조건에 맞춰 생성해낸다면 이에 적합한 응답은 사용자에게 유용하게 전달될 거예요.
3. 인식 결과 오디오 변환
사용자에게 전달할 응답 문장이 구성되었다면 이제는 사람의 목소리로 변환해 출력할 단계입니다. 이번에는 텍스트를 음성으로 전환하는 TTS(Text-to-Speech) 기술을 활용해야 해요. 음성 합성이라고도 하는 TTS는, 모델로 선정한 사람의 말소리를 녹음한 뒤 그 음원을 일정한 음성 단위로 분할해 입력하고, 필요한 음성 단위를 합쳐 인위로 발화를 만들어내는 기술을 말해요.
자연어 생성 과정으로 사용자에게 전달할 응답 문장이 구성되면 문자열을 발음열로 변환하고, 음성적 특징을 생성한 뒤에 앞서 이야기한 필요한 음성 신호를 합성하는 단계를 거치는 거죠.
[날씨] 오늘 강추위 기승...모레 아침까지 계속 [YTN]. (2022년 1월 12일). Retrieved from https://news.naver.com/main/read.naver?mode=LSD&mid=sec&sid1=001&oid=052&aid=0001688747
TTS 기술이 발달하면서, 이제는 인위적으로 음성 단위를 합성하지 않고도 End-to-End TTS 모델 등을 사용해 이 단계를 수월하게 진행할 수 있어요. 텍스트를 입력하면 이 과정에 대한 데이터를 모델이 스스로 학습하게 설정해 별도로 문자열을 발음열로 변환하지 않고도 곧바로 음성 데이터로 출력할 수 있거든요!
페이스북(현 Meta) AI에서 발표한 ‘생성적 화자 언어 모델(Generative Spoken Language Model, GSLM)’에서는 원시 오디오 자체에서 자연어 처리가 진행돼요. 구어에서 자주 반복되는 소리의 개별 단위로 변환하고(인코더) 어떻게 단위들을 구성하고 분리해야 할지 예측한 뒤(자동 회귀), 그 단위 기반의 언어 모델을 바탕으로 단위를 다시 음성으로 변환하는 과정(디코더)을 거쳐서 말이죠.
이제 우리는 딥다가 눈 뜨자마자 불렀던 ‘시리’가 어떻게 알람을 끄는 일을 수행했는지 이해할 수 있어요. “시리야”라는 호출어로 실행이 시작되고, 이어 이야기한 “알람 꺼줘”라는 음성을 STT를 활용해 텍스트 데이터로 변환한 뒤, 텍스트에 대한 이해를 바탕으로 만든 응답을 TTS로 음성 데이터로 변환해 출력하는 과정에 걸쳐 알람을 끄는 일을 수행했던 거죠. 앞으로도 음성 인식 기술은 딥다가 그랬듯이, 원거리에서도, 손 하나 까딱하지 않고도, 굉장히 빠르게 우리가 원하는 일을 해낼 수 있게 만들어줄 거예요!

뉴스 요약 AI 모델

이렇게 시리와 함께 아침에 일어났다면, 딥다처럼 잠자는 동안 어떤 일들이 발생했는지 알아볼 필요가 있겠죠? 그러기 위해서는 뉴스 기사를 좀 읽어야 할텐데... 궁금한 것은 많지만 주식 시장이 열리기까지 시간이 얼만 남지 않았을 뿐더러 학교 수업까지도 시간이 별로 없어 수많은 기사를 정독하기에는 시간이 조금 빠듯해요.
그렇다면 딥다가 그랬듯 뉴스 요약 AI 모델을 활용하면 되겠네요! 뉴스 요약 AI 모델들은 대체로 뉴스를 세줄, 혹은 한줄로 필요한 부분만 쏙쏙 뽑아서 매우 간결하게 보여주는데요, 줌 인터넷과 연합뉴스의 뉴스 요약 AI 모델, 네이버의 CLOVA Summary, SK텔레콤의 KoBART 등을 예로 들 수 있어요. 국내 주식을 추천해주는 서비스도 굉장히 많은데요, 바이브컴퍼니는 SOFIA라는 플랫폼을 기반으로 맞춤형/구독형 서비스를 제공하고 있으며 투디지트에서는 뉴스샐러드라는 앱을 개발하여 상장 주식과 관련된 뉴스, 리포트 등을 제공하고 있어요. 두 서비스 모두 어떻게 구성되고 만들어졌는지 살펴보도록 해요.

SK텔레콤의 KoBART를 활용한 뉴스 요약

먼저 뉴스 요약 AI 모델들을 살펴볼텐데요, 그 중에서 가장 사용이 간단해서 누구든지 활용해볼 수 있는 SK텔레콤의 KoBART를 예시로 들어보려고 합니다. 현재 SK텔레콤은 KoBERT, GPT-2에 이어 세 번째 언어처리 모델로 KoBART를 내세웠는데요, 자연어처리(NLP) 분야 중에서 자연어이해(NLU) 영역의 기술력을 증가시킨 것이라고 합니다. SK텔레콤의 테크 T3K 센터가 운영하는 GitHub 중 KoBART-summarization 파트에 들어가면 바로 기사 요약 프로그램을 사용할 수 있어요.
미리 huggingface.co에 나와 있는 binary를 활용하여 KoBART를 불러들인 뒤, binary를 다음과 같은 코드를 사용해서 다운받습니다. 해당 GitHub에서는 Dacon 한국어 문서 생성요약 AI 경진대회의 학습 데이터를 활용했다고 해요. 최근에 SKT는 국립국어원과 업무 협약을 체결하여 국립국어원의 언어 정보, 청원 사이트에서 날짜가 지난 청원 내용, 대화 내용 등 훨씬 더 많은 데이터를 활용하고 있어요. 그 다음 이 코드를 통해 세밀하게 요약된 내용을 조정하는 과정을 거쳐 Demo를 실행하면 앞으로는 뉴스 요약을 간단하게 할 수 있을거에요. 여기를 누르면 바로 KoBART Summarization Model Test로 넘어갈 수 있어요. 다음은 가장 최근의 기사를 해당 모델을 통해서 요약해본 결과에요. 놀랍지 않나요?

Pororo를 활용한 주식 뉴스 요약

다음으로는 네이버 뉴스와, 카카오 브레인에서 공개한 파이썬 라이브러리 Pororo를 활용해 주식 뉴스를 요약하는 방법을 알아보고자 합니다. 해당 프로그램은 메일링까지 지원하여 구글 계정과 연동한다면 요약된 주식 뉴스를 메일로 받아볼 수 있다고도 하네요! 먼저 네이버 뉴스에서는 ‘금융’ 파트에서 주식 뉴스를 다루고 있으므로 해당 부분에서 기사를 크롤링합니다. 이 과정을 주기적으로 한다면 주기적으로 주식 관련 뉴스의 데이터가 쌓임과 동시에 메일로 주식 변화 내용들을 한눈에 알아볼 수 있겠죠? 다음은 크롤링 코드에요.
from bs4 import BeautifulSoup import requests import pandas as pd import re import os class news_crawler: def __init__(self): self.company_code_table = pd.read_csv('company_list.txt', dtype=str, sep='\t') def crawler(self, company_code, num_article): done_page_num=0 # page = 1 num_per_page=20 # naver serves 20 articles per page num_page,remainder=divmod(num_article,20) num_page+=1 article_result=[] for page in range(done_page_num+1, done_page_num+num_page+1): try: url = 'https://finance.naver.com/item/news_news.nhn?code=' + str(company_code) + '&page=' + str(page) source_code = requests.get(url).text html = BeautifulSoup(source_code, "lxml") # 뉴스 링크 links = html.select('.title') link_result =[] if page == num_page: links=links[:remainder] for link in links: add = 'https://finance.naver.com' + link.find('a')['href'] link_result.append(add) print(f"{len(link_result)}개의 뉴스 크롤링..") except Exception: pass for article_url in link_result: try: article_source_code = requests.get(article_url).text article_html = BeautifulSoup(article_source_code, "lxml") article_time = article_html.select('.tah')[0].get_text() # 뉴스 내용 article_contents = article_html.select('.scr01') article_contents=article_contents[0].get_text() article_contents = re.sub('\n','',article_contents) article_contents = re.sub('\t','',article_contents) # cut extra text after Copyright mark if "ⓒ" in article_contents: article_contents=article_contents[:article_contents.index("ⓒ")] # cut too long text to prevent CUDA OOM issue if len(article_contents)>=1500: article_contents=article_contents[:1500] article_result.append([article_contents,article_time]) time.sleep(random.uniform(0.1,0.7)) except Exception: pass # print("다운 받고 있습니다------") return article_result def convert_company_to_code(self,company): # 종목코드 추출 company_name = self.company_code_table['회사명'] keys = [i for i in company_name] #데이터프레임에서 리스트로 바꾸기 company_code = self.company_code_table['종목코드'] values = [j for j in company_code] dict_result = dict(zip(keys, values)) # 딕셔너리 형태로 회사이름과 종목코드 묶기 pattern = '[a-zA-Z가-힣]+' if bool(re.match(pattern, company)) == True: company_code = dict_result.get(str(company)) return company_code else: company_code = str(company) return company_code def crawl_news(self, company, max_num=5): print(f"{company} 종목 뉴스를 가져옵니다.") company_code=self.convert_company_to_code(company) if company_code: result=self.crawler(company_code, max_num) for i in range(len(result)): result[i].append(company) return result else: print(f"{company} 종목이 존재하지 않습니다.") return []
Python
복사
기사 크롤링 부분에서 crawl_news 메서드를 통해 크롤링을 순차적으로 진행하면 되는데요, 이때 crawler 메서드는 기업 코드와 가져올 기사의 수를 입력으로 받아 뉴스를 가져온다고 해요. 이때 가져오는 기사의 정보로는 종목에 해당하는 기사 제목, 관련 기사, 정보 제공 주체와 날짜인데요, 가져오는 주소를 통해 직접 기사 내용을 긁어오면 크롤링이 가능합니다. 또한 convert_company_to_code 메서드는 기업명을 입력으로 받아 종목 코드를 출력한다고 해요. 종목 코드는 기업명에 따라 모여 있는 기사들의 링크로 이동할 수 있도록 도와주죠. 이렇게 Pororo의 KoBART Summary 기능을 이용하면 주식 뉴스를 간단하게 요약할 수 있어요. 특히, 짧은 문장으로 축약해주기 때문에 한시가 급한 사람들이 이용하기 정말 좋을 것 같네요. 한시가 급하지는 않지만, 짧고 간결한 덕분에 딥다는 기사 읽는데 시간이 별로 들지 않아 여유롭게 수업 준비를 할 수 있을 것 같네요.
오전 시간 동안에 있었던 NLP에 대해서 살펴보았는데 어떠셨나요? 뒷부분에 해당하는 내용은 아직 실생활에서 거의 쓰이지 않고 있지만, 회의 내용 정리나 주식 변동 사항 정리 등에는 나름 활용되고 있다는 이야기를 듣고 가져와 봤어요. 사실 많은 사람들이 요약된 글을 읽는 것을 좋아하는 만큼 해당 기술도 머지 않아 곧 쓰이게 될 것 같죠? 최근에는 뉴스 요약 이외에도 네이버의 보이스 뉴스처럼 주요 뉴스 기사 요약본을 음성으로 들려 주는 서비스도 있고, 필요한 논문만 효율적으로 볼 수 있도록 하는 논문 요약 AI인 Semantic Scholar 등도 계속 해서 나오고 있다고 하는 것을 보면 요약 기술이 얼마나 빠르게 발전하고 있는지 알 수 있겠네요. 다음 시간에는 오후 일과 시간 동안에 찾아볼 수 있는 생활 속 NLP 이야기를 마저 들고 돌아오도록 할게요.

참고 문헌

1.
곽효원. (2018, 03, 29). 사람의 말을 기계언어로, 기계언어를 사람에게. https://www.bloter.net/newsView/blt201803290006
2.
김학수. (2017).인공지능 음성언어 비서 시스템의 자연언어처리 기술들.정보과학회지,35(8),9-18.
3.
이경님. (2017). 음성 언어 처리 기술, 어디까지 왔나. 새국어생활, 27(4)
4.
LG CNS 미래신사업담당. (2018, 11, 12). 챗봇을 넘어 음성봇으로. https://blog.lgcns.com/1863
5.
Kincaid, J. (2018, Jul 13). A brief History of ASR: Automatic Speech Recognition. descript. https://medium.com/descript/a-brief-history-of-asr-automatic-speech-recognition-b8f338d4c0e5
7.
Mattias Lee, [NLP] 주식 뉴스 요약 메일링 프로그램, 2021.03.04.