본문 바로가기

Python/자연어처리

Python(37)- 자연어 처리(NLP)

*이 글을 읽기전에 작성자 개인의견이 있으니, 다른 블로그와 교차로 읽는것을 권장합니다.*

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 > 자연어처리' 카테고리의 다른 글