1. 문제 정의¶
- 문제에 대한 솔루션이 있어야 하고, 명확하고 구체적 일수록 알맞는 자연어 처리 기술을 찾을 수 있음
2. 데이터 수집 및 분석¶
- 다양한 학습 데이터를 수집하기 위해 공개된 데이터셋, 유료 데이터셋, 웹 크롤링 등을 사용하여 수집
- https://paperswithcode.com/datasets?mod=texts&task=question-answering
- 웹크롤링을 통해 데이터를 수집했다면EDA(탐색적 데이터 분석) 및 여러 분석 작업을 통해 데이터를 철저하게 검증해야 함
- 레이블이 필요하다면 수집한 데이터에 레이블을 붙여야 함
3. 데이터 전처리¶
- 학습에 용이하게 데이터를 수정/보완하는 작업
- 자연어 처리 진행 과정에서 데이터가 차지하는 비중이 매우 높기 때문에 데이터를 수집하고 전처리하는 과정이 매우 중요함
- 정제(Cleaning): 갖고 있는 데이터셋으로부터 노이즈 데이터(이상치, 편향 등)를 제거하는 작업
- 정규화(Nomalization): 표현 방법이 다른 데이터들을 통합시켜서 같은 항목으로 합침
- 토큰화(Tokenization): 주어진 데이터셋에서 문장이나 문서들을 토큰이라 불리는 단위로 나누는 작업
3-1. 토큰화(Tokenization)¶
- 토큰의 단위는 자연어 내에서 의미를 가지는 최소 단위로 정의
- 토큰화 작업은 주어진 코퍼스내 자연어 문장들을 토큰이라 불리는 최소 단위로 나누는 작업
- 코퍼스: 자연어 처리 연구나 애플리케이션 활용을 염두에 두고 수집된 텍스트 데이터셋을 의미
3-2. 토큰화 과정의 필요성¶
- 언어 모델의 자연어 이해 능력 향상
- 다양한 자연어를 효율적으로 표현 가능
- 중복을 제거한 대규모 자연어 코퍼스 내 토큰의 집합(단어 사전) 사용
- 적절한 정보량을 내포하면서 전체 단어 사전의 개수가 많아지지 않도록 토큰의 단위를 잘 정의해야 함
- 상황에 따라 다르지만, 일반적인 자연어 처리 작업에서 단어 사전의 규모는 약 10,000 ~ 50,000개 정도로 구성(현대 한글의 글자 수는 11,172개)
3-3. 토큰화 방법¶
- 문장 토큰화: 토큰의 기준을 문장으로 하는 토큰화 방법
- 문장의 끝에 오는 문장 부호를 기준으로 코퍼스를 잘라냄(. 또는 ! 또는 ?)
- 단어 토큰화: 토큰의 기준을 단어로 하는 토큰화 방법
- 보편적으로 구분기호를 가지고 텍스트를 나누게 되며, 기본적으로 공백을 구분자로 사용
- 한국어의 경우 교착어이기 때문에 공백으로 단어 토큰화를 하면 성능이 좋지 않음
- 새로운 단어가 추가될수록 단어 사전의 크기가 계속 증가
- OOV(Out of Vocabulary) 문제 발생
- 문자 토큰화: 토큰의 기준을 문자로 하는 토큰화 방법
- 단어 토큰화의 한계점을 해결하기 위한 방법
- 영어는 26개의 알파벳에 따라 분리, 한국어는 자음 19개와 모음 21개의 글자에 따라 분리
- 문장 하느를 생성하는데 너무 많은 추론이 필요함
- 단어 사전은 작지만 모델의 예측 시간에 문제가 생길 수 있음
- 서브워드 토큰화: 토큰의 기준을 서브워드로 하는 토큰화 방법
- 단어 토큰화와 문자 토큰화의 한계점을 해결하기 위한 방법
- 문자 토큰화의 확장된 버전으로 토큰의 단위를 n개의 문자로 정의하고 해당 기준에 따라 텍스트를 분절하는 방법
- 형태소 분절 기반의 서브워드 토큰화로 확장될 수 있어 한국어에서도 좋은 성능을 가짐
- 서브워드를 만드는 알고리즘 중에서 가장 유명한 것은 BPE
4. 서브워드 토큰화¶
4-1. 서브워드(subword)¶
- 단어보다 더 작은 의미의 단위
- 단어를 여러 서브워드로 분리해서 단어 사전을 구축하겠다는 토큰화 방법
- 신조어에서 주로 발생하는 OOV 문제를 완화
- 예) birthday = birth + day, 아침밥 = 아침 + 밥
4-2. BPE(Byte Pair Encoding)¶
- 코퍼스 내 단어의 등장 빈도에 따라 서브워드를 구축하는데 사용
- 2016년 Neural Machine Translation of Rare Words with Subword Units 논문에서 처음 제안
- 글자 단위에서 점진적으로 서브워드 집합을 만들어내는 Bottom-up 방식의 접근 방식으로 자연어 코퍼스에 있는 모든 단어들을 글자 단위로 분리한 뒤에 등장 빈도에 따라 글자들을 서브워드로 통합하는 방식
4-3. WordPiece Tokenizer¶
- 구글이 2016년도 Google's Neural Machine Translation System: Bridging the Gap between Human and Machine Translation 논문에 처음 공개한 BPE의 변형 알고리즘
- 병합할 두 문자가 있을 때, 각각의 문자가 따로 있을 때가 더 중요한지, 병합 되었을 때가 더 중요한지에 차이점을 둠
- GPT모델과 같은 생성형 모델의 경우에는 BPE 알고리즘을 사용
- BERT, ELECTRA와 같은 자연어 이해 모델에서는 WordPeice Tokenizer를 주로 사용
5. 정제(Clening)¶
- 토큰화 작업에 방해가 되는 부분들을 필터링 하거나 토큰화 작업 이후에도 여전히 남아있는 노이즈들을 제거하기 위해 지속적으로 이뤄지는 전처리 과정
- 어떤 특성이 노이즈인지 판단하거나 모든 노이즈를 완벽하게 제거하는 것은 어렵기 때문에 일종의 합의점을 찾아야함
5-1. 정제 작업의 종류¶
- 불용어(stopword) 처리
- 불용어의 정의는 가변적이기 때문에 추가하고 싶은 불용어가 있다면 직접 정의할 수 있음
- 보편적으로 선택할 수 있는 한국어 불용어 리스트
- 불필요한 태그 및 특수 문자 제거
- 코퍼스 내 등장 빈도가 적은 단어 제거
- 코퍼스 내 단어들의 빈도를 분석하여 분포를 보고 특정 threshold를 설정한 후, 해당 threshold 아래의 단어들을 필터링하는 방식으로 정제
5-2. 정제 과정에서 유의해야할 점¶
- @와 같은 특수 문자는 일반적인 작업에서는 정보량이 적은 토큰일 수 있지만, 이메일과 관련한 내용을 판단해야 하는 작업에서는 유요한 토큰으로 사용될 수 있음
- 자연어 처리 작업에서 데이터를 수집한 이후에는 항상 목적에 맞지 않는 노이즈가 있진 않은지 검사하고 발견한 노이즈를 정제하기 위한 많은 노력이 필요
6. 정규화(Normalization)¶
- 일반적인 ML작업에서 데이터 정규화는 학습 데이터의 값들이 적당한 범위를 유지하도록 데이터의 범위를 변환하거나 스케일링하는 과정
- 정규화 목표는 모든 데이터가 같은 정도의 스케일로 반영되도록 하는 것
- 자연어 처리 정규화의 핵심은 표현 방법이 다른 단어들을 통합시켜서 같은 단어로 만들어주는 과정
6-1. 정규화 작업이 필요한 이유¶
- 이상적으로 단어 사전내의 단어 토큰들이 모두 중요하게 고려되길 원함
- 자연어의 특성 상 의미가 같은데 표기가 다른 단어들이 있을 수 있고, 의미는 같지만 사용 빈도가 낮은 동의어들은 학습에 유용하게 활용되지 않을 수 있음
- 의미가 같지만 표기가 다른 단어들을 통합할 수 있다면, 통합된 단어의 사용 빈도가 높아질 것이고, 빈도가 낮은 단어들의 중요도가 높아질 수 있음
6-2. 정규화 작업의 종류¶
- 어간 추출, 표제어 추출
- 어간 추출: 형태학적 분석을 단순화한 버전으로 정해진 규칙만 보고 단어의 어미를 자르는 어림짐작의 작업
- 표제어 추출: 단어들이 다른 형태를 가지더라도, 그 뿌리 단어를 찾아가서 단어의 개수를 줄일 수 있는지 판단하는 방법
- 대소문자 통합
- 대문자와 소문자가 구분되어야 하는 경우도 있음. 무작정 소문자로 통합해서는 안됨. 예) US(미국), us(우리)
6-3. 정규화 시 유의할 점¶
- 규칙이 너무 엄격한 정규화 방법은 부작용이 심해 학습에 악영향을 줄 수 있음
- 원본 의미를 최대한 유지하는 것이 학습에 도움이 됨
- 대화에서 사용하는 의미가 비슷한 이모티콘들을 통합하는 정규화 작업
- "ㅋㅋㅋㅋ", "ㅋㅋㅋㅋㅋㅋㅋㅋ", "ㅋㅋㅋ" -> "ㅋㅋ"
7. 한국어 데이터 전처리¶
7-1. 한국어의 특성¶
- 영어는 합성어나 줄임말에 대한 예외처리만 한다면 띄어쓰기를 기준으로 하는 토큰화 작업으로도 어느 정도의 성능을 보장할 수 있음
- 한국어에는 조사나 어미가 발달되어 있기 때문에 띄어쓰기만으로 단어를 분리하면 의미적인 훼손이 일어날 수 있음
- 띄어쓰기 단위가 되는 단위를 "어절" 이라고 하는데, 어절 토큰화와 단어 토큰화가 같지 않기 때문
7-2. 형태소 분석¶
- 형태소를 비롯하여, 어근/접두사/접미사/품사 등 다양한 언어적 속성의 구조를 파악하는 것을 의미
- 형태소 분석 과정은 한국어 형태소를 추출하여 분리하는 작업이며, 이후에 필요에 따라 사전 정의된 풍사를 해당 단어에 태깅하는 작업을 하기도 함
- 태깅: 형태소의 뜻과 문맥을 고려하여 단어에 품사를 매핑하는 것
8. 자연어 전처리 실습¶
# 웹 스크레이핑을 통해 뉴스 기사를 수집하고 분석하는데 사용되는 라이브러리
!pip install newspaper3k
Collecting newspaper3k Downloading newspaper3k-0.2.8-py3-none-any.whl (211 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0/211.1 kB ? eta -:--:-- ━━━━━━━━━━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━ 92.2/211.1 kB 2.5 MB/s eta 0:00:01 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 211.1/211.1 kB 3.2 MB/s eta 0:00:00 Requirement already satisfied: beautifulsoup4>=4.4.1 in /usr/local/lib/python3.10/dist-packages (from newspaper3k) (4.12.3) Requirement already satisfied: Pillow>=3.3.0 in /usr/local/lib/python3.10/dist-packages (from newspaper3k) (9.4.0) Requirement already satisfied: PyYAML>=3.11 in /usr/local/lib/python3.10/dist-packages (from newspaper3k) (6.0.1) Collecting cssselect>=0.9.2 (from newspaper3k) Downloading cssselect-1.2.0-py2.py3-none-any.whl (18 kB) Requirement already satisfied: lxml>=3.6.0 in /usr/local/lib/python3.10/dist-packages (from newspaper3k) (4.9.4) Requirement already satisfied: nltk>=3.2.1 in /usr/local/lib/python3.10/dist-packages (from newspaper3k) (3.8.1) Requirement already satisfied: requests>=2.10.0 in /usr/local/lib/python3.10/dist-packages (from newspaper3k) (2.31.0) Collecting feedparser>=5.2.1 (from newspaper3k) Downloading feedparser-6.0.11-py3-none-any.whl (81 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 81.3/81.3 kB 8.1 MB/s eta 0:00:00 Collecting tldextract>=2.0.1 (from newspaper3k) Downloading tldextract-5.1.2-py3-none-any.whl (97 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 97.6/97.6 kB 10.4 MB/s eta 0:00:00 Collecting feedfinder2>=0.0.4 (from newspaper3k) Downloading feedfinder2-0.0.4.tar.gz (3.3 kB) Preparing metadata (setup.py) ... done Collecting jieba3k>=0.35.1 (from newspaper3k) Downloading jieba3k-0.35.1.zip (7.4 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 7.4/7.4 MB 43.2 MB/s eta 0:00:00 Preparing metadata (setup.py) ... done Requirement already satisfied: python-dateutil>=2.5.3 in /usr/local/lib/python3.10/dist-packages (from newspaper3k) (2.8.2) Collecting tinysegmenter==0.3 (from newspaper3k) Downloading tinysegmenter-0.3.tar.gz (16 kB) Preparing metadata (setup.py) ... done Requirement already satisfied: soupsieve>1.2 in /usr/local/lib/python3.10/dist-packages (from beautifulsoup4>=4.4.1->newspaper3k) (2.5) Requirement already satisfied: six in /usr/local/lib/python3.10/dist-packages (from feedfinder2>=0.0.4->newspaper3k) (1.16.0) Collecting sgmllib3k (from feedparser>=5.2.1->newspaper3k) Downloading sgmllib3k-1.0.0.tar.gz (5.8 kB) Preparing metadata (setup.py) ... done Requirement already satisfied: click in /usr/local/lib/python3.10/dist-packages (from nltk>=3.2.1->newspaper3k) (8.1.7) Requirement already satisfied: joblib in /usr/local/lib/python3.10/dist-packages (from nltk>=3.2.1->newspaper3k) (1.4.2) Requirement already satisfied: regex>=2021.8.3 in /usr/local/lib/python3.10/dist-packages (from nltk>=3.2.1->newspaper3k) (2024.5.15) Requirement already satisfied: tqdm in /usr/local/lib/python3.10/dist-packages (from nltk>=3.2.1->newspaper3k) (4.66.4) Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests>=2.10.0->newspaper3k) (3.3.2) Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.10.0->newspaper3k) (3.7) Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests>=2.10.0->newspaper3k) (2.0.7) Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests>=2.10.0->newspaper3k) (2024.6.2) Collecting requests-file>=1.4 (from tldextract>=2.0.1->newspaper3k) Downloading requests_file-2.1.0-py2.py3-none-any.whl (4.2 kB) Requirement already satisfied: filelock>=3.0.8 in /usr/local/lib/python3.10/dist-packages (from tldextract>=2.0.1->newspaper3k) (3.15.3) Building wheels for collected packages: tinysegmenter, feedfinder2, jieba3k, sgmllib3k Building wheel for tinysegmenter (setup.py) ... done Created wheel for tinysegmenter: filename=tinysegmenter-0.3-py3-none-any.whl size=13538 sha256=d37198a25273928d2e52c0c6ea9bb203070cca9a8aa14cce706b101d6a3613b0 Stored in directory: /root/.cache/pip/wheels/c8/d6/6c/384f58df48c00b9a31d638005143b5b3ac62c3d25fb1447f23 Building wheel for feedfinder2 (setup.py) ... done Created wheel for feedfinder2: filename=feedfinder2-0.0.4-py3-none-any.whl size=3340 sha256=ed8a57394588666ea9a79d447d03455551f2518e542b78869549b6b870f60bb6 Stored in directory: /root/.cache/pip/wheels/97/02/e7/a1ff1760e12bdbaab0ac824fae5c1bc933e41c4ccd6a8f8edb Building wheel for jieba3k (setup.py) ... done Created wheel for jieba3k: filename=jieba3k-0.35.1-py3-none-any.whl size=7398382 sha256=b63f5381ee923d8642943408a3cd30ac22145db646a60c13ed7ec7b76a9d52a1 Stored in directory: /root/.cache/pip/wheels/7a/c4/0c/12a9a314ecac499456c4c3b2fcc2f635a3b45a39dfbd240299 Building wheel for sgmllib3k (setup.py) ... done Created wheel for sgmllib3k: filename=sgmllib3k-1.0.0-py3-none-any.whl size=6049 sha256=2c0291efb627224a3d82c5ac226519ca7211a3dc42798e97710c1917452477f7 Stored in directory: /root/.cache/pip/wheels/f0/69/93/a47e9d621be168e9e33c7ce60524393c0b92ae83cf6c6e89c5 Successfully built tinysegmenter feedfinder2 jieba3k sgmllib3k Installing collected packages: tinysegmenter, sgmllib3k, jieba3k, feedparser, cssselect, requests-file, feedfinder2, tldextract, newspaper3k Successfully installed cssselect-1.2.0 feedfinder2-0.0.4 feedparser-6.0.11 jieba3k-0.35.1 newspaper3k-0.2.8 requests-file-2.1.0 sgmllib3k-1.0.0 tinysegmenter-0.3 tldextract-5.1.2
import newspaper
newspaper.languages()
Your available languages are: input code full name pl Polish uk Ukrainian sl Slovenian fr French ar Arabic fi Finnish ja Japanese no Norwegian et Estonian bg Bulgarian ro Romanian ru Russian vi Vietnamese hu Hungarian el Greek da Danish sv Swedish zh Chinese sr Serbian it Italian es Spanish en English nb Norwegian (Bokmål) ko Korean he Hebrew sw Swahili hr Croatian tr Turkish id Indonesian de German fa Persian hi Hindi be Belarusian mk Macedonian nl Dutch pt Portuguese
# 특정 뉴스 기사의 url을 통해 기사를 다운로드하고, 파싱하며,
# 기사의 메타데이트와 본문 내용을 추출
from newspaper import Article
url = 'https://v.daum.net/v/20240624093620484'
article = Article(url, language = 'ko')
article.download()
article.parse()
print('title', article.title)
title 개봉 D-2 '핸섬가이즈', 한국영화 예매율 1위 기염…흥행 청신호
print('content', article.text)
content 6월 26일 개봉하는 고자극 오싹 코미디 '핸섬가이즈'가 개봉을 이틀 앞두고 한국영화 예매율 1위에 올랐다. iMBC 연예뉴스 사진 개봉 전 시사회를 통해 언론과 관객 모두를 사로잡으며 예사롭지 않은 호평을 얻고 있는 영화 '핸섬가이즈'가 관객들의 열띤 기대에 힘입어 개봉을 이틀 앞두고 한국영화 예매율 1위에 등극했다. '핸섬가이즈'는 평화로운 전원생활을 꿈꾸던 ' 재필'과 '상구'가 하필이면 귀신들린 집으로 이사 오며 벌어지는 고자극 오싹 코미디다. 영화진흥위원회 통합전산망에 따르면 '핸섬가이즈' 는 6월 24일 오전 8시 55분 기준 14.0%의 예매율로 한국영화 예매율 1위에 올라 올여름 극장가 최고의 기대작임을 입증했다. 특히 이번 한국영화 예매율 1위는 여름 극장가에 찾아오는 다양한 화제작들 속에서 이뤄낸 유의미한 결과라 더욱 이목을 집중시킨다. 여기에 '인사이드 아웃 2'에 이어 전체 예매율로는 2위를 기록하며 그 뒤를 쫓고 있어 6월 26일(수) 개봉을 통해 시작될 본격적인 흥행 레이스에 더욱 귀추가 주목된다. 영화 '핸섬가이즈' 는 귀신들린 집으로 이사 온 불운의 집주인 '재필'(이성민)과 '상구'(이희준)가 원치 않았던 강제 집들이를 시작하며 멈출 수 없는 웃음을 유발한다. 끝없이 몰려드는 불청객은 사람, 악령 가리지 않아 두 남자가 꿈꾸던 드림하우스에서 펼쳐지는 예측불가한 웃음으로 관객들을 사로잡을 것이다. 이를 완벽한 연기력으로 소화한 이성민, 이희준, 공승연, 박지환, 이규형 등 믿고 보는 배우들의 환상적인 앙상블은 물론 코미디와 호러 두 마리 토끼를 다 잡은 복합 장르가 전하는 독보적인 매력으로 관객들을 극장가로 불러들일 것이다.
additional_info = [
"※ 기자 김사과(apple@apple.com) 취재 반하나(banana@banana.com)",
"<h2>'핸섬가이즈'가 개봉 전 시사회를 통해 언론과 관객 모두를 사로잡으며 예사롭지 않은 호평을 얻고 있다.</h2>",
"이 기사는 임시 데이터임을 알립니다 …",
"Copyright@코리아IT아카데미",
"<br> ☞ 이 기사는 문화 섹션으로 분류되었습니다 … </br>",
"#기사 #문화 #핸섬가이즈 #시사회",
]
context = article.text.split('\n\n')
context += additional_info
context
["6월 26일 개봉하는 고자극 오싹 코미디 '핸섬가이즈'가 개봉을 이틀 앞두고 한국영화 예매율 1위에 올랐다.", 'iMBC 연예뉴스 사진', "개봉 전 시사회를 통해 언론과 관객 모두를 사로잡으며 예사롭지 않은 호평을 얻고 있는 영화 '핸섬가이즈'가 관객들의 열띤 기대에 힘입어 개봉을 이틀 앞두고 한국영화 예매율 1위에 등극했다. '핸섬가이즈'는 평화로운 전원생활을 꿈꾸던 ' 재필'과 '상구'가 하필이면 귀신들린 집으로 이사 오며 벌어지는 고자극 오싹 코미디다.", "영화진흥위원회 통합전산망에 따르면 '핸섬가이즈' 는 6월 24일 오전 8시 55분 기준 14.0%의 예매율로 한국영화 예매율 1위에 올라 올여름 극장가 최고의 기대작임을 입증했다. 특히 이번 한국영화 예매율 1위는 여름 극장가에 찾아오는 다양한 화제작들 속에서 이뤄낸 유의미한 결과라 더욱 이목을 집중시킨다. 여기에 '인사이드 아웃 2'에 이어 전체 예매율로는 2위를 기록하며 그 뒤를 쫓고 있어 6월 26일(수) 개봉을 통해 시작될 본격적인 흥행 레이스에 더욱 귀추가 주목된다.", "영화 '핸섬가이즈' 는 귀신들린 집으로 이사 온 불운의 집주인 '재필'(이성민)과 '상구'(이희준)가 원치 않았던 강제 집들이를 시작하며 멈출 수 없는 웃음을 유발한다. 끝없이 몰려드는 불청객은 사람, 악령 가리지 않아 두 남자가 꿈꾸던 드림하우스에서 펼쳐지는 예측불가한 웃음으로 관객들을 사로잡을 것이다. 이를 완벽한 연기력으로 소화한 이성민, 이희준, 공승연, 박지환, 이규형 등 믿고 보는 배우들의 환상적인 앙상블은 물론 코미디와 호러 두 마리 토끼를 다 잡은 복합 장르가 전하는 독보적인 매력으로 관객들을 극장가로 불러들일 것이다.", '※ 기자 김사과(apple@apple.com) 취재 반하나(banana@banana.com)', "<h2>'핸섬가이즈'가 개봉 전 시사회를 통해 언론과 관객 모두를 사로잡으며 예사롭지 않은 호평을 얻고 있다.</h2>", '이 기사는 임시 데이터임을 알립니다 …', 'Copyright@코리아IT아카데미', '<br> ☞ 이 기사는 문화 섹션으로 분류되었습니다 … </br>', '#기사 #문화 #핸섬가이즈 #시사회']
for i, text in enumerate(context):
print(i, text)
0 6월 26일 개봉하는 고자극 오싹 코미디 '핸섬가이즈'가 개봉을 이틀 앞두고 한국영화 예매율 1위에 올랐다. 1 iMBC 연예뉴스 사진 2 개봉 전 시사회를 통해 언론과 관객 모두를 사로잡으며 예사롭지 않은 호평을 얻고 있는 영화 '핸섬가이즈'가 관객들의 열띤 기대에 힘입어 개봉을 이틀 앞두고 한국영화 예매율 1위에 등극했다. '핸섬가이즈'는 평화로운 전원생활을 꿈꾸던 ' 재필'과 '상구'가 하필이면 귀신들린 집으로 이사 오며 벌어지는 고자극 오싹 코미디다. 3 영화진흥위원회 통합전산망에 따르면 '핸섬가이즈' 는 6월 24일 오전 8시 55분 기준 14.0%의 예매율로 한국영화 예매율 1위에 올라 올여름 극장가 최고의 기대작임을 입증했다. 특히 이번 한국영화 예매율 1위는 여름 극장가에 찾아오는 다양한 화제작들 속에서 이뤄낸 유의미한 결과라 더욱 이목을 집중시킨다. 여기에 '인사이드 아웃 2'에 이어 전체 예매율로는 2위를 기록하며 그 뒤를 쫓고 있어 6월 26일(수) 개봉을 통해 시작될 본격적인 흥행 레이스에 더욱 귀추가 주목된다. 4 영화 '핸섬가이즈' 는 귀신들린 집으로 이사 온 불운의 집주인 '재필'(이성민)과 '상구'(이희준)가 원치 않았던 강제 집들이를 시작하며 멈출 수 없는 웃음을 유발한다. 끝없이 몰려드는 불청객은 사람, 악령 가리지 않아 두 남자가 꿈꾸던 드림하우스에서 펼쳐지는 예측불가한 웃음으로 관객들을 사로잡을 것이다. 이를 완벽한 연기력으로 소화한 이성민, 이희준, 공승연, 박지환, 이규형 등 믿고 보는 배우들의 환상적인 앙상블은 물론 코미디와 호러 두 마리 토끼를 다 잡은 복합 장르가 전하는 독보적인 매력으로 관객들을 극장가로 불러들일 것이다. 5 ※ 기자 김사과(apple@apple.com) 취재 반하나(banana@banana.com) 6 <h2>'핸섬가이즈'가 개봉 전 시사회를 통해 언론과 관객 모두를 사로잡으며 예사롭지 않은 호평을 얻고 있다.</h2> 7 이 기사는 임시 데이터임을 알립니다 … 8 Copyright@코리아IT아카데미 9 <br> ☞ 이 기사는 문화 섹션으로 분류되었습니다 … </br> 10 #기사 #문화 #핸섬가이즈 #시사회
# 불용어 제거하기
# 불용어 사전 정의 ['※', '☞', '…', '오싹']
# delete_stopwords(): context 데이터를 넣으면 불용어를 제거 후 리스트(데이터)를 반환
def delete_stopwords(context, stopwords):
preprocessed_text = []
for text in context:
text = [w for w in text.split(' ') if w not in stopwords]
preprocessed_text.append(' '.join(text))
return preprocessed_text
stopwords = ['※', '☞', '…', '오싹']
preprocessed_context = delete_stopwords(context, stopwords)
preprocessed_context
["6월 26일 개봉하는 고자극 코미디 '핸섬가이즈'가 개봉을 이틀 앞두고 한국영화 예매율 1위에 올랐다.", 'iMBC 연예뉴스 사진', "개봉 전 시사회를 통해 언론과 관객 모두를 사로잡으며 예사롭지 않은 호평을 얻고 있는 영화 '핸섬가이즈'가 관객들의 열띤 기대에 힘입어 개봉을 이틀 앞두고 한국영화 예매율 1위에 등극했다. '핸섬가이즈'는 평화로운 전원생활을 꿈꾸던 ' 재필'과 '상구'가 하필이면 귀신들린 집으로 이사 오며 벌어지는 고자극 코미디다.", "영화진흥위원회 통합전산망에 따르면 '핸섬가이즈' 는 6월 24일 오전 8시 55분 기준 14.0%의 예매율로 한국영화 예매율 1위에 올라 올여름 극장가 최고의 기대작임을 입증했다. 특히 이번 한국영화 예매율 1위는 여름 극장가에 찾아오는 다양한 화제작들 속에서 이뤄낸 유의미한 결과라 더욱 이목을 집중시킨다. 여기에 '인사이드 아웃 2'에 이어 전체 예매율로는 2위를 기록하며 그 뒤를 쫓고 있어 6월 26일(수) 개봉을 통해 시작될 본격적인 흥행 레이스에 더욱 귀추가 주목된다.", "영화 '핸섬가이즈' 는 귀신들린 집으로 이사 온 불운의 집주인 '재필'(이성민)과 '상구'(이희준)가 원치 않았던 강제 집들이를 시작하며 멈출 수 없는 웃음을 유발한다. 끝없이 몰려드는 불청객은 사람, 악령 가리지 않아 두 남자가 꿈꾸던 드림하우스에서 펼쳐지는 예측불가한 웃음으로 관객들을 사로잡을 것이다. 이를 완벽한 연기력으로 소화한 이성민, 이희준, 공승연, 박지환, 이규형 등 믿고 보는 배우들의 환상적인 앙상블은 물론 코미디와 호러 두 마리 토끼를 다 잡은 복합 장르가 전하는 독보적인 매력으로 관객들을 극장가로 불러들일 것이다.", '기자 김사과(apple@apple.com) 취재 반하나(banana@banana.com)', "<h2>'핸섬가이즈'가 개봉 전 시사회를 통해 언론과 관객 모두를 사로잡으며 예사롭지 않은 호평을 얻고 있다.</h2>", '이 기사는 임시 데이터임을 알립니다', 'Copyright@코리아IT아카데미', '<br> 이 기사는 문화 섹션으로 분류되었습니다 </br>', '#기사 #문화 #핸섬가이즈 #시사회']
# 이메일 제거
# delete_emale(): context 데이터를 넣으면 이메일 제거 후 리스트(데이터)를 반환
import re
def delete_email(context):
preprocessed_text = []
for text in context:
text = re.sub('\(+[\w\.-]+@[\w\.-]+\)+', '', text)
preprocessed_text.append(text)
return preprocessed_text
preprocessed_context = delete_email(preprocessed_context)
preprocessed_context
["6월 26일 개봉하는 고자극 코미디 '핸섬가이즈'가 개봉을 이틀 앞두고 한국영화 예매율 1위에 올랐다.", 'iMBC 연예뉴스 사진', "개봉 전 시사회를 통해 언론과 관객 모두를 사로잡으며 예사롭지 않은 호평을 얻고 있는 영화 '핸섬가이즈'가 관객들의 열띤 기대에 힘입어 개봉을 이틀 앞두고 한국영화 예매율 1위에 등극했다. '핸섬가이즈'는 평화로운 전원생활을 꿈꾸던 ' 재필'과 '상구'가 하필이면 귀신들린 집으로 이사 오며 벌어지는 고자극 코미디다.", "영화진흥위원회 통합전산망에 따르면 '핸섬가이즈' 는 6월 24일 오전 8시 55분 기준 14.0%의 예매율로 한국영화 예매율 1위에 올라 올여름 극장가 최고의 기대작임을 입증했다. 특히 이번 한국영화 예매율 1위는 여름 극장가에 찾아오는 다양한 화제작들 속에서 이뤄낸 유의미한 결과라 더욱 이목을 집중시킨다. 여기에 '인사이드 아웃 2'에 이어 전체 예매율로는 2위를 기록하며 그 뒤를 쫓고 있어 6월 26일(수) 개봉을 통해 시작될 본격적인 흥행 레이스에 더욱 귀추가 주목된다.", "영화 '핸섬가이즈' 는 귀신들린 집으로 이사 온 불운의 집주인 '재필'(이성민)과 '상구'(이희준)가 원치 않았던 강제 집들이를 시작하며 멈출 수 없는 웃음을 유발한다. 끝없이 몰려드는 불청객은 사람, 악령 가리지 않아 두 남자가 꿈꾸던 드림하우스에서 펼쳐지는 예측불가한 웃음으로 관객들을 사로잡을 것이다. 이를 완벽한 연기력으로 소화한 이성민, 이희준, 공승연, 박지환, 이규형 등 믿고 보는 배우들의 환상적인 앙상블은 물론 코미디와 호러 두 마리 토끼를 다 잡은 복합 장르가 전하는 독보적인 매력으로 관객들을 극장가로 불러들일 것이다.", '기자 김사과 취재 반하나', "<h2>'핸섬가이즈'가 개봉 전 시사회를 통해 언론과 관객 모두를 사로잡으며 예사롭지 않은 호평을 얻고 있다.</h2>", '이 기사는 임시 데이터임을 알립니다', 'Copyright@코리아IT아카데미', '<br> 이 기사는 문화 섹션으로 분류되었습니다 </br>', '#기사 #문화 #핸섬가이즈 #시사회']
# HTML 태그 제거
# delete_html_tag(): context 데이터를 넣으면 HTML 제거 후 리스트(데이터)를 반환
def delete_html_tag(context):
preprocessed_text = []
# < 태그의 시작을 나타내는 문자를 찾음
# .*? 다음에 오는 패턴과 매칭되지 않을 때까지 최소한의 문자를 포함
# '.': 줄 바꿈 문자를 제외한 모든 문자
# '*?': 0번 이상 가능한 적게를 의미
html_tag = re.compile('<.*?>')
for text in context:
text = re.sub(html_tag, '', text).strip()
if text:
preprocessed_text.append(text)
return preprocessed_text
preprocessed_context = delete_html_tag(preprocessed_context)
preprocessed_context
["6월 26일 개봉하는 고자극 코미디 '핸섬가이즈'가 개봉을 이틀 앞두고 한국영화 예매율 1위에 올랐다.", 'iMBC 연예뉴스 사진', "개봉 전 시사회를 통해 언론과 관객 모두를 사로잡으며 예사롭지 않은 호평을 얻고 있는 영화 '핸섬가이즈'가 관객들의 열띤 기대에 힘입어 개봉을 이틀 앞두고 한국영화 예매율 1위에 등극했다. '핸섬가이즈'는 평화로운 전원생활을 꿈꾸던 ' 재필'과 '상구'가 하필이면 귀신들린 집으로 이사 오며 벌어지는 고자극 코미디다.", "영화진흥위원회 통합전산망에 따르면 '핸섬가이즈' 는 6월 24일 오전 8시 55분 기준 14.0%의 예매율로 한국영화 예매율 1위에 올라 올여름 극장가 최고의 기대작임을 입증했다. 특히 이번 한국영화 예매율 1위는 여름 극장가에 찾아오는 다양한 화제작들 속에서 이뤄낸 유의미한 결과라 더욱 이목을 집중시킨다. 여기에 '인사이드 아웃 2'에 이어 전체 예매율로는 2위를 기록하며 그 뒤를 쫓고 있어 6월 26일(수) 개봉을 통해 시작될 본격적인 흥행 레이스에 더욱 귀추가 주목된다.", "영화 '핸섬가이즈' 는 귀신들린 집으로 이사 온 불운의 집주인 '재필'(이성민)과 '상구'(이희준)가 원치 않았던 강제 집들이를 시작하며 멈출 수 없는 웃음을 유발한다. 끝없이 몰려드는 불청객은 사람, 악령 가리지 않아 두 남자가 꿈꾸던 드림하우스에서 펼쳐지는 예측불가한 웃음으로 관객들을 사로잡을 것이다. 이를 완벽한 연기력으로 소화한 이성민, 이희준, 공승연, 박지환, 이규형 등 믿고 보는 배우들의 환상적인 앙상블은 물론 코미디와 호러 두 마리 토끼를 다 잡은 복합 장르가 전하는 독보적인 매력으로 관객들을 극장가로 불러들일 것이다.", '기자 김사과 취재 반하나', "'핸섬가이즈'가 개봉 전 시사회를 통해 언론과 관객 모두를 사로잡으며 예사롭지 않은 호평을 얻고 있다.", '이 기사는 임시 데이터임을 알립니다', 'Copyright@코리아IT아카데미', '이 기사는 문화 섹션으로 분류되었습니다', '#기사 #문화 #핸섬가이즈 #시사회']
<.?>:비탐욕 <.>: 탐욕
안녕하세요
김사과
입니다.반갑습니다.
# 해시태그 제거
# delete_hashtag(): context 데이터를 넣으면 해시태그 제거 후 리스트(데이터)를 반환
def delete_hashtag(context):
preprocessed_text = []
for text in context:
text = re.sub('#\S+', '', text).strip()
if text:
preprocessed_text.append(text)
return preprocessed_text
preprocessed_context = delete_hashtag(preprocessed_context)
preprocessed_context
["6월 26일 개봉하는 고자극 코미디 '핸섬가이즈'가 개봉을 이틀 앞두고 한국영화 예매율 1위에 올랐다.", 'iMBC 연예뉴스 사진', "개봉 전 시사회를 통해 언론과 관객 모두를 사로잡으며 예사롭지 않은 호평을 얻고 있는 영화 '핸섬가이즈'가 관객들의 열띤 기대에 힘입어 개봉을 이틀 앞두고 한국영화 예매율 1위에 등극했다. '핸섬가이즈'는 평화로운 전원생활을 꿈꾸던 ' 재필'과 '상구'가 하필이면 귀신들린 집으로 이사 오며 벌어지는 고자극 코미디다.", "영화진흥위원회 통합전산망에 따르면 '핸섬가이즈' 는 6월 24일 오전 8시 55분 기준 14.0%의 예매율로 한국영화 예매율 1위에 올라 올여름 극장가 최고의 기대작임을 입증했다. 특히 이번 한국영화 예매율 1위는 여름 극장가에 찾아오는 다양한 화제작들 속에서 이뤄낸 유의미한 결과라 더욱 이목을 집중시킨다. 여기에 '인사이드 아웃 2'에 이어 전체 예매율로는 2위를 기록하며 그 뒤를 쫓고 있어 6월 26일(수) 개봉을 통해 시작될 본격적인 흥행 레이스에 더욱 귀추가 주목된다.", "영화 '핸섬가이즈' 는 귀신들린 집으로 이사 온 불운의 집주인 '재필'(이성민)과 '상구'(이희준)가 원치 않았던 강제 집들이를 시작하며 멈출 수 없는 웃음을 유발한다. 끝없이 몰려드는 불청객은 사람, 악령 가리지 않아 두 남자가 꿈꾸던 드림하우스에서 펼쳐지는 예측불가한 웃음으로 관객들을 사로잡을 것이다. 이를 완벽한 연기력으로 소화한 이성민, 이희준, 공승연, 박지환, 이규형 등 믿고 보는 배우들의 환상적인 앙상블은 물론 코미디와 호러 두 마리 토끼를 다 잡은 복합 장르가 전하는 독보적인 매력으로 관객들을 극장가로 불러들일 것이다.", '기자 김사과 취재 반하나', "'핸섬가이즈'가 개봉 전 시사회를 통해 언론과 관객 모두를 사로잡으며 예사롭지 않은 호평을 얻고 있다.", '이 기사는 임시 데이터임을 알립니다', 'Copyright@코리아IT아카데미', '이 기사는 문화 섹션으로 분류되었습니다']
# 문장 분리
# 학습 데이터를 구성할 때 입력 데이터의 단위를 설정하기 애매해질 수 있으므로
# 문장 단위로 모델이 학습할 수 있도록 문장 분리가 필요
# 한국어 문장 분리기 중 kss 라이브러리를 사용
!pip install kss
Collecting kss Downloading kss-6.0.4.tar.gz (1.1 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.1/1.1 MB 11.3 MB/s eta 0:00:00 Preparing metadata (setup.py) ... done Collecting emoji==1.2.0 (from kss) Downloading emoji-1.2.0-py3-none-any.whl (131 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 131.3/131.3 kB 16.0 MB/s eta 0:00:00 Collecting pecab (from kss) Downloading pecab-1.0.8.tar.gz (26.4 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 26.4/26.4 MB 53.5 MB/s eta 0:00:00 Preparing metadata (setup.py) ... done Requirement already satisfied: networkx in /usr/local/lib/python3.10/dist-packages (from kss) (3.3) Collecting jamo (from kss) Downloading jamo-0.4.1-py3-none-any.whl (9.5 kB) Collecting hangul-jamo (from kss) Downloading hangul_jamo-1.0.1-py3-none-any.whl (4.4 kB) Collecting tossi (from kss) Downloading tossi-0.3.1.tar.gz (11 kB) Preparing metadata (setup.py) ... done Collecting distance (from kss) Downloading Distance-0.1.3.tar.gz (180 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 180.3/180.3 kB 21.0 MB/s eta 0:00:00 Preparing metadata (setup.py) ... done Collecting pyyaml==6.0 (from kss) Downloading PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (682 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 682.2/682.2 kB 51.3 MB/s eta 0:00:00 Collecting unidecode (from kss) Downloading Unidecode-1.3.8-py3-none-any.whl (235 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 235.5/235.5 kB 25.0 MB/s eta 0:00:00 Collecting cmudict (from kss) Downloading cmudict-1.0.24-py3-none-any.whl (939 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 939.4/939.4 kB 55.1 MB/s eta 0:00:00 Collecting koparadigm (from kss) Downloading koparadigm-0.10.0-py3-none-any.whl (1.6 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.6/1.6 MB 64.6 MB/s eta 0:00:00 Collecting kollocate (from kss) Downloading kollocate-0.0.2-py3-none-any.whl (72.2 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 72.2/72.2 MB 8.6 MB/s eta 0:00:00 Collecting bs4 (from kss) Downloading bs4-0.0.2-py2.py3-none-any.whl (1.2 kB) Requirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (from kss) (1.25.2) Requirement already satisfied: pytest in /usr/local/lib/python3.10/dist-packages (from kss) (7.4.4) Requirement already satisfied: scipy in /usr/local/lib/python3.10/dist-packages (from kss) (1.11.4) Requirement already satisfied: beautifulsoup4 in /usr/local/lib/python3.10/dist-packages (from bs4->kss) (4.12.3) Requirement already satisfied: importlib-metadata>=5 in /usr/local/lib/python3.10/dist-packages (from cmudict->kss) (7.2.0) Requirement already satisfied: importlib-resources>=5 in /usr/local/lib/python3.10/dist-packages (from cmudict->kss) (6.4.0) Collecting whoosh (from kollocate->kss) Downloading Whoosh-2.7.4-py2.py3-none-any.whl (468 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 468.8/468.8 kB 24.8 MB/s eta 0:00:00 Collecting xlrd==1.2.0 (from koparadigm->kss) Downloading xlrd-1.2.0-py2.py3-none-any.whl (103 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 103.3/103.3 kB 12.5 MB/s eta 0:00:00 Requirement already satisfied: pyarrow in /usr/local/lib/python3.10/dist-packages (from pecab->kss) (14.0.2) Requirement already satisfied: regex in /usr/local/lib/python3.10/dist-packages (from pecab->kss) (2024.5.15) Requirement already satisfied: iniconfig in /usr/local/lib/python3.10/dist-packages (from pytest->kss) (2.0.0) Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from pytest->kss) (24.1) Requirement already satisfied: pluggy<2.0,>=0.12 in /usr/local/lib/python3.10/dist-packages (from pytest->kss) (1.5.0) Requirement already satisfied: exceptiongroup>=1.0.0rc8 in /usr/local/lib/python3.10/dist-packages (from pytest->kss) (1.2.1) Requirement already satisfied: tomli>=1.0.0 in /usr/local/lib/python3.10/dist-packages (from pytest->kss) (2.0.1) Requirement already satisfied: bidict in /usr/local/lib/python3.10/dist-packages (from tossi->kss) (0.23.1) Requirement already satisfied: six in /usr/local/lib/python3.10/dist-packages (from tossi->kss) (1.16.0) Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.10/dist-packages (from importlib-metadata>=5->cmudict->kss) (3.19.2) Requirement already satisfied: soupsieve>1.2 in /usr/local/lib/python3.10/dist-packages (from beautifulsoup4->bs4->kss) (2.5) Building wheels for collected packages: kss, distance, pecab, tossi Building wheel for kss (setup.py) ... done Created wheel for kss: filename=kss-6.0.4-cp310-cp310-linux_x86_64.whl size=1446490 sha256=3c294037ae9692a5181539ad1f5d975a5b051cdcfad0dddd32e077d9599da04c Stored in directory: /root/.cache/pip/wheels/dd/70/d5/c9308346829b1eb9e7267d74696919d2453aee6ce350f98b3b Building wheel for distance (setup.py) ... done Created wheel for distance: filename=Distance-0.1.3-py3-none-any.whl size=16258 sha256=03622a5ee35299928717258259659e1ca7b57536c4dc9e5ec32d7940ea771599 Stored in directory: /root/.cache/pip/wheels/e8/bb/de/f71bf63559ea9a921059a5405806f7ff6ed612a9231c4a9309 Building wheel for pecab (setup.py) ... done Created wheel for pecab: filename=pecab-1.0.8-py3-none-any.whl size=26646664 sha256=0c54ce63a9e228dd12d5bc447f805d7deea21eeef07d37f76f7eeb4c44b25e65 Stored in directory: /root/.cache/pip/wheels/5c/6f/b4/ab61b8863d7d8b1409def8ae31adcaa089fa91b8d022ec309d Building wheel for tossi (setup.py) ... done Created wheel for tossi: filename=tossi-0.3.1-py3-none-any.whl size=12130 sha256=446789f5bc9a13ca4cb65c7fef14307215f68101957b4d1a61e5cc499a025091 Stored in directory: /root/.cache/pip/wheels/a7/18/60/1094a6fe93c8063efcd3e6700d09328216682e495a3c51af9f Successfully built kss distance pecab tossi Installing collected packages: whoosh, jamo, hangul-jamo, emoji, distance, xlrd, unidecode, tossi, pyyaml, kollocate, pecab, koparadigm, cmudict, bs4, kss Attempting uninstall: xlrd Found existing installation: xlrd 2.0.1 Uninstalling xlrd-2.0.1: Successfully uninstalled xlrd-2.0.1 Attempting uninstall: pyyaml Found existing installation: PyYAML 6.0.1 Uninstalling PyYAML-6.0.1: Successfully uninstalled PyYAML-6.0.1 Successfully installed bs4-0.0.2 cmudict-1.0.24 distance-0.1.3 emoji-1.2.0 hangul-jamo-1.0.1 jamo-0.4.1 kollocate-0.0.2 koparadigm-0.10.0 kss-6.0.4 pecab-1.0.8 pyyaml-6.0 tossi-0.3.1 unidecode-1.3.8 whoosh-2.7.4 xlrd-1.2.0
import kss
def sentence_seperator(context):
splited_context = []
for text in context:
text = text.strip()
if text:
splited_text = kss.split_sentences(text)
splited_context.extend(splited_text)
return splited_context
preprocessed_context = sentence_seperator(preprocessed_context)
preprocessed_context
WARNING:root:Oh! You have mecab in your environment. Kss will take this as a backend! :D
["6월 26일 개봉하는 고자극 코미디 '핸섬가이즈'가 개봉을 이틀 앞두고 한국영화 예매율 1위에 올랐다.", 'iMBC 연예뉴스 사진', "개봉 전 시사회를 통해 언론과 관객 모두를 사로잡으며 예사롭지 않은 호평을 얻고 있는 영화 '핸섬가이즈'가 관객들의 열띤 기대에 힘입어 개봉을 이틀 앞두고 한국영화 예매율 1위에 등극했다.", "'핸섬가이즈'는 평화로운 전원생활을 꿈꾸던 ' 재필'과 '상구'가 하필이면 귀신들린 집으로 이사 오며 벌어지는 고자극 코미디다.", "영화진흥위원회 통합전산망에 따르면 '핸섬가이즈' 는 6월 24일 오전 8시 55분 기준 14.0%의 예매율로 한국영화 예매율 1위에 올라 올여름 극장가 최고의 기대작임을 입증했다.", '특히 이번 한국영화 예매율 1위는 여름 극장가에 찾아오는 다양한 화제작들 속에서 이뤄낸 유의미한 결과라 더욱 이목을 집중시킨다.', "여기에 '인사이드 아웃 2'에 이어 전체 예매율로는 2위를 기록하며 그 뒤를 쫓고 있어 6월 26일(수) 개봉을 통해 시작될 본격적인 흥행 레이스에 더욱 귀추가 주목된다.", "영화 '핸섬가이즈' 는 귀신들린 집으로 이사 온 불운의 집주인 '재필'(이성민)과 '상구'(이희준)가 원치 않았던 강제 집들이를 시작하며 멈출 수 없는 웃음을 유발한다.", '끝없이 몰려드는 불청객은 사람, 악령 가리지 않아 두 남자가 꿈꾸던 드림하우스에서 펼쳐지는 예측불가한 웃음으로 관객들을 사로잡을 것이다.', '이를 완벽한 연기력으로 소화한 이성민, 이희준, 공승연, 박지환, 이규형 등 믿고 보는 배우들의 환상적인 앙상블은 물론 코미디와 호러 두 마리 토끼를 다 잡은 복합 장르가 전하는 독보적인 매력으로 관객들을 극장가로 불러들일 것이다.', '기자 김사과 취재 반하나', "'핸섬가이즈'가 개봉 전 시사회를 통해 언론과 관객 모두를 사로잡으며 예사롭지 않은 호평을 얻고 있다.", '이 기사는 임시 데이터임을 알립니다', 'Copyright@코리아IT아카데미', '이 기사는 문화 섹션으로 분류되었습니다']
# 반복 횟수가 많은 문자 정규화
!pip install soynlp
Collecting soynlp Downloading soynlp-0.0.493-py3-none-any.whl (416 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 416.8/416.8 kB 4.3 MB/s eta 0:00:00 Requirement already satisfied: numpy>=1.12.1 in /usr/local/lib/python3.10/dist-packages (from soynlp) (1.25.2) Requirement already satisfied: psutil>=5.0.1 in /usr/local/lib/python3.10/dist-packages (from soynlp) (5.9.5) Requirement already satisfied: scipy>=1.1.0 in /usr/local/lib/python3.10/dist-packages (from soynlp) (1.11.4) Requirement already satisfied: scikit-learn>=0.20.0 in /usr/local/lib/python3.10/dist-packages (from soynlp) (1.2.2) Requirement already satisfied: joblib>=1.1.1 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=0.20.0->soynlp) (1.4.2) Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=0.20.0->soynlp) (3.5.0) Installing collected packages: soynlp Successfully installed soynlp-0.0.493
from soynlp.normalizer import *
repeat_normalize('ㅋㅋㅋㅋㅋㅋㅋㅋㅋ', num_repeats=2)
'ㅋㅋ'
repeat_normalize('야야!!!! 너!!!! 하하하하하.. 지금 뭐하냐? ㅠㅠㅠㅠ', num_repeats=2)
'야야!!!! 너!!!! 하하.. 지금 뭐하냐? ㅠㅠ'
# 중복 문장 정규화
from collections import OrderedDict
def duplicated_sentence_normalizer(context):
context = list(OrderedDict.fromkeys(context))
return context
temp = ['apple', 'banana', 'apple', 'orange', 'banana', 'melon']
temp = duplicated_sentence_normalizer(temp)
for i, text in enumerate(temp):
print(i, text)
0 apple 1 banana 2 orange 3 melon
# 문장 길이 기반 필터링
# min_max_filter(min_len, max_len, context): min_len 보다 길고, max_len 보다
# 짧은 문장만 필터링하여 저장
def min_max_filter(min_len, max_len, context):
preprocessed_text = []
for text in context:
if min_len < len(text) and len(text) < max_len:
preprocessed_text.append(text)
return preprocessed_text
preprocessed_context = min_max_filter(20, 200, preprocessed_context)
for i, text in enumerate(preprocessed_context):
print(i, text)
0 6월 26일 개봉하는 고자극 코미디 '핸섬가이즈'가 개봉을 이틀 앞두고 한국영화 예매율 1위에 올랐다. 1 개봉 전 시사회를 통해 언론과 관객 모두를 사로잡으며 예사롭지 않은 호평을 얻고 있는 영화 '핸섬가이즈'가 관객들의 열띤 기대에 힘입어 개봉을 이틀 앞두고 한국영화 예매율 1위에 등극했다. 2 '핸섬가이즈'는 평화로운 전원생활을 꿈꾸던 ' 재필'과 '상구'가 하필이면 귀신들린 집으로 이사 오며 벌어지는 고자극 코미디다. 3 영화진흥위원회 통합전산망에 따르면 '핸섬가이즈' 는 6월 24일 오전 8시 55분 기준 14.0%의 예매율로 한국영화 예매율 1위에 올라 올여름 극장가 최고의 기대작임을 입증했다. 4 특히 이번 한국영화 예매율 1위는 여름 극장가에 찾아오는 다양한 화제작들 속에서 이뤄낸 유의미한 결과라 더욱 이목을 집중시킨다. 5 여기에 '인사이드 아웃 2'에 이어 전체 예매율로는 2위를 기록하며 그 뒤를 쫓고 있어 6월 26일(수) 개봉을 통해 시작될 본격적인 흥행 레이스에 더욱 귀추가 주목된다. 6 영화 '핸섬가이즈' 는 귀신들린 집으로 이사 온 불운의 집주인 '재필'(이성민)과 '상구'(이희준)가 원치 않았던 강제 집들이를 시작하며 멈출 수 없는 웃음을 유발한다. 7 끝없이 몰려드는 불청객은 사람, 악령 가리지 않아 두 남자가 꿈꾸던 드림하우스에서 펼쳐지는 예측불가한 웃음으로 관객들을 사로잡을 것이다. 8 이를 완벽한 연기력으로 소화한 이성민, 이희준, 공승연, 박지환, 이규형 등 믿고 보는 배우들의 환상적인 앙상블은 물론 코미디와 호러 두 마리 토끼를 다 잡은 복합 장르가 전하는 독보적인 매력으로 관객들을 극장가로 불러들일 것이다. 9 '핸섬가이즈'가 개봉 전 시사회를 통해 언론과 관객 모두를 사로잡으며 예사롭지 않은 호평을 얻고 있다. 10 이 기사는 문화 섹션으로 분류되었습니다
# 토큰화
from tensorflow.keras.preprocessing.text import Tokenizer
tokenizer = Tokenizer()
tokenizer.fit_on_texts(preprocessed_context)
word2idx = tokenizer.word_index
word2idx
{'한국영화': 1, '예매율': 2, '6월': 3, "'핸섬가이즈'가": 4, '개봉을': 5, '1위에': 6, '통해': 7, '26일': 8, '고자극': 9, '이틀': 10, '앞두고': 11, '개봉': 12, '전': 13, '시사회를': 14, '언론과': 15, '관객': 16, '모두를': 17, '사로잡으며': 18, '예사롭지': 19, '않은': 20, '호평을': 21, '얻고': 22, '영화': 23, '꿈꾸던': 24, '귀신들린': 25, '집으로': 26, '이사': 27, "'핸섬가이즈'": 28, '는': 29, '더욱': 30, '수': 31, '이성민': 32, '이희준': 33, '두': 34, '관객들을': 35, '것이다': 36, '개봉하는': 37, '코미디': 38, '올랐다': 39, '있는': 40, '관객들의': 41, '열띤': 42, '기대에': 43, '힘입어': 44, '등극했다': 45, "'핸섬가이즈'는": 46, '평화로운': 47, '전원생활을': 48, "'": 49, "재필'과": 50, "'상구'가": 51, '하필이면': 52, '오며': 53, '벌어지는': 54, '코미디다': 55, '영화진흥위원회': 56, '통합전산망에': 57, '따르면': 58, '24일': 59, '오전': 60, '8시': 61, '55분': 62, '기준': 63, '14': 64, '0': 65, '의': 66, '예매율로': 67, '올라': 68, '올여름': 69, '극장가': 70, '최고의': 71, '기대작임을': 72, '입증했다': 73, '특히': 74, '이번': 75, '1위는': 76, '여름': 77, '극장가에': 78, '찾아오는': 79, '다양한': 80, '화제작들': 81, '속에서': 82, '이뤄낸': 83, '유의미한': 84, '결과라': 85, '이목을': 86, '집중시킨다': 87, '여기에': 88, "'인사이드": 89, '아웃': 90, "2'에": 91, '이어': 92, '전체': 93, '예매율로는': 94, '2위를': 95, '기록하며': 96, '그': 97, '뒤를': 98, '쫓고': 99, '있어': 100, '시작될': 101, '본격적인': 102, '흥행': 103, '레이스에': 104, '귀추가': 105, '주목된다': 106, '온': 107, '불운의': 108, '집주인': 109, "'재필'": 110, '과': 111, "'상구'": 112, '가': 113, '원치': 114, '않았던': 115, '강제': 116, '집들이를': 117, '시작하며': 118, '멈출': 119, '없는': 120, '웃음을': 121, '유발한다': 122, '끝없이': 123, '몰려드는': 124, '불청객은': 125, '사람': 126, '악령': 127, '가리지': 128, '않아': 129, '남자가': 130, '드림하우스에서': 131, '펼쳐지는': 132, '예측불가한': 133, '웃음으로': 134, '사로잡을': 135, '이를': 136, '완벽한': 137, '연기력으로': 138, '소화한': 139, '공승연': 140, '박지환': 141, '이규형': 142, '등': 143, '믿고': 144, '보는': 145, '배우들의': 146, '환상적인': 147, '앙상블은': 148, '물론': 149, '코미디와': 150, '호러': 151, '마리': 152, '토끼를': 153, '다': 154, '잡은': 155, '복합': 156, '장르가': 157, '전하는': 158, '독보적인': 159, '매력으로': 160, '극장가로': 161, '불러들일': 162, '있다': 163, '이': 164, '기사는': 165, '문화': 166, '섹션으로': 167, '분류되었습니다': 168}
# word2idx를 key와 value를 반대로 적용
# {1:'한국영화', 2:'예매율', ...}
idx2word = {value : key for key, value in word2idx.items()}
idx2word
{1: '한국영화', 2: '예매율', 3: '6월', 4: "'핸섬가이즈'가", 5: '개봉을', 6: '1위에', 7: '통해', 8: '26일', 9: '고자극', 10: '이틀', 11: '앞두고', 12: '개봉', 13: '전', 14: '시사회를', 15: '언론과', 16: '관객', 17: '모두를', 18: '사로잡으며', 19: '예사롭지', 20: '않은', 21: '호평을', 22: '얻고', 23: '영화', 24: '꿈꾸던', 25: '귀신들린', 26: '집으로', 27: '이사', 28: "'핸섬가이즈'", 29: '는', 30: '더욱', 31: '수', 32: '이성민', 33: '이희준', 34: '두', 35: '관객들을', 36: '것이다', 37: '개봉하는', 38: '코미디', 39: '올랐다', 40: '있는', 41: '관객들의', 42: '열띤', 43: '기대에', 44: '힘입어', 45: '등극했다', 46: "'핸섬가이즈'는", 47: '평화로운', 48: '전원생활을', 49: "'", 50: "재필'과", 51: "'상구'가", 52: '하필이면', 53: '오며', 54: '벌어지는', 55: '코미디다', 56: '영화진흥위원회', 57: '통합전산망에', 58: '따르면', 59: '24일', 60: '오전', 61: '8시', 62: '55분', 63: '기준', 64: '14', 65: '0', 66: '의', 67: '예매율로', 68: '올라', 69: '올여름', 70: '극장가', 71: '최고의', 72: '기대작임을', 73: '입증했다', 74: '특히', 75: '이번', 76: '1위는', 77: '여름', 78: '극장가에', 79: '찾아오는', 80: '다양한', 81: '화제작들', 82: '속에서', 83: '이뤄낸', 84: '유의미한', 85: '결과라', 86: '이목을', 87: '집중시킨다', 88: '여기에', 89: "'인사이드", 90: '아웃', 91: "2'에", 92: '이어', 93: '전체', 94: '예매율로는', 95: '2위를', 96: '기록하며', 97: '그', 98: '뒤를', 99: '쫓고', 100: '있어', 101: '시작될', 102: '본격적인', 103: '흥행', 104: '레이스에', 105: '귀추가', 106: '주목된다', 107: '온', 108: '불운의', 109: '집주인', 110: "'재필'", 111: '과', 112: "'상구'", 113: '가', 114: '원치', 115: '않았던', 116: '강제', 117: '집들이를', 118: '시작하며', 119: '멈출', 120: '없는', 121: '웃음을', 122: '유발한다', 123: '끝없이', 124: '몰려드는', 125: '불청객은', 126: '사람', 127: '악령', 128: '가리지', 129: '않아', 130: '남자가', 131: '드림하우스에서', 132: '펼쳐지는', 133: '예측불가한', 134: '웃음으로', 135: '사로잡을', 136: '이를', 137: '완벽한', 138: '연기력으로', 139: '소화한', 140: '공승연', 141: '박지환', 142: '이규형', 143: '등', 144: '믿고', 145: '보는', 146: '배우들의', 147: '환상적인', 148: '앙상블은', 149: '물론', 150: '코미디와', 151: '호러', 152: '마리', 153: '토끼를', 154: '다', 155: '잡은', 156: '복합', 157: '장르가', 158: '전하는', 159: '독보적인', 160: '매력으로', 161: '극장가로', 162: '불러들일', 163: '있다', 164: '이', 165: '기사는', 166: '문화', 167: '섹션으로', 168: '분류되었습니다'}
encoded = tokenizer.texts_to_sequences(preprocessed_context)
encoded
[[3, 8, 37, 9, 38, 4, 5, 10, 11, 1, 2, 6, 39], [12, 13, 14, 7, 15, 16, 17, 18, 19, 20, 21, 22, 40, 23, 4, 41, 42, 43, 44, 5, 10, 11, 1, 2, 6, 45], [46, 47, 48, 24, 49, 50, 51, 52, 25, 26, 27, 53, 54, 9, 55], [56, 57, 58, 28, 29, 3, 59, 60, 61, 62, 63, 64, 65, 66, 67, 1, 2, 6, 68, 69, 70, 71, 72, 73], [74, 75, 1, 2, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 30, 86, 87], [88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 8, 31, 5, 7, 101, 102, 103, 104, 30, 105, 106], [23, 28, 29, 25, 26, 27, 107, 108, 109, 110, 32, 111, 112, 33, 113, 114, 115, 116, 117, 118, 119, 31, 120, 121, 122], [123, 124, 125, 126, 127, 128, 129, 34, 130, 24, 131, 132, 133, 134, 35, 135, 36], [136, 137, 138, 139, 32, 33, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 34, 152, 153, 154, 155, 156, 157, 158, 159, 160, 35, 161, 162, 36], [4, 12, 13, 14, 7, 15, 16, 17, 18, 19, 20, 21, 22, 163], [164, 165, 166, 167, 168]]
vocab_size = len(word2idx)
vocab_size
168