NLP 기본 용어 및 개념 정리
1. 말뭉치와 토큰화
말뭉치 (Corpus)
: 원시 텍스트와 이에 관련된 메타데이터를 포함
시퀀스로 구성된 텍스트를 문자단위로 토큰화 한 것들의 모음
메타데이터에는 식별자, 레이블, 타임스탬프 등의 다양한 정보 포함
메타데이터 + 텍스트 들의 집합으로 말뭉치가 구성됨
토큰화(Tokenization)
: 텍스트를 토큰으로 나누는 과정
토큰화의 기준은 다 제각각 다름
- 텍스트 토큰화 예시
import spacy
from nltk.tokenize import TweetTokenizer
nlp = spacy.blank('en')
tokenizer = TweetTokenizer()
text = "Mary, don't slap the green witch"
tweet = u"Snow White and the Seven Degrees"
print("----------spacy---------")
print([str(token) for token in nlp(text.lower())])
# ['mary', ',', 'do', "n't", 'slap', 'the', 'green', 'witch']
print("----------nltk---------")
print(tokenizer.tokenize(tweet.lower()))
# ['snow', 'white', 'and', 'the', 'seven', 'degrees']
말뭉치에 등장하는 고유한 토큰을 타입이라고 하며 대부분의 토큰들이 타입형태이며, 말뭉치에 있는 모든 다입의 집합을 어휘 사전 및 어휘(lexicon)라고 한다.
단어는 content words. stopwords로 나뉘는데 이는 내용어와 불용어라는 뜻으로 관사와 전치사 같은 것들을 흔히 불용어라고 한다.
2. 기본 언어모델(N-gram)
N-gram은 텍스트에 있는 N의 길이(고정 길이)만큼 연속된 토큰 시퀀스이다.
유니그램은 1개, bi-gram은 2개의 토큰 이런 식으로 구성되어 있다.
def n_grams(text, n):
return [text[i:i+n] for i in range(len(text)-n+1)]
cleaned = ['mary',',',"n't", 'slap', 'green', 'witch','.']
print(n_grams(cleaned, 3))
"""
[['mary', ',', "n't"], [',', "n't", 'slap'], ["n't", 'slap', 'green'], ['slap', 'green', 'witch'], ['green', 'witch', '.']]
"""
3. 표제어와 어간
-표제어
표제어는 단어의 기본형으로써, 사전에 등재된 단어로 볼 수 있다.
예시로 날다의 fly는 flow, flew 등 다양한 표현으로 변형이 되는데 fly가 이 단어들의 표제어이다.
토큰을 표제어로 바꾸면 벡터 표현의 차원을 줄일 수 있다고 한다.
이런 축소화를 lemmatization이라고 한다.
아래 예시를 보면 running의 경우 표제어가 run인 것을 볼 수 있다.
import spacy
nlp = spacy.blank('en')
doc = nlp(u"he was running late")
for token in doc:
print('{} --> {}'.format(token, token.lemma_))
"""
he --> he
was --> was
running --> run
late --> late
"""
- 어간
수동으로 만든 규칙을 이용해 단어의 끝을 잘라서 어간(stem)이라는 공통형태로 축소를 하는 방법으로
또 다른 축소 기법이다.
from nltk.stem.porter import *
stemmer = PorterStemmer()
tokens = ['compute', 'computer', 'computed', 'computing']
for token in tokens:
print(token + ' --> ' + stemmer.stem(token))
"""
compute --> comput
computer --> comput
computed --> comput
computing --> comput
"""
4. 문장 구조
구 사이의 관계를 파악하는 구문분석에는 구성구문분석과 의존 구문분석 기법이 있다.
입력 문장에 대해서 트리 형태로 문법 구조를 분석해서 분석 결과를 트리의 노드로 나타낸다.
그러나 이의 단점은 문장의 형태에 따라서 같은 단어라도 다른 문법 구조를 가질 수 있기 때문에 결과가 매번 같을 수는 없다.