[nlp] 자연어처리 기초 용어 모음집(token, pos tagging, stopword, corpus, stemming, ...)
목차
0. nlp(자연어처리)
인간의 언어를 컴퓨터가 이해할 수 있도록 처리하는 기술
1. nltk
토크나이징, 어간 추출, 품사 태깅 등 자연어 처리에 사용하는 파이썬 모듈
import nltk
print(dir(nltk.corpus)) # 말뭉치 목록 확인
2. 말뭉치(corpus)
자연어처리를 위한 목적으로 정리해놓은 문서 집합
import nltk
nltk.download('movie_reviews') # 말뭉치 중 'movie_reviews' 다운로드
from nltk.corpus import movie_reviews
nltk.corpus 패키지는 다양한 연구용 말뭉치를 제공합니다.
말뭉치 자료를 사용하려면 nltk.download 명령으로 다운받으면 됩니다.
3. 토크나이징(tokenizing)
자연어 분석을 위해 주어진 긴 문자열(=코퍼스)을 작은 단위(=토큰)로 나누는 것
from konlpy.tag import Okt #한글 형태소 분석기
docs = ['예상대로 테슬라는 재고가 늘었고 가격 인하로 이익률이 떨어지며 순이익이 줄었다.',
'테슬라는 현재 전세계 전기차시장의 약 5분의 1을 점하고 있다.',
'물론 전기차시장의 경쟁이 치열해지면 테슬라의 시장점유율은 하락할 것으로 전망된다.']
t = Okt()
tokens = [t.morphs(doc) for doc in docs] #각 문장마다 형태소 추출
for token in tokens:
print(token)
문자열을 토큰으로 분리하는 함수인 tokenizer를 사용하거나 정규표현식을 통해 문자열을 토큰화할 수 있습니다.
4. konlpy
한국어 기반의 자연어 처리 시 사용하는 파이썬 패키지
from konlpy.tag import Okt
from konlpy.tag import Kkma
*konlpy 패키지를 구성하는 클래스로는 Twitter(=Okt), Kkma, Komoran 등이 있습니다.
5. 형태소 분석
형태소를 비롯하여 어근, 접미사/접두사, 품사 등 다양한 언어적 속성 및 구조를 파악하는 것
*형태소(morpheme) - 일정한 의미를 가지는 말의 가장 작은 단위
형태소 분석의 예로는 어간 추출(stemming), 표제어 추출(lemmatizing), 품사 태깅(Part-Of-Speech tagging)이 있습니다.
6. 어간 추출(stemming)
접미사나 어미를 제거하여 핵심 의미를 담은 기본형을 찾아 주는 방식
from nltk.stem import PorterStemmer, LancasterStemmer, SnowballStemmer, RegexpStemmer
p = PorterStemmer()
l = LancasterStemmer()
s = SnowballStemmer()
r = RegexpStemmer()
words = ['eat', 'ate', 'eats', 'eaten', 'eating']
print('Porter stemmer:', [p.stem(w) for w in words])
print('Lancaster stemmer:', [l.stem(w) for w in words])
print('Snowball stemmer:', [l.stem(w) for w in words])
print('Regexp stemmer:', [l.stem(w) for w in words])
nltk의 어간 추출 패키지로는 PorterStemmer, LancasterStemmer, SnowballStemmer 등이 있습니다.
정해진 규칙으로 어미를 자르기 때문에 어간 추출 후에 나타나는 결과 단어들은 사전적 단어가 아닐 수 있습니다.
7. 표제어 추출(lemmatizing)
단어의 표제어 즉, 사전적 단어를 찾는 것 (am, are, is -> be)
# import nltk
from nltk.stem import WordNetLemmatizer
# nltk.download('wordnet')
lemmatizer = WordNetLemmatizer()
words = ['feet', 'worse', 'expressions', 'corpora', 'lives', 'watched']
for word in words:
result_word = lemmatizer.lemmatize(word)
print('표제어 추출 전: {}, 표제어 추출 후: {}'.format(word, result_word))
print(lemmatizer.lemmatize('watched', 'v'))
표제어추출기(lemmatizer)가 품사 정보를 미리 알고 있어야 표제어 추출이 잘 진행될 수 있습니다.
watched의 품사를 동사(v)로 명시하니 정확한 결과를 출력했습니다.
8. 품사 태깅(Part-Of-Speech tagging)
단어에 품사를 부착한 것
*품사 - 문법에 따라 단어를 몇 가지로 묶어 놓은 것
from konlpy.tag import Okt
docs = ['예상대로 테슬라는 재고가 늘었고 가격 인하로 이익률이 떨어지며 순이익이 줄었다.',
'테슬라는 현재 전세계 전기차시장의 약 5분의 1을 점하고 있다.',
'물론 전기차시장의 경쟁이 치열해지면 테슬라의 시장점유율은 하락할 것으로 전망된다.']
t = Okt()
poses = [t.pos(doc) for doc in docs] #각 문장마다 품사를 붙여 반환
for pos in poses:
print(pos)
각 단어에 태깅된 품사의 의미는 tagset 속성을 통해 파악할 수 있습니다.
print(t.tagset)
9. 불용어(stopword)
분석에 있어 의미가 없는 단어들
nltk에서는 stopwords라는 패키지로 불용어를 정의하고 있으며 개발자가 직접 불용어를 정의할 수도 있습니다.
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from konlpy.tag import Okt
# nltk.download('punkt')
# nltk.download('stopwords')
stop_words = stopwords.words('english')
doc = 'A 17-year-old girl named Suzume helps a mysterious young man close doors \
from the outer side that are releasing disasters all over in Japan.'
tokens = word_tokenize(doc)
result = []
for token in tokens:
if token not in stop_words:
result.append(token)
print('불용어 제거 전:', tokens)
print('불용어 제거 후:', result)
10. N-gram
연속된 n개의 단어 나열
토큰이 1개이면 유니그램(unigram), 2개이면 바이그램(bigram), 3개일 경우 트라이그램(trigram)이라고 합니다.
n이 4 이상일 경우는 4-gram과 같이 숫자를 붙여서 부릅니다.
예를 들어 Thank you for visiting keepgoing blog라는 문장이 존재할 경우, n-gram을 나타내면 다음과 같습니다.
유니그램 Thank, you, for, visiting, keepgoing, blog
바이그램 Thank you, for visiting, keepgoing blog
트라이그램 Thank you for, visiting keepgoing blog