본문 바로가기
자연어 처리(NLP)

1. 자연어 처리 개요(Natural Language Processing)

by 곽정우 2024. 6. 17.

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

 

alice.txt
0.14MB

# 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

mask_image.zip
0.09MB

 

 

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. 워드 임베딩  (0) 2024.06.17
3. 임베딩  (0) 2024.06.17
2. 자연어 처리 프로젝트 진행 순서  (0) 2024.06.17