티스토리 뷰
학습목표
- 한국어 텍스트 데이터를 전처리하는 기본 개념과 실습 방법을 익힌다.
- 형태소 분석의 개념과 대표적인 한국어 형태소 분석기(Konlpy)를 익힌다.
- NLTK와 KoNLPy 라이브러리를 활용하여 텍스트 데이터의 토큰화와 불용어 제거를 학습한다.
- 실습을 통해 단어 빈도를 계산하고 간단한 텍스트 분석을 수행한다.
"한국어와 자연어 처리의 첫 만남"
"규칙과 예외, 그리고 맥락이 어우러진 예술
언어는 인간이 세상과 소통하는 가장 오래된 도구이자, 가장 정교한 시스템입니다. 하지만 그중에서도 한국어는 특별합니다. 세계의 언어학자들은 한국어를 "규칙과 예외, 그리고 맥락이 어우러진 예술"이라고 부르곤 합니다. 왜냐하면 한국어는 단순히 단어와 문장이 아닌, 의미를 담은 구조로 구성되어 있기 때문입니다.
“왜 한국어는 그렇게 특별한가요?”
“한국어는 다른 언어와는 조금 달라. 여기엔 ‘이야기를 담는 작은 단위’들이 숨겨져 있거든. 이 단위를 풀어내는 일이야말로 언어의 비밀을 푸는 첫걸음이지.”
"한국어는 퍼즐이다"
한국어는 마치 퍼즐과 같았습니다. 한 문장을 보면 단어들이 딱딱 맞아떨어지는 것 같지만, 그 속엔 보이지 않는 수많은 조각들이 숨어 있었습니다. 예를 들어, 누군가가 “저는 학교에 갑니다”라고 말하면, “는”, “에”, “습니다” 같은 작은 조각들이 각각 말의 흐름과 느낌을 바꾸는 역할을 합니다.
이런 조사는 영어처럼 단순히 단어를 나열하는 방식과는 전혀 다릅니다. 한국어의 문장은 단어 하나만으로도 무수히 많은 의미를 만들어낼 수 있죠. 그래서 단순히 단어를 분리해서는 텍스트의 진짜 의미를 알 수 없습니다.
다른 언어와 달리, 이런 조사와 어미는 한국어를 분석할 때 가장 중요한 요소가 됩니다. 조사와 어미는 단어를 연결하고 문장의 구조를 정의하며, 한국어 문장의 뼈대를 형성합니다.
- 조사: 단어 뒤에 붙어 문장 내 역할을 결정짓는 역할을 한다. 예:
- "학생이" → 주격 조사
- "책을" → 목적격 조사
- 어미: 동사와 형용사 뒤에 붙어 다양한 의미를 전달한다.
- "가다" → 기본형
- "가고", "가는", "가라" → 어미 변화를 통해 문맥 변화
- 문제점: 조사가 붙으면 단어만으로는 문맥과 역할을 알기 어렵다.
예:"학교에 갔다."와 "학교를 갔다."는 조사에 따라 의미가 달라진다.
띄어쓰기의 마술
한국어에는 또 다른 마술 같은 특징이 있습니다. 바로 띄어쓰기입니다.
영어에서는 단어마다 띄어쓰기가 철저히 지켜지지만, 한국어는 조금 다릅니다.
예를 들어, 누군가 “잘했어”라고 쓰면, 이게 “정말 잘했어”라는 칭찬인지, “그래, 잘 했어?”라는 반문인지, 띄어쓰기와 맥락에 따라 달라질 수 있죠. 컴퓨터는 이런 미묘한 차이를 이해하지 못하기 때문에, 사람이 이를 도와주는 형태소 분석이 필수적입니다.
“한국어는 문장을 읽기 위해 ‘맥락’이라는 특별한 렌즈가 필요하지. 컴퓨터에게 이 렌즈를 씌우려면, 언어를 더 깊게 분석할 필요가 있어.”
- 한국어의 띄어쓰기는 규칙이 엄격하지 않다.
- 예: "한번 해보자" vs. "한 번 해 보자" → 띄어쓰기에 따라 의미가 다르게 해석된다.
- 띄어쓰기가 잘못된 텍스트를 분석하기 위해서는 전처리가 필수적이다.
형태소, 한국어의 비밀 열쇠
이제 한국어의 비밀 열쇠를 풀어보겠습니다.
형태소란, 뜻을 가진 가장 작은 언어의 단위입니다.
예를 들어, “가방을 들다”에서 ‘가방’은 명사이고, ‘을’은 조사, ‘들다’는 동사입니다.
컴퓨터가 이 문장을 이해하려면, 이렇게 단어를 분석하고 역할을 분류해야 합니다.
하지만 형태소 분석은 쉬운 일이 아니었습니다. 컴퓨터는 사람처럼 맥락을 이해하지 못하기 때문에, 조사와 어미, 동사를 혼동하기 일쑤였죠.
예를 들어,
- "그는 나무를 보았다."에서 "나무"는 숲에 있는 생명체를 뜻할 수도 있고,
- "그는 나무로 의자를 만들었다."에서는 단순한 재료를 의미할 수도 있습니다.
이런 차이를 구분하기 위해서는 텍스트를 나누고 분석하기 위해 등장한 것이 바로 형태소 분석기였습니다. 바로 여기에서 우리가 배울 도구들, NLTK와 KoNLPy가 등장합니다.
이번 수업은 단순히 한국어 데이터를 분석하는 기술을 배우는 시간이 아닙니다. 우리는 한국어라는 언어가 가진 복잡함과 아름다움을 이해하고, 이를 통해 데이터를 더 깊이 읽는 방법을 탐구할 것입니다. 이 과정에서 자연어 처리의 개념과 실습을 통해, 한국어 데이터를 다루는 데 필요한 기본기를 탄탄히 다질 것입니다.
이제, 한국어 텍스트 데이터의 숨은 의미를 탐험할 준비가 되었나요?
지금부터 시작합니다.
1.2. 형태소 분석의 정의와 필요성
1) 형태소 분석 : 형태소 분석은 문장을 가장 작은 의미 단위(형태소)로 나누고, 각 형태소의 품사와 역할을 분석하는 과정이다.
- 형태소(Morpheme): 의미를 가지는 가장 작은 단위.
- 예: "학교에 갔다" → "학교(Noun) + 에(Participle) + 가다(Verb)"
2) 필요성
- 한국어는 단순히 단어 단위로 분석하기에는 문맥적 정보 손실이 크다.
- 형태소 분석을 통해 다음과 같은 문제를 해결할 수 있다.
- 동음이의어 구분: "눈(Noun)"(weather) vs. "눈(Noun)"(body part)
- 의미 정보 복원: "갔다"를 "가다(Verb)"로 변환하여 원형을 복원
- 텍스트 간소화: 조사, 어미 제거로 핵심 정보 추출
1.3. KoNLPy 라이브러리 소개
KoNLPy (Korean Natural Language Processing in Python)는 한국어 텍스트의 자연어 처리를 위한 강력한 라이브러리로 Hannanum, Kkma, Komoran. Mecab, Okt 등 다양한 형태소 분석기를 활용할 수 있다. 이러한 다양한 한국어 형태소를 활용하여 한국어 정보의 토큰화, 형태소 분석, 품사 태깅 등을 수행할 수 있게 도와주며, 사용자가 목적에 맞게 선택할 수 있는 유연성을 제공합니다.
- Python 기반: 다양한 분석기와 자연어 처리 도구를 통합적으로 제공.
- 손쉬운 사용: 간단한 코드로 형태소 분석 및 품사 태깅 가능.
- 다양한 분석기 지원: Okt, Komoran, Mecab, Hannanum, Kkma 등.
pip install konlpy
주요 형태소 분석기
1) Okt (Open Korea Text)
- 특징: 트위터에서 개발한 분석기로, 사용자 친화적이고 간단한 사용법 제공.
- 장점: 비표준어(예: SNS 언어) 처리에 강점.
from konlpy.tag import Okt
# Okt 객체 생성
okt = Okt()
# 입력 텍스트
text = "아버지가 방에 들어가신다."
# 형태소 분석
print(okt.morphs(text)) # ['아버지', '가', '방', '에', '들어가신다']
# 품사 태깅
print(okt.pos(text)) # [('아버지', 'Noun'), ('가', 'Josa'), ('방', 'Noun'), ...]
# 명사 추출
print(okt.nouns(text)) # ['아버지', '방']
# 어간 추출 (동사 원형 복원)
print(okt.morphs(text, stem=True)) # ['아버지', '가', '방', '에', '들어가다']
2.2. Komoran
- 기계 학습 기반으로 정확도가 높은 형태소 분석기.
- 대규모 데이터 처리에 적합.
from konlpy.tag import Komoran
# Komoran 객체 생성
komoran = Komoran()
# 형태소 분석
print(komoran.morphs(text)) # ['아버지', '가', '방', '에', '들어가', '시', 'ㄴ다']
# 품사 태깅
print(komoran.pos(text)) # [('아버지', 'NNG'), ('가', 'JKS'), ('방', 'NNG'), ...]
['아버지', '가', '방', '에', '들어가', '시', 'ㄴ다', '.']
[('아버지', 'NNG'), ('가', 'JKS'), ('방', 'NNG'), ('에', 'JKB'), ('들어가', 'VV'), ('시', 'EP'), ('ㄴ다', 'EF'), ('.', 'SF')]
2.3. Hannanum
- 전통적인 한국어 문법 기반 분석기.
- 조사와 어미 구분에 강점.
from konlpy.tag import Hannanum
# Hannanum 객체 생성
hannanum = Hannanum()
# 형태소 분석
print(hannanum.morphs(text)) # ['아버지', '가', '방', '에', '들어가', '시ㄴ다']
# 품사 태깅
print(hannanum.pos(text)) # [('아버지', 'N'), ('가', 'J'), ('방', 'N'), ...]
['아버지', '가', '방', '에', '들', '어', '가', '시ㄴ다', '.']
[('아버지', 'N'), ('가', 'J'), ('방', 'N'), ('에', 'J'), ('들', 'P'), ('어', 'E'), ('가', 'P'), ('시ㄴ다', 'E'), ('.', 'S')]
2.4. Kkma
- 세밀하고 정확한 분석 가능.
- 복잡한 문장 구조에 강점이 있지만 속도가 느림.
- 속도가 중요한 경우 Okt나 Mecab 사용.
from konlpy.tag import Kkma
# Kkma 객체 생성
kkma = Kkma()
# 형태소 분석
print(kkma.morphs(text)) # ['아버지', '가', '방', '에', '들어가', '시', 'ㄴ다']
# 품사 태깅
print(kkma.pos(text)) # [('아버지', 'NNG'), ('가', 'JKS'), ('방', 'NNG'), ...]
Kkma의 주요 메서드
- morphs(text)
- 문장을 형태소 단위로 분리.
- 예: ['꼬꼬마', '는', '정확', '하', 'ㄴ', '형태소', '분석']
- nouns(text)
- 문장에서 명사만 추출.
- 예: ['꼬꼬마', '정확', '형태소', '분석']
- pos(text)
- 각 단어에 대해 품사 태깅.
- 예: [('꼬꼬마', 'NNG'), ('는', 'JX')]
- sentences(text)
- 입력 텍스트를 문장 단위로 분리.
- 예: ['꼬꼬마는 정확한 형태소 분석을 제공합니다.']
분석기 비교
분석기 | 특징 | 장점 | 단점 |
Okt | SNS 언어와 비표준어 처리에 강점 | 간단한 사용법, 비표준어 분석 가능 | 정확도가 낮을 수 있음 |
Komoran | 기계 학습 기반의 고성능 분석기 | 빠르고 정확 | 비표준어 처리 한계 |
Mecab | 속도와 효율성이 뛰어남 | 대규모 데이터 분석에 적합 | 설치가 복잡, Windows 제한 |
Hannanum | 전통적인 문법 기반 분석 | 조사 및 어미 구분 정확 | 속도 느림 |
Kkma | 세밀한 분석 가능 | 복잡한 문장 구조 처리에 유리 | 속도 느림 |
KoNLPy에서 제공하는 품사 태그 설명 (Kkma 기준)
단어 | 태그 | 설명 |
꼬꼬마 | NNG | 일반 명사 |
는 | JX | 보조사 |
정확 | NNG | 일반 명사 |
하 | XSV | 동사 파생 접미사 |
ㄴ | ETD | 관형형 전성 어미 |
형태소 | NNG | 일반 명사 |
분석 | NNG | 일반 명사 |
을 | JKO | 목적격 조사 |
제공 | NNG | 일반 명사 |
하 | XSV | 동사 파생 접미사 |
ㅂ니다 | EFN | 종결 어미 |
. | SF | 마침표 |
따라하기: KoNLPy로 한국어 텍스트 처리
한국어 텍스트 데이터는 특유의 복잡성과 구조로 인해 전처리가 중요하다.
Step1. 텍스트 데이터 수집
자연어 처리의 첫 단계는 데이터를 수집하는 것입니다. 데이터는 텍스트 파일, 웹 크롤링, 또는 데이터베이스 형태로 수집됩니다.
# 예제 텍스트
text = "*한국어 자연어 처리는 복잡하지만 흥미로운 분야입니다!."
Step2. 텍스트 정제 (Text Cleaning)
텍스트에서 불필요한 문자, HTML 태그, 특수문자를 제거하여 분석에 적합한 상태로 만듭니다.
import re
# 텍스트 정제
cleaned_text = re.sub(r"[^\w\s]", "", text) # 특수문자 제거
print(cleaned_text) # '한국어 자연어 처리는 복잡하지만 흥미로운 분야입니다'
Step3. 토큰화 (Tokenization)
텍스트를 단어 또는 형태소 단위로 나누는 과정입니다. 한국어는 조사, 어미, 접사가 많아 형태소 단위로 토큰화하는 경우가 많다.
- KoNLPy를 활용한 토큰화
from konlpy.tag import Okt
okt = Okt()
tokens = okt.morphs(cleaned_text)
print(tokens) # ['한국어', '자연어', '처리', '는', '복잡하지만', '흥미로운', '분야', '입니다']
Step4. 품사 태깅 (Part-of-Speech Tagging)
각 토큰에 품사 정보를 추가하여 문맥을 이해합니다. 품사 태깅은 동음이의어를 구분하는 데 유용합니다.
pos_tags = okt.pos(cleaned_text)
print(pos_tags)
# [('한국어', 'Noun'), ('자연어', 'Noun'), ('처리', 'Noun'), ('는', 'Josa'), ...]
Step5. 불용어 제거 (Stop Words Removal)
분석에 필요 없는 불필요한 단어(조사, 접속사 등)를 제거합니다.
불용어 리스트를 미리 정의하고 이를 기준으로 토큰을 필터링합니다.
stop_words = ['는', '의', '이', '가', '에', '를']
filtered_tokens = [word for word in tokens if word not in stop_words]
print(filtered_tokens) # ['한국어', '자연어', '처리', '복잡하지만', '흥미로운', '분야']
Step6. 어간 추출 또는 표제어 추출
동사의 변화된 형태를 원형으로 복원합니다. 이를 통해 분석 시 동사 변형이 동일하게 처리됩니다.
stemmed_tokens = okt.morphs(cleaned_text, stem=True)
print(stemmed_tokens) # ['한국어', '자연어', '처리', '복잡하다', '흥미롭다', '분야', '이다']
Step7. 단어 빈도 계산 (Word Frequency)
분석에 필요한 핵심 단어를 찾기 위해 각 단어의 빈도를 계산합니다.
from collections import Counter
word_counts = Counter(filtered_tokens)
print(word_counts)
# Counter({'한국어': 1, '자연어': 1, '처리': 1, '복잡하지만': 1, '흥미로운': 1, '분야': 1})
9. N-그램 생성 (N-gram)
문맥적 의미를 더 잘 이해하기 위해 연속된 단어 묶음을 생성합니다.
from nltk import ngrams
bigrams = list(ngrams(filtered_tokens, 2))
print(bigrams) # [('한국어', '자연어'), ('자연어', '처리'), ...]
잃어버린 강아지를 찾는 이야기
주인공이 길을 잃은 강아지를 찾기 위해 SNS와 블로그 글에서 관련된 정보를 분석합니다.
목표: 텍스트 데이터를 형태소 단위로 분석하여 강아지를 찾는 단서를 발견합니다.
1. 데이터 준비
강아지를 찾기 위해 SNS나 블로그 데이터를 수집했다고 가정합니다.
예제 데이터는 다음과 같습니다.
text_data = [
"강아지가 공원에서 놀다가 사라졌어요.",
"어제 강아지를 산책시키다 잃어버렸습니다.",
"공원 근처에서 강아지 본 사람 없나요?",
"강아지가 빨간 목줄을 하고 있어요."
]
2. 텍스트 정제 (Text Cleaning)
강아지 관련 데이터를 분석하기 위해 특수문자나 불필요한 요소를 제거합니다.
import re
# 특수문자 제거
cleaned_data = [re.sub(r"[^\w\s]", "", text) for text in text_data]
print(cleaned_data)
# ['강아지가 공원에서 놀다가 사라졌어요', '어제 강아지를 산책시키다 잃어버렸습니다', ...]
3. 토큰화 (Tokenization)
문장을 형태소 단위로 나누어 분석합니다.
from konlpy.tag import Okt
# Okt 객체 생성
okt = Okt()
# 형태소 단위로 토큰화
tokens = [okt.morphs(sentence) for sentence in cleaned_data]
print(tokens)
# [['강아지', '가', '공원', '에서', '놀다', '가', '사라지', '었', '어요'], ...]
4. 품사 태깅 (Part-of-Speech Tagging)
각 단어에 품사 정보를 추가하여 의미를 파악합니다. 품사를 통해 주요 키워드를 식별할 수 있습니다.
# 품사 태깅
pos_tags = [okt.pos(sentence) for sentence in cleaned_data]
print(pos_tags)
# [[('강아지', 'Noun'), ('가', 'Josa'), ('공원', 'Noun'), ...], ...]
5. 불용어 제거 (Stop Words Removal)
의미 없는 단어(조사, 접속사 등)를 제거하고, 핵심 단어만 남깁니다.
# 불용어 리스트
stop_words = ['가', '에서', '다', '를', '하고', '어제']
# 불용어 제거
filtered_tokens = [
[word for word in sentence if word not in stop_words]
for sentence in tokens
]
print(filtered_tokens)
# [['강아지', '공원', '놀다', '사라지', '었', '어요'], ...]
6. 정규화 (Normalization)
동사의 변화형을 원형으로 복원하여 일관성을 유지합니다.
# 어간 추출
normalized_tokens = [
[okt.morphs(word, stem=True) for word in sentence]
for sentence in filtered_tokens
]
print(normalized_tokens)
# [['강아지', '공원', '놀다', '사라지다', '있다'], ...]
7. 단어 빈도 계산 (Word Frequency Calculation)
강아지와 관련된 단서를 찾기 위해 단어 빈도를 계산합니다.
from collections import Counter
# 모든 문장에서 단어를 하나의 리스트로 통합
all_words = [word for sentence in filtered_tokens for word in sentence]
# 단어 빈도 계산
word_counts = Counter(all_words)
print(word_counts)
# Counter({'강아지': 4, '공원': 2, '사라지다': 1, ...})
8. 분석 및 결론
강아지와 관련된 정보를 시각적으로 표현하여 단서를 찾습니다.
from wordcloud import WordCloud
import matplotlib.pyplot as plt
# 워드클라우드 생성
wordcloud = WordCloud(font_path='malgun.ttf', background_color='white').generate_from_frequencies(word_counts)
# 워드클라우드 표시
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()
주인공은 길을 잃은 강아지를 찾기 위해 블로그와 SNS에서 데이터를 수집하고 형태소 분석을 통해 단서를 풀어나갔다. 분석 결과 가장 많이 등장한 단어는 '강아지'로, 이는 주요 검색 대상임을 확인시켜 주었으며, 두 번째로 자주 나온 단어는 '공원'으로 강아지가 사라진 장소와 관련이 있음을 나타냈다. 또한, '빨간 목줄'이라는 단서는 강아지의 특징으로 주변 사람들의 기억을 자극할 중요한 힌트였다. 이러한 데이터를 바탕으로 주인공은 "공원에서 강아지를 본 사람이 있다면, 빨간 목줄이 힌트가 될 거야"라고 결론을 내리고 공원 주변을 집중적으로 탐색했다. 그는 공원 근처의 사람들에게 "혹시 빨간 목줄을 한 강아지를 보신 적 있나요?"라고 물었고, 한 할머니가 "빨간 목줄을 한 강아지를 어제 공원 벤치 근처에서 본 것 같다"는 말을 해주었다. 주인공은 할머니가 알려준 방향으로 가서, 멀리서 자신을 보고 꼬리를 흔들며 달려오는 강아지를 발견했다. "강아지야! 찾았어, 드디어 찾았어!"라며 강아지를 품에 안은 주인공은 데이터 분석이 단순한 기술을 넘어 사랑하는 존재와 다시 연결되는 다리가 될 수 있음을 깨달았다. 이 이야기는 형태소 분석과 자연어 처리가 사람들의 문제를 해결하고 더 나은 삶을 만드는 도구임을 보여준다.
"영화 제목으로 연상되는 단어 분석하기"
- 영화 제목 데이터를 기반으로 연상되는 단어의 조합(N-gram)을 분석합니다.
N-gram은 텍스트에서 연속된 N개의 단어 묶음(조합)을 추출하는 기법이다. 이를 통해 단어의 순서와 관계를 파악할 수 있다.
이를 재미있게 설명하기 위해 맛집 탐험에 빗대어 설명해 보겠다.
N-gram이란?
- 1-gram (Unigram): 단일 요리 맛보기
- 메뉴판에 적힌 한 가지 요리 이름만 본다고 생각하자.
- 예: "김치찌개", "비빔밥", "불고기".
- 이 경우 각 단어(요리)는 독립적으로 존재하며, 그 사이의 연관성을 알 수 없다.
- 2-gram (Bigram): 두 가지 음식 조합
- 두 가지 요리를 묶어서 보면, 조합이 만들어진다.
- 예: "김치찌개와 밥", "비빔밥과 불고기".
- 한 음식이 다른 음식과 어떤 순서로 등장하는지 알 수 있다.
- 3-gram (Trigram): 세 가지 음식 세트
- 세 가지 음식을 조합해서 보면, 코스 요리가 된다.
- 예: "김치찌개 + 밥 + 계란말이", "비빔밥 + 불고기 + 된장국".
- 요리가 어떤 흐름으로 제공되는지 알 수 있다.
N-gram의 활용
맛집 탐험에서, 사람들의 리뷰를 분석한다고 가정하자.
리뷰 예시: "김치찌개는 맛있고, 밥과 계란말이가 잘 어울립니다."
- 1-gram: [김치찌개, 는, 맛있고, 밥, 과, 계란말이, 가, 잘, 어울립니다]
- 개별적인 단어 빈도를 알 수 있다.
- "김치찌개"가 몇 번 언급되었는지 확인 가능.
- 2-gram: [(김치찌개, 는), (는, 맛있고), (맛있고, 밥), (밥, 과), (과, 계란말이), (계란말이, 가)]
- 단어 쌍 간의 연관성을 파악.
- "밥과 계란말이"처럼 자주 등장하는 조합을 분석 가능.
- 3-gram: [(김치찌개, 는, 맛있고), (는, 맛있고, 밥), (맛있고, 밥, 과), (밥, 과, 계란말이)]
- 세 단어의 흐름을 알 수 있음.
- "맛있고 밥과 계란말이"처럼 자주 사용되는 표현을 파악.
from nltk import ngrams
from collections import Counter
# 샘플 데이터
text = "김치찌개는 맛있고 밥과 계란말이가 잘 어울립니다."
# 토큰화
tokens = text.split()
# N-gram 생성
n = 2 # 여기서 2는 Bigram
bigram = list(ngrams(tokens, n))
# 빈도 계산
bigram_counts = Counter(bigram)
print("2-gram 결과:", bigram_counts)
# 시각화
import matplotlib.pyplot as plt
# 데이터 준비
labels, values = zip(*bigram_counts.items())
labels = [' '.join(label) for label in labels]
# 그래프 그리기
plt.bar(labels, values)
plt.title('2-gram 빈도 분석')
plt.xlabel('단어 조합')
plt.ylabel('빈도')
plt.xticks(rotation=45)
plt.show()
문제 1: 데이터 준비
다음은 몇 가지 영화 제목 데이터입니다. 이를 활용해 N-gram 분석을 진행하세요.
movie_titles = [
"어벤져스 엔드게임",
"겨울왕국 어드벤처",
"인터스텔라 우주여행",
"기생충 가족의 비밀",
"올드보이 복수의 여정",
"라이온 킹의 귀환"
]
문제 2: Unigram 분석
- 각 영화 제목을 Unigram(1-gram)으로 분리하고, 각 단어의 빈도를 계산하세요.
from collections import Counter
# 단어 분리
words = [word for title in movie_titles for word in title.split()]
word_counts = Counter(words)
# 출력
print(word_counts)
# 예: {'어벤져스': 1, '엔드게임': 1, ...}
문제 3: Bigram 분석
- 영화 제목에서 단어 두 개씩 짝을 지어 Bigram(2-gram)을 생성하고, 가장 자주 등장하는 단어 쌍을 찾으세요.
from nltk.util import ngrams
# Bigram 생성
bigrams = [ngrams(title.split(), 2) for title in movie_titles]
bigram_counts = Counter([pair for bigram in bigrams for pair in bigram])
# 출력
print(bigram_counts)
# 예: {('어벤져스', '엔드게임'): 1, ('겨울왕국', '어드벤처'): 1, ...}
문제 4: Trigram 분석
- 영화 제목에서 Trigram(3-gram)을 생성하고, 가장 많이 등장한 단어 조합을 출력하세요.
# Trigram 생성
trigrams = [ngrams(title.split(), 3) for title in movie_titles]
trigram_counts = Counter([pair for trigram in trigrams for pair in trigram])
# 출력
print(trigram_counts)
# 예: {('기생충', '가족의', '비밀'): 1, ...}
문제 5: N-gram 빈도 시각화
- Unigram, Bigram, Trigram의 빈도를 각각 계산하고, 이를 시각화하세요.
- 히스토그램이나 워드클라우드를 사용해 결과를 시각적으로 표현합니다.
import matplotlib.pyplot as plt
# Unigram 히스토그램
plt.bar(word_counts.keys(), word_counts.values())
plt.xticks(rotation=45)
plt.title("Unigram 빈도 분석")
plt.show()
문제 6: 응용 - 새로운 영화 제목 생성
- Unigram 또는 Bigram 조합을 기반으로 새로운 영화 제목을 만들어 보세요.
- 예: "기생충 가족의 여정", "인터스텔라 어드벤처"
힌트
- Bigram을 확률적으로 선택하여 문장을 만듭니다.
- 시작 단어를 기준으로 다음 단어를 선택해 새로운 문장을 생성합니다.
추가 도전 과제
- 동음이의어 처리: "킹"과 같은 단어가 여러 영화 제목에서 등장합니다. 이를 처리하여 분석의 정확도를 높여보세요.
- 특정 단어로 시작하는 N-gram 추출: "가족"으로 시작하는 Bigram과 Trigram을 추출해 보세요.
- 빈도 기반 정렬: Unigram, Bigram, Trigram을 각각 빈도순으로 정렬하여 상위 5개를 출력하세요.
- Total
- Today
- Yesterday