관리 메뉴

개발자의 스터디 노트

NLP 기술 요약 본문

카테고리 없음

NLP 기술 요약

박개발씨 2022. 2. 9. 00:21

 

1. 말뭉치, 토큰, 타입

1.1 말뭉치

 - 고전이나 현대의 모든 NLP 작업은 말뭉치(corpus)라 부르는 텍스트 데이터로 시작합니다. 말뭉치는 일반적으로 원시 텍스트와 이 텍스트에 연관된 메타데이터를 포함합니다. 원시 텍스트는 문자 시퀀스지만 일반적으로 문자를 토큰(token)이라는 연속된 단위로 묶었을 때 유용합니다. 메타데이터는 식별자, 레이블, 타임스탬프 등 텍스타와 관련된 어떤 부가 정보도 될 수 있습니다. 머신러닝 분야에서는 메타데이터가 붙은 텍스트를 샘플(sample) 또는 데이터 포인트(data point)라고 부릅니다. 샘플의 모음인 말뭉치는 데이터셋(dataset)이라고 부릅니다.

데이터셋

 

2. 토큰화(tokenization)

 - 텍스트를 토큰으로 나누는 과정을 의미합니다.

2.1 텍스트 토큰화(NLTK, spaCy)

import spacy
nlp = spacy.load('en_core_web_sm')
text = "Mary, don't slap the green witch"
print([str(token) for token in nlp(text.lower())])

['mary', ',', 'do', "n't", 'slap', 'the', 'green', 'witch']
from nltk.tokenize import TweetTokenizer
tweet=u"Snow White and the Seven Degrees #MakeAMovieCold@midnight:-)"
tokenizer = TweetTokenizer()
print(tokenizer.tokenize(tweet.lower()))

['snow', 'white', 'and', 'the', 'seven', 'degrees', '#makeamoviecold', '@midnight', ':-)']

 * 타입(type)은 말뭉치에 등장하는 고유한 토큰입니다. 말뭉치에 있는 모든 타입의 집합이 어휘 사전 또는 어휘입니다. 단어는 내용어(content word)와 불용어(stopword)로 구분됩니다. 관사와 전치사 같은 불용어는 대부분 내용어를 보충하는 문법적인 용도로 사용합니다.

 

2. 2 유니그램, 바이그램, 트라이그랩,...., n-그램

 - n-그램은 텍스트에 있는 고정 길이(n)의 연속된 토큰 시퀀스입니다. 바이그램은 토큰 두 개. 유니그램은 토큰 한 개로 이루어집니다.

# 텍스트에서 n-그램 만들기
def n_grams(text, n):
    '''
    takes tokens or text, returns a list of n-grams
    '''
    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. 표제어와 어간

 - 표제어는 단어의 기본형입니다. 토큰을 표제어로 바꾸어 벡터 표현의 차원을 줄이는 방법이 종종 도움이 됩니다.

# 표제어 추출
import spacy
nlp = spacy.load('en_core_web_sm')
doc = nlp(u"he was running late")
for token in doc:
    print('{} --> {}'.format(token, token.lemma_))

he --> he
was --> be
running --> run
late --> late

 

4. 단어 분류하기: 품사태킹

 - 문서에 레이블을 할당하는 개념을 단어나 토큰으로 확장할 수 있습니다. 단어 분류 작업의 예로는 품사(part-of-speech,POS) 태깅(tagging)이 있습니다.

#품사 태킹
import spacy
nlp = spacy.load('en_core_web_sm')
doc = nlp(u"Mary slappend the green witch.")
for token in doc:
    print('{} --> {}'.format(token, token.pos_))
    
    
Mary --> PROPN
slappend --> VERB
the --> DET
green --> ADJ
witch --> NOUN
. --> PUNCT

 

5. 청크 나누기와 개체명 인식

 - 종종 연속된 여러 토큰으로 구분되는 텍스트 구에 레이블을 할당해야 합니다. "Mary slapped the green witch." 문장을 예로 들어봅시다. 다음처럼 명사구(NP)와 동사구(VP)를 구별해야 합니다. 이를 청크 나누기(chunking) 또는 부분 구문 분속(shallow parsing) 이라고 합니다. 부분 구문 분석의 목적은 명사, 동사, 형용사 같은 문법 요소로 구성된 고차원의 단위를 유도해 내는 것입니다.

#구문 분석
import spacy
nlp = spacy.load('en_core_web_sm')
doc = nlp(u"Mary slappend the green witch.")
for chunk in doc.noun_chunks:
    print('{} --> {}'.format(chunk, chunk.label_))

Mary --> NP
the green witch --> NP

 - 또 다른 유용한 단위는 개체명(named entity) 입니다. 개체명은 사람, 장소, 회사, 약 이름과 같은 실제 세상의 개념을 의미하는 문자열입니다.

 

 

6. 문장 구조

Mary slapped the green witch. 의 문장 구문 분석

 

7. 단어 의미와 의미론

 - 단어에는 의미가 하나 이상 있습니다. 단어가 나타내는 각각의 뜻을 단어의 의미(sense)라고 합니다. 단어 의미는 문맥으로 결정될 수도 있습니다. 텍스트에서 단어 의미를 자동으로 찾는 일은 실제로 NLP에 적용된 첫 번째 준지도 학습입니다.