머신러닝 & 딥러닝/NLP(자연어 처리)

[NLP] 한국어 텍스트 전처리 과정(1)

Haru_29 2023. 5. 12. 22:04

한국어에서 영어와 다르게 토큰화가 어려운 이유

1. 띄어쓰기 단위가 영어처럼 독립적인 단어라면 띄어쓰기 단위로 토큰화를 하면 되겠지만 한국어는 어절이 독립적인 단어로 구성되는 것이 아니라 조사 등의 무언가가 붙어있는 경우가 많아서 이를 전부 분리해줘야 한다는 의미입니다.

한국어 토큰화에서는 형태소(morpheme) 란 개념을 반드시 이해해야 합니다. 형태소(morpheme)란 뜻을 가진 가장 작은 말의 단위를 말합니다. 이 형태소에는 두 가지 형태소가 있는데 자립 형태소와 의존 형태소입니다.

문장 : 하루는 책을 읽었다

자립 형태소 : 하루, 책
의존 형태소 : -가, -을, 읽-, -었, -다

따라서, '하루'라는 사람 이름과 '책'이라는 명사를 얻어낼 수 있습니다. 이를 통해 유추할 수 있는 것은 한국어에서 영어에서의 단어 토큰화와 유사한 형태를 얻으려면 어절 토큰화가 아니라 형태소 토큰화를 수행해야한다는 겁니다.

2. 한국어는 영어와 달르게 띄어쓰기가 잘 이뤄지지가 않습니다.

 

한국어 자연어 처리에 필요한 전처리 과정

1. 한글 형태소 분석 한글은 토큰화(Tokenization) 하면 띄어쓰기 문제로 인해 제대로 분리되지 않는 경우가 많습니다. 따라서, 한국어 형태소 분석기를 통해 텍스트를 형태소 단위로 쪼개는 과정이 필요합니다. 형태소(morpheme), 언어의 의미를 가장 작은 단위로 쪼갠 것을 의미합니다. 형태소 분석기는 문장을 형태소 단위로 분리하고, 단어의 품사 정보를 판단하여 부착합니다. 대표적인 한국어 형태소 분석기로는 Okt(Open Korea Text), 메캅(Mecab), 코모란(Komoran), 한나눔(Hannanum), 꼬꼬마(Kkma) 등이 있습니다.

# 정규식(Regular Expression)을 이용하여 구현
import re
# 한국어 문장
text = "안녕하세요, 자연어 처리에 대해 공부하고 있습니다."
# 구두점을 제외한 문자열 추출
text = re.sub("[^가-힣a-zA-Z0-9]+", " ", text)
print(text)
안녕하세요 자연어 처리에 대해 공부하고 있습니다
from konlpy.tag import Okt
# 한국어 문장
text = "안녕하세요, 자연어 처리에 대해 공부하고 있습니다."
# 형태소 분석기 생성
okt = Okt()
# 토큰화
tokens = okt.morphs(text)
print(tokens)
['안녕하세요', ',', '자연어', '처리', '에', '대해', '공부', '하고', '있습니다', '.']

2. 불용어 처리 텍스트를 분석할 , 종종 불필요한 단어들이 데이터에 포함될 있습니다. 이러한 불필요한 단어들을 제거하는 것이 불용어 처리입니다. 불용어(stop word), 검색 엔진이나 자연어 처리를 하는 과정에서 무시되는 보편적인 단어로, 일반적으로 조사, 접속사, 대명사 등이 해당됩니다. 아래의 예시는 nltk 라이브러리를 사용하였습니다.

import nltk
from nltk.corpus import stopwords

# 불용어 리스트 다운로드
nltk.download('stopwords')

# 불용어 리스트 생성
stopwords_list = stopwords.words('korean')

# 예시 문장
text = "이 영화는 스토리도 연출도 좋아요. 그러나 조금 지루합니다."

# 불용어 제거
tokens = text.split()
tokens = [word for word in tokens if not word in stopwords_list]
cleaned_text = " ".join(tokens)

print(cleaned_text)
'영화 스토리 연출 좋아요. 그러나 조금 지루합니다.'

3. 품사 태깅 형태소 분석을 통해 분리된 형태소들에 대해 품사 태깅(Part of Speech tagging, POS tagging)을 수행합니다. 품사 태깅은 문장 내의 각 형태소가 어떤 언어적 범주에 속하는지를 파악하는 과정으로, 품사 정보를 부착합니다. 예를 들어, '사과를 먹는다'라는 문장에서 '사과'는 명사(Noun), '먹는다'는 동사(Verb)입니다. 아래의 예시로는 KoNLPy Okt 이용하여 한국어 텍스트 데이터에서 품사 태깅을 수행하는 예시입니다.

from konlpy.tag import Okt
# 예시 문장
text = "한국어 전처리 과정에서 품사 태깅하는 것은 중요합니다."
# Okt 객체 생성
okt = Okt()
# 품사 태깅
pos = okt.pos(text)
# 출력
print(pos)
[('한국어', 'Noun'), ('전처리', 'Noun'), ('과정', 'Noun'), ('에서', 'Josa'), ('품사', 'Noun'), ('태깅', 'Noun'), ('하는', 'Verb'), ('것', 'Noun'), ('은', 'Josa'), ('중요합니다', 'Adjective'), ('.', 'Punctuation')]

4. 개체명 인식 개체명(Named Entity)은 인물, 지명, 회사명 등과 같이 문맥상 특별한 의미를 지닌 단어를 의미합니다. 개체명 인식(Named Entity Recognition, NER)은 주어진 텍스트에서 중요한 개체명들을 인식하고, 해당 단어가 어떤 유형인지를 분류하는 것입니다. 예를 들어, '김태영 씨가 네이버에 다녀갔습니다'라는 문장에서 '김태영'은 인물, '네이버'는 회사명입니다. 대표적인 한국어 개체명 인식 라이브러리로는 KoNLPy의 Kkma, Komoran, Hannanum, Okt 등이 있습니다. 아래의 예시는 KoNLPy Kkma 이용하여 한국어 텍스트 데이터에서 개체명 인식을 수행하는 예시 코드입니다.

from konlpy.tag import Kkma
# 예시 문장
text = "미국의 대통령인 조 바이든은 46대 대통령이다."
# Kkma 객체 생성
kkma = Kkma()
# 개체명 인식
entities = kkma.entities(text)
# 출력
print(entities)
# 위 코드에서 kkma.entities() 함수는 입력된 텍스트 데이터에서 개체명을 추출합니다. 
# 추출된 개체명은 (개체명, 유형) 형태의 튜플로 반환됩니다. 
[('미국', 'OL'), ('대통령', 'OL'), ('조 바이든', 'PS'), ('46', 'NR'), ('대', 'NNB'), ('대통령', 'NNG')]

 

5. 띄어쓰기 교정 한국어의 경우 다른 언어와 달리 띄어쓰기 문제 때문에 한글 형태소 분석이 어렵습니다. 따라서, 띄어쓰기 교정(Spell Correction)이 명확한 자연어처리를 위한 선행조건으로 필요합니다. 띄어쓰기 교정은 일상적인 교정 외에도 띄어쓰기 규칙을 적용하여, 텍스트의 유사성 기반으로 추정하는 방법도 있습니다. 띄어쓰기 교정을 위해서는 다양한 방법이 있지만, 대표적으로는 KoNLPy 라이브러리에서 제공하는 Hannanum, Kkma, Komoran 등의 형태소 분석기를 이용한 방법이 있습니다. 이들 라이브러리는 띄어쓰기 교정 기능도 함께 제공합니다. 아래의 예시는 KoNLPy Hannanum 이용하여 한국어 텍스트 데이터에서 띄어쓰기 교정을 수행하는 예시 코드입니다.

from konlpy.tag import Hannanum
# 예시 문장
text = "한국어전처리는어렵지않아요"
# Hannanum 객체 생성
han = Hannanum()
# 띄어쓰기 교정
result = han.pos(text)
# 출력
print(" ".join([token[0] for token in result]))
한국어 전처리는 어렵지 않아요

6. 그 외의 전처리 과정 그 외에도 대문자/소문자 통일, 약어 및 줄임말 변환, 이모티콘 및 이모지 제거 등의 전처리 과정이 필요할 수 있습니다.

 

 

출처: https://wikidocs.net/21698