1. 자연어(Natural Language)
- 프로그래밍 언어와 같이 인공적으로 만든 기계 언어와 대비되는 단어로, 우리가 일상에서 주로 사용하는 언어
1-1. 자연어처리(Natural Language Processing, NLP)
- 컴퓨터가 한국어나 영어와 같은 인간의 자연어를 읽고 이해할 수 있도록 돕는 인공지능의 한 분야
- 자연어에서 의미 있는 정보를 추출하여 활용
- 기계가 자연어의 의미를 이해하게 함
- 기계가 사람의 언어로 소통할 수 있게함
1-2. 자연어처리의 활용
- 문서 분류, 스팸 처리와 같은 분류 문제
- 검색어 추천
- 음성 인식, 질의 응답 번역
- 소셜 미디어 분석
1-3. 자연어처리의 용어
- 자연어이해(Natural Language Understanding, NLU)
- 자연어처리의 하위 집합
- 자연어이해 기술의 목적은 일반적으로 기계가 자연어의 실제 의미, 의도나 감정, 질문 등을 사람처럼 이해하도록 돕는 것
- 기계가 다양한 텍스트의 숨겨진 의미를 해석하려면 사전 처리 작업들과 추가 학습이 필요
- 비 언어적인 신호(표정, 손짓, 몸짓)도 힌트로 사용될 수 있음
- 텍스트에서 의미있는 정보를 추출하는 기술과 상황을 통계적으로 학습시킬 수 있는 다량의 데이터가 필요함
- 자연어생성(Natural Language Generation, NLG)
- 기계가 사람의 언어를 직접 생성하도록 돕는 기술
- 기계가 일련의 계산 결과를 사람의 언어로 표현하도록 도와줌
2. 토크나이징
- 자연어 처리(NLP)에서 토크나이징(tokenizing)은 텍스트를 더 작은 단위로 분리하는 과정
- 분리된 작은 단위를 토큰(token)이라고 부르며, 일반적으로 단어, 구두점, 숫자, 개별 문자일 수 있음
- 토크나이징은 NLP의 초기 단계 중 하나로, 텍스트 데이터가 컴퓨터가 이해하고 처리할 수 있는 형태로 변환됨
- 토크나이징을 어떻게 하느냐에 따라 성능의 차이가 날 수 있음
2-1 영어의 토크나이징
- 공백 기반 토크나이징
- 공백을 기준으로 텍스트를 분리
- 예) "I love natural language processing!" -> ["I", "love", "natural", "language", "processing", "!"]
- 구두점 처리
- 구두점을 단어와 분리하거나 별도의 토큰으로 처리
- 예) "Hello, world!" -> ["Hello", ",", "world", "!"]
- 어간 추출 및 표제어 추출
- 단어의 형태를 정규화
- 예) "running", "ran", "runner" -> "run"
- 서브워드 토크나이징
- BPE(Byte Pair Encoding)나 WordPiece와 같은 알고리즘을 사용하여 드물게 나타나는 단어도 하위 단위로 나눔
- 예) "unhappiness" -> ["un", "##happiness"]
2-2. 한국어의 토크나이징
- 한국어는 어절(단어와 조사, 어미 등이 결합한 단위)과 형태소(의미를 가진 가장 작은 단위)로 구성되어 있으며, 영어보다 훨씬 복잡한 언어 구조를 가짐
- 어절 단위 토크나이징
- 공백을 기준으로 어절을 분리
- 예) "저는 자연어 처리를 좋아합니다." -> ["저는", "자연어", "처리를", "좋아합니다."]
- 형태소 분석
- 어절을 형태소로 분리하고 각 형태소의 품사를 태킹
- 예) "저는 자연어 처리를 좋아합니다." -> [("저", "NP"), ("는", "JX"), ("자연어", "NP"), ("처리", "NP"), ("를", "JX"), ("좋아", "VV"), ("합니다.", "VV")]
- 어근 및 접사 분리
- 단어를 구성하는 어근과 접사를 분리
- 예) "먹었습니다" - > ["먹", "었", "습니다"]
- 음절 단위 토크나이징
- 한글 음절 단위로 분리
- 예) "안녕하세요" -> ["안", "녕", "하", "세", "요"]
한국어는 조사, 어미 등과 문법적 요소가 풍부하고, 공백이 의미 단위의 경계를 항상 명확하게 나타내지 않기 때문에 형태소 분석이 중요한 역할을 함
3. 형태소 분석
- 자연어의 문장을 형태소라는 최소 단위로 분할하고 품사를 판별하는 작업
- 영어 형태소 분석은 형태소마다 띄어쓰기를 해서 문장을 *구성하는 것이 기본(분석이 쉬운편)
- 아시아 계열의 언어분석은 복잡하고 많은 노력이 필요
- 한국어 형태소 분석 라이브러리: KoNLPy
- 명사, 대명사, 수사, 동사, 형용사, 관형사, 부사, 조사, 감탄사 총 9가지를 분석
- Hannanum, KKma, Komoran, Okt 분석기 포함
!pip install KoNLPy
# KoNLPy에는 kolaw(대한민국 헌법 텍스트 파일)를 제공
from konlpy.corpus import kolaw
kolaw.fileids()
law = kolaw.open('constitution.txt').read()
law
from konlpy.tag import *
hannanum = Hannanum()
kkma = Kkma()
komoran = Komoran()
okt = Okt()
law[:100]
# nouns(): 명사만 추축
okt.nouns(law[:100])
# pos: 모든 품사를 부착
okt.pos(law[:100])
# tagset: 부착되는 품사 태그와 기호에 대한 의미를 반환
okt.tagset
text = '아버지가방에들어가신다'
okt.pos(text)
text = '아버지가 방에 들어가신다'
okt.pos(text)
okt.pos('오늘 날씨가 참 꾸리꾸리 하네욬ㅋㅋㅋ')
# norm = True: 각 형태소에 대한 원형으로 처리
okt.pos('오늘 날씨가 참 꾸리꾸리 하네욬ㅋㅋㅋ', norm = True)
# stem = True: 원형 글자로 변경
okt.pos('오늘 날씨가 참 꾸리꾸리 하네욬ㅋㅋㅋ', norm = True, stem=True)
4. 워드 클라우드
- 핵심 단어를 시각화하는 기법
- 문서의 키워드, 개념 등을 직관적으로 파악할 수 있게 핵심 단어를 시각적으로 돋보이게 하는 기법
!pip install wordcloud
from wordcloud import WordCloud
text = open('/content/drive/MyDrive/KDT/7. 자연어 처리(NLP)/Data/alice.txt').read()
text
# generate(): 단어별 출현 빈도수를 비율로 반환하는 객체를 생성
wordcloud = WordCloud().generate(text)
wordcloud
wordcloud.words_
import matplotlib.pyplot as plt
plt.figure(figsize=(12,8))
plt.imshow(wordcloud) # wordcloud 객체를 넣으면 워드클라우드 형태의 그래프 생성
plt.axis('off') #눈금 삭제
plt.show()
# max_words: 워드 클라우드에 표시되는 단어의 개수를 설정
wordcloud = WordCloud(max_words=100).generate(text) # 단어 100개만 표시
plt.figure(figsize=(12, 8))
plt.imshow(wordcloud)
plt.axis('off')
plt.show()
!apt-get update -qq
!apt-get install fonts-nanum* -qq
import matplotlib.font_manager as fm
sys_font = fm.findSystemFonts()
[f for f in sys_font if 'Nanum' in f]
wordcloud = WordCloud(max_words=100,
font_path='/usr/share/fonts/truetype/nanum/NanumPen.ttf').generate(text)
plt.figure(figsize=(12, 8))
plt.imshow(wordcloud)
plt.axis('off')
plt.show()
from PIL import Image
import numpy as np
# 이미지 파일을 로드하여 ndarray 형식으로 변환한 데이터를 alice_mask 변수에 저장
alice_mask = np.array(Image.open('/content/drive/MyDrive/KDT/7. 자연어 처리(NLP)/Data/alice_mask.png'))
alice_mask
wordcloud = WordCloud(max_words=100,
font_path='/usr/share/fonts/truetype/nanum/NanumPen.ttf',
mask=alice_mask,
background_color='ivory').generate(text)
plt.figure(figsize=(12, 8))
plt.imshow(wordcloud)
plt.axis('off')
plt.show()
# 마스크 이미지를 넘파이 배열(ndarray)로 변환한 후 이를 활용하여 워드클라우드를 시각화
문제:
konlpy.corpus 말뭉치 중 kolaw의 'constitution.txt"를 읽어서 명사만 추출한 후에 글자수가 한자인 명사는 제거 후 빈도수에 따른 워크 클라우드를 지도위에 표시하기
from konlpy.corpus import kolaw
noun_law = kolaw.open('constitution.txt').read()
noun_law
noun_law = okt.nouns(law)
print(noun_law)
noun_law.sort(key=lambda x: len(x))
print(noun_law)
stop_words = ['함', '것', '제', '정', '바', '그']
noun_law = [each_word for each_word in noun_law if each_word not in stop_words]
print(noun_law)
noun_law = [each_word for each_word in noun_law if len(each_word) > 1]
print(noun_law)
from collections import Counter
count = Counter(noun_law)
print(count)
data = count.most_common(100)
data = dict(data)
print(len(data))
print(data)
# 딕셔너리에 저장된 데이터를 워드 클라우드로 생성하려면 generate_from_frequencies()를 사용
wordcloud = WordCloud(max_words=100,
font_path='/usr/share/fonts/truetype/nanum/NanumPen.ttf'
).generate_from_frequencies(data)
plt.figure(figsize=(15, 10))
plt.imshow(wordcloud)
plt.axis('off')
plt.show()
# 이미지 파일을 로드하여 ndarray 형식으로 변환한 데이터를 alice_mask 변수에 저장
korea_mask = np.array(Image.open('/content/drive/MyDrive/KDT/7. 자연어 처리(NLP)/Data/korea_mask.jpg'))
korea_mask
# 딕셔너리에 저장된 데이터를 워드 클라우드로 생성하려면 generate_from_frequencies()를 사용
wordcloud = WordCloud(max_words=100,
font_path='/usr/share/fonts/truetype/nanum/NanumPen.ttf',
background_color='ivory',
mask=korea_mask
).generate_from_frequencies(data)
plt.figure(figsize=(15, 10))
plt.imshow(wordcloud)
plt.axis('off')
plt.show()
'자연어 처리(NLP)' 카테고리의 다른 글
6. Rnn 기초 (0) | 2024.06.21 |
---|---|
5. 워드임베딩 시각화 (0) | 2024.06.21 |
4. 워드 임베딩 (1) | 2024.06.17 |
3. 임베딩 (0) | 2024.06.17 |
2. 자연어 처리 프로젝트 진행 순서 (0) | 2024.06.17 |