n-그램(n-gram)은 고정 길이(n)의 연속된 토큰 시퀀스입니다. 유니그램(unigram)은 토큰 한 개, 바이그램(bigram)은 토큰 두 개로 이루어집니다. 토큰 n개로 이루어져 있다면 n-그램이 됩니다. 앞서 활용했던 spaCy와 NLTK 같은 패키지를 활용하면 n-그램을 편리하게 만들 수 있습니다.
n-그램을 사용하는 이유는 하나의 토큰으로 정확한 의미를 파악하기 힘든 경우가 있기 때문입니다. 앞뒤 문맥에 따라 같은 단어도 다른 의미를 갖는 경우가 있으므로, 말뭉치에서 n개의 단어 뭉치로 끊어 하나의 토큰으로 간주한다면 좀 더 효율적으로 문장의 의미를 분석할 수 있게 됩니다. 다만, n을 너무 크게 잡을 경우 희소성, 모델 사이즈가 커지는 등의 문제가 있기 때문에 최대 5를 넘게 사용하지 않는 것으로 권장되고 있습니다.
다음은 간단히 unigram, bigram, n-gram을 구현한 코드입니다. 이해를 돕기 위해 간단한 텍스트로 예시를 든 것이므로, 복잡한 말뭉치를 토큰화할 경우 여러 패키지에서 제공하는 도구를 사용하는 것이 더 효율적입니다.
import re
def n_gram(text, n):
#uni_gram
text_low = text.lower()
text_low = re.sub('(\W+)', ' ', text_low)
words = text_low.split(' ')
if '' in words:
words.remove('')
#bi_gram
if n == 2:
bi_words = []
for i in range(len(words) - 1):
bi_words.append(' '.join(words[i:i+2]))
return bi_words
#n_gram
n_words = []
for i in range(len(words) - n + 1):
n_words.append(' '.join(words[i:i+n]))
return n_words
#예시
text = "Yes, I can do it!"
>>> n_gram(text, 1) #uni_gram
['yes', 'i', 'can', 'do', 'it']
>>> n_gram(text, 2) #bi_gram
bigram = ['yes i', 'i can', 'can do', 'do it']
>>> n_gram(text, 3) #tri_gram
trigram = ['yes i can', 'i can do', 'can do it']
Python
복사
이전 글 읽기
다음 글 읽기