자연어처리에서 전처리의 몇 가지 방법과 예제

신 영·2024년 3월 20일
2

자연어처리(NLP)

목록 보기
4/18

✅자연어처리의 전처리 개요

모든 분석이 그렇듯, 자연어처리에서도 전처리에 따라 결과가 크게 다르다. 그렇다면 전처리에는 대략적으로 어떤 과정이 포함되는지 알아보자.

  • 토큰화(Tokenization): 텍스트를 작은 단위로 나누는 과정이다. 보통은 단어 또는 문장으로, 한국어는 형태소로 텍스트를 토큰화한다.
  • 소문자 변환(Lowercasing): 대소문자를 통일시키기 위해 모든 문자를 소문자로 변환한다. 한국어에서는 이 과정이 필요 없다.
  • 불용어 제거(Stopword Removal): 불용어(stopword)는 문장의 의미에 큰 영향을 미치지 않는 단어이다. 예를 들어 "the", "and", "is" 등이 있다. 이러한 불용어는 제거하여 모델의 학습을 더욱 효율적으로 만든다.
  • 특수 문자 제거(Removal of Special Characters): 문장에서 의미가 없거나 불필요한 특수 문자를 제거한다. 예를 들어 문장 부호, URL, 이모지 등이 있다.
  • 어간 추출(Stemming) 또는 표제어 추출(Lemmatization): 단어의 원형을 찾아 일반화하는 과정이다. 어간 추출은 단어의 접미사나 어미를 제거하여 원형을 찾는 반면, 표제어 추출은 사전을 사용하여 단어를 원형으로 변환한다.
  • 토큰 정제(Token Normalization): 동일한 의미를 갖는 다양한 형태의 단어를 하나의 형태로 통일하는 과정이다. 예를 들어 "running", "ran", "runs"는 모두 "run"으로 통일될 수 있다.

이 중 토큰화와 관련된 자세한 내용은 이전 포스팅에서 다루었다. 이번 포스팅에서는 한국어 자연어처리의 전처리 과정 중 일부를 실습해 보자.

✅불용어 제거

sentence = "너가 나를 좋아하는 것보다 내가 훨씬 더 너를 좋아해."
stop_words = ['은', '는', '이', '가', '을', '를', '의', '더']

hannanum_tokens = hannanum.morphs(sentence)
kkma_tokens = kkma.morphs(sentence)
komoran_tokens = komoran.morphs(sentence)
okt_tokens = okt.morphs(sentence)

result_hannanum = [word for word in hannanum_tokens if not word in stop_words]
result_kkma = [word for word in kkma_tokens if not word in stop_words]
result_komoran = [word for word in komoran_tokens if not word in stop_words]
result_okt = [word for word in okt_tokens if not word in stop_words]

print('hannanum으로 토큰화 이후 불용어 제거 :', result_hannanum) 
print('kkma로 토큰화 이후 불용어 제거 :', result_kkma) 
print('komoran로 토큰화 이후 불용어 제거 :', result_komoran) 
print('okt로 토큰화 이후 불용어 제거 :', result_okt)
----------
hannanum으로 토큰화 이후 불용어 제거 : ['너', '나', '좋', '아', '하', '것', '보다', '나', '훨씬', '너', '좋', '아', '하', '어', '.']
kkma로 토큰화 이후 불용어 제거 : ['너', '나', '좋아하', '것', '보다', '나', '훨씬', '너', '좋아하', '어', '.']
komoran로 토큰화 이후 불용어 제거 : ['너', '나', '좋아하', '것', '보다', '내', '훨씬', '너', '좋아하', '아', '.']
okt로 토큰화 이후 불용어 제거 : ['너', '나를', '좋아하는', '것', '보다', '내', '훨씬', '너', '좋아해', '.']

✅사용자 사전 추가

지난 포스팅에서 pos(품사 추출)을 했을 때 제대로 안 나오는 경우가 있었다. 문장 분석, 형태소 분석, 불용어 처리 등등을 하고 나서도 안되는 것은 사용자 사전에 추가할 수 있다. 예제로 살펴보자.

!pip install customized_konlpy

from ckonlpy.tag import Twitter
twitter = Twitter()

twitter.pos(sentence)
----------
[('너', 'Noun'), ('가', 'Josa'), ('나를', 'Verb'), ('좋', 'Adjective'), ('아하', 'Noun'), ('는', 'Josa'), ('것', 'Noun'), ('보다', 'Josa'), ('내', 'Noun'),
 ('가', 'Josa'), ('훨씬', 'Adverb'), ('더', 'Noun'), ('너', 'Noun'), ('를', 'Josa'), ('좋', 'Adjective'), ('아해', 'Noun'), ('.', 'Punctuation')]

여기서 ('나를', 'Verb') 이 부분만 사용자 사전에 추가하여 제대로 나오도록 해보자.

twitter.add_dictionary('나', 'Noun')
twitter.add_dictionary('를', 'Josa')
twitter.pos(sentence)
----------
[('너', 'Noun'), ('가', 'Josa'), ('나', 'Noun'), ('를', 'Josa'), ('좋', 'Adjective'), ('아하', 'Noun'), ('는', 'Josa'), ('것', 'Noun'), ('보다', 'Josa'),
 ('내', 'Noun'), ('가', 'Josa'), ('훨씬', 'Adverb'), ('더', 'Noun'), ('너', 'Noun'), ('를', 'Josa'), ('좋', 'Adjective'), ('아해', 'Noun'), ('.', 'Punctuation')]

이제 ('나', 'Noun'), ('를', 'Josa')로 제대로 나오는 것을 확인할 수 있다.

✅정리

이번 포스팅에서는 자연어처리의 전처리에서 활용할 수 있는 몇 가지 방법을 실습해 보았다.


📖 참고
https://wikidocs.net/21698

0개의 댓글

관련 채용 정보