
*이 글을 읽기전에 작성자 개인의견이 있으니, 다른 블로그와 교차로 읽는것을 권장합니다.*
1. 자연어(Natural Language)
- 프로그래밍 언어와 같이 인공적으로 만든 기계 언어와 대비되는 단어로, 우리가 일상에서 주로 사용하는 언어
1-1. 자연어 처리
- 컴퓨터가 한국어나 영어와 같은 인간의 자연어를 읽고 이해할 수 있도록 돕는 인공지능의 한 분야
- 자연어에서 의미 있는 정보를 추출하여 활용
- 기계가 자연어의 의미를 이해하고 사람의 언어로 소통할 수 있게 함.
1-2. 자연어 처리의 활용
- 문서 분류, 스팸 처리와 같은 분류 문제
- 검색어 추천
- 음성 인식, 질의 응답, 번역
- 소셜 미디어 분석
1-3. 자연어 처리의 용어
- 자연어 이해(NLU)
- 자연어 처리의 하위 집합
- 일반적으로 기계가 자연어의 실제 의미, 의도나 감정, 질문 등을 사람처럼 이해하도록 돕는 것
- 기계가 다양한 텍스트의 숨겨진 의미를 해석하려면 사전처리 작업들과 추가 학습이 필요
- 비언어적인 신호(표정, 손짓, 몸짓)도 힌트로 사용될 수 있음
- 텍스트에서 의미있는 정보를 추출하는 기술과 상황을 통계적으로 학습시킬 수 있는 다량의 데이터가 필요
- 자연어 생성(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), ('좋아','W'), ('합니다', 'W')]
- 어근 및 접사 분리
- 단어를 구성하는 어근과 접사를 분리
- 예)'먹었습니다' -> ['먹','었', '습니다']
- 음절 단위 토크나이징
- 한글 음절 단위로 분리
- 예) '안녕하세요' -> ['안', '녕', '하', '세', '요'] 한국어는 조사, 어미 등과 문법적 요소가 풍부하고, 공백의 의미 단위의 경계를 항상 명확하게 나타내지 않기 때문에 형태소 분석이 중요한 열할을 함
3. 형태소 분석
- 자연어 문장은 형태소라는 최소 단위로 분할하고 품사를 판별하는 직업
- 영어 형택소 분석은 형태소마다 띄어쓰기를 해서 문장을 구성하는 것이 기본(분석이 쉬운편)
- 아시아 계열의 언어분석은 복잡하고 많은 노력이 필요
- 한국어 형태소 분석 라이브러리; KoNLPy
- 명사, 대명사, 수사, 동사, 형용사, 관형사, 부사, 조사, 감탄사 총 9가지를 분석
- Hannum, KKma, Komoran, OKt 분석기 포함
!pip install KoNLPy

# 대한민국 헌법 텍스트 파일
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]

# 명사만 추출
okt.nouns(law[:100])

okt.pos(law[:100])

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. 자연어 처리/Data/alice.txt').read()
text

# generate() : 단어별 출현 빈도수를 비율로 반환하는 객체를 생성
wordcloud = WordCloud().generate(text)
wordcloud

wordcloud.words_

import matplotlib.pyplot as plt
plt.figure(figsize=(15,10))
plt.imshow(wordcloud)
plt.axis('off')
plt.show()

# max_words : 워드 클라우드에 표시되는 단어의 개수를 설정
wordcloud = WordCloud(max_words=100).generate(text)
plt.figure(figsize=(15,10))
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]

글꼴 설정하기
# 넣고싶은 폰트 종류 선택 : NanumSquare_acL
wordcloud = WordCloud(max_words=100,
font_path='/usr/share/fonts/truetype/nanum/NanumSquare_acL.ttf').generate(text)
plt.figure(figsize=(15,10))
plt.imshow(wordcloud)
plt.axis('off')
plt.show()

mask 설정하기
import numpy as np
from PIL import Image
alice_mask = np.array(Image.open('/content/drive/MyDrive/KDT/7. 자연어 처리/Data/alice_mask.png'))
alice_mask

wordcloud = WordCloud(max_words=100,
font_path='/usr/share/fonts/truetype/nanum/NanumSquare_acL.ttf',
mask = alice_mask,
background_color = 'ivory').generate(text)
plt.figure(figsize=(15,10))
plt.imshow(wordcloud)
plt.axis('off')
plt.show()

문제
konlpy.corpus 말뭉치 중 kolaw의 'constitution.txt'를 읽어서 명사만 추출한 후에 글자수가 한 자인 명사는 제거 후 빈도수에 따른 워드 클라우드를 지도위에 표시하기
from konlpy.corpus import kolaw
text = kolaw.open('constitution.txt').read()
text

noun_text = okt.nouns(text)
print(noun_text)

noun_text.sort(key=lambda x: len(x))
print(noun_text)
# 한 글자씩 뽑기

noun_text = [word for word in noun_text if len(word) > 1]
print(noun_text)
# 1글자 이상 뽑기 = 2글자

from collections import Counter
count = Counter(noun_text)
print(count)
# 객체 갯수 출력

data = count.most_common(100)
data =dict(data)
print(len(data))
print(data)

mask = np.array(Image.open('/content/drive/MyDrive/KDT/7. 자연어 처리/Data/korea_mask.jpg'))
mask

wordcloud = WordCloud(max_words=100,
font_path='/usr/share/fonts/truetype/nanum/NanumSquare_acL.ttf',
mask = mask,
# generate_from_frequencies : 딕셔너리 구조 받아오기
background_color = 'ivory').generate_from_frequencies(data)
plt.figure(figsize=(15,10))
plt.imshow(wordcloud)
plt.axis('off')
plt.show()

'Python > 자연어처리' 카테고리의 다른 글
Python(42)- RNN 기초 (0) | 2024.06.27 |
---|---|
Python(41)- 워드 임베딩 시각화 (0) | 2024.06.27 |
Python(40)- 워드 임베딩 (0) | 2024.06.25 |
Python(39)- 임베딩 (0) | 2024.06.25 |
Python(38)- 자연어처리(NLP) 프로젝트 순서 (0) | 2024.06.25 |