Search
Duplicate

2-2 N-그램

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
복사
이전 글 읽기
다음 글 읽기