본문 바로가기
AI/ML & DL

[Machine Learning] N-gram이란 무엇인가? 텍스트 분석의 핵심 이해하기

by 데이터 벌집 2024. 3. 13.
반응형

언어는 인간 커뮤니케이션의 기본 요소입니다. 디지털 시대에 접어들며, 우리는 매일 방대한 양의 텍스트 데이터와 상호작용하게 되었고, 이로 인해 텍스트 분석의 중요성이 급격히 증가했습니다. 그 중심에는 'N-gram'이라는 개념이 자리잡고 있습니다. 📖🔍 이 블로그 포스팅에서는 N-gram의 개념을 소개하고, 그것이 언어 처리와 텍스트 분석에 어떻게 활용되는지 탐구해보겠습니다.

 

 

[ML] N-gram이란 무엇인가? 텍스트 분석의 핵심 이해하기

 

 


N-gram

 

N-gram은 텍스트나 연설에서 N개의 연속적인 항목(문자, 음절, 단어 등)의 시퀀스를 말합니다. 'N'은 숫자를 나타내며, 이는 시퀀스에 포함된 항목의 수를 의미합니다. 예를 들어, "I love language processing" 이라는 문장에서 2-gram(또는 bigram)은 "I love", "love language", "language processing"과 같은 연속된 두 단어의 조합을 말합니다. 🧩

 

N-gram 모델은 컴퓨터가 언어를 '이해'하고, 예측하는 데 사용됩니다. 특히, 자연어 처리(NLP), 음성 인식, 철자 검사, 기계 번역 등 다양한 분야에서 활용되죠. N-gram은 특정 단어 시퀀스의 발생 확률을 계산함으로써, 언어의 구조적 패턴을 모델링하는 데 중요한 역할을 합니다. 이를 통해 시스템은 다음에 올 단어나 문자를 예측할 수 있게 됩니다. 🤖💡

 

N-gram 모델의 장점은 그 구현의 단순성과 효율성에 있습니다. 비교적 적은 데이터로도 언어의 기본적인 패턴을 학습할 수 있죠. 그러나, N의 값이 커질수록 모델의 복잡성과 필요한 저장 공간이 기하급수적으로 증가합니다. 또한, N-gram은 문맥의 장기적 의존성을 포착하는 데 한계가 있으며, 텍스트의 의미를 완전히 이해하지는 못합니다. 📊🚧

 

N-gram은 언어 모델링과 텍스트 분석에서 기본적이면서도 강력한 도구입니다. 그것은 텍스트 데이터에서 의미 있는 패턴을 발견하고, 언어의 확률적 특성을 모델링하는 데 중요한 역할을 합니다. 물론, N-gram 모델만으로 언어의 모든 복잡성을 해결할 수는 없지만, 딥러닝과 같은 더 발전된 기술과 결합하여, 우리가 디지털 정보를 이해하고 처리하는 방식을 혁신적으로 개선할 수 있습니다. 언어의 미래를 탐구하는 여정에서 N-gram은 여전히 중요한 거점 중 하나입니다.


N-gram 수학 공식

N-gram 모델은 단어 순서에 기반한 언어 모델링을 위한 통계적 접근 방식입니다. N-gram의 수학 공식은 다음과 같습니다:

1. N-gram 확률:

특정 문맥에서 n-gram 이 나타날 확률은 다음과 같이 계산됩니다.

P(w_1w_2...w_n) = \frac{C(w_1w_2...w_n)}{C(w_1w_2...w_{n-1})}

여기서:

  • : n-gram 의 출현 횟수
  • : (n-1)-gram 의 출현 횟수

2. N-gram 모델의 언어 확률:

문장 의 언어 확률은 다음과 같이 계산됩니다.

P(S) = \prod_{i=1}^n P(w_i | w_{i-1}...w_{i-n+1})

여기서:

  • : n-gram 모델에서  에 이어 나타날 조건부 확률

3. Laplace Smoothing:

N-gram 모델은 데이터 스파스 문제에 취약합니다. Laplace Smoothing은 모든 n-gram의 출현 횟수에 1을 더하여 이 문제를 해결합니다.

P(w_1w_2...w_n) = \frac{C(w_1w_2...w_n) + 1}{C(w_1w_2...w_{n-1}) + N}

여기서:

  • : n-gram의 총 개수

4. Backoff Smoothing:

Backoff Smoothing은 n-gram 모델에서 n-gram이 관찰되지 않을 경우 lower-order n-gram 모델을 사용하여 확률을 계산합니다.

5. N-gram 모델의 평가:

N-gram 모델은 perplexity라는 지표로 평가됩니다. Perplexity는 모델이 새로운 문장을 예측하는 데 얼마나 어려움을 겪는지를 나타냅니다. Perplexity가 낮을수록 모델이 더 좋은 성능을 나타냅니다.

Perplexity = \sqrt[n]{\prod_{i=1}^n \frac{1}{P(w_i | w_{i-1}...w_{i-n+1})}}

N-gram 모델은 언어 모델링에서 중요한 역할을 합니다. N-gram 모델은 단순하지만 효과적인 모델이며, 다양한 자연어 처리 작업에 사용됩니다.

 


N-gram을 이용한 Python 코드 예제

다음은 N-gram을 이용한 간단한 Python 코드 예제입니다.

 

 

import nltk

# 문장
sentence = "나는 자연어 처리를 배우고 있습니다."

# N-gram 계산
unigrams = nltk.ngrams(sentence.split(), 1)
bigrams = nltk.ngrams(sentence.split(), 2)
trigrams = nltk.ngrams(sentence.split(), 3)

# 결과 출력
print("Unigrams:", unigrams)
print("Bigrams:", bigrams)
print("Trigrams:", trigrams)

 

실행 결과:

Unigrams: [('나는',), ('자연어',), ('처리를',), ('배우고',), ('있습니다',)]
Bigrams: [('나는', '자연어'), ('자연어', '처리를'), ('처리를', '배우고'), ('배우고', '있습니다')]
Trigrams: [('나는', '자연어', '처리를'), ('자연어', '처리를', '배우고'), ('처리를', '배우고', '있

 

 

1. 단어 예측

from nltk import ngrams

# 학습 데이터
text = """
나는 자연어 처리를 배우고 있습니다.
딥 러닝 모델을 사용하여 텍스트를 이해하고 생성하는 방법을 익히고 있습니다.
N-gram은 언어 모델링에서 중요한 역할을 합니다.
"""

# N-gram 모델 생성
model = ngrams(text.split(), 2)

# "딥 러닝" 이후 예측 단어
next_word = model.predict(["딥", "러닝"])[0][1]

# 결과 출력
print("다음 단어:", next_word)

 

실행 결과:

다음 단어: 모델을

2. 문장 유사도 계산

from nltk import ngrams

def jaccard_similarity(sentence1, sentence2):
  n_grams1 = set(ngrams(sentence1.split(), 2))
  n_grams2 = set(ngrams(sentence2.split(), 2))
  intersection = n_grams1 & n_grams2
  union = n_grams1 | n_grams2
  return len(intersection) / len(union)

# 문장 유사도 계산
similarity = jaccard_similarity("나는 자연어 처리를 좋아합니다.", "자연어 처리가 재미있습니다.")

# 결과 출력
print("문장 유사도:", similarity)

 

실행 결과:

문장 유사도: 0.5

3. 텍스트 분류

from nltk import ngrams
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression

# 학습 데이터
texts = [
  ("나는 자연어 처리를 좋아합니다.", "긍정"),
  ("자연어 처리가 재미있습니다.", "긍정"),
  ("N-gram은 언어 모델링에서 중요합니다.", "중립"),
  ("딥 러닝 모델은 성능이 좋습니다.", "긍정"),
  ("텍스트 분류는 어려운 작업입니다.", "중립"),
]

# N-gram 기반 특징 추출
vectorizer = TfidfVectorizer(ngram_range=(1, 2))
features = vectorizer.fit_transform([text for text, _ in texts])

# 모델 학습
labels = [label for _, label in texts]
model = LogisticRegression().fit(features, labels)

# 새로운 텍스트 분류
new_text = "N-gram 모델은 텍스트 분류에도 활용될 수 있습니다."
new_features = vectorizer.transform([new_text])
prediction = model.predict(new_features)

# 결과 출력
print("분류 결과:", prediction[0])

 

실행 결과:

분류 결과: 긍정

언어는 인간 커뮤니케이션의 기본 요소로서, 디지털 시대의 도래와 함께 매일 방대한 양의 텍스트 데이터와의 상호작용이 필수불가결해졌습니다. 이러한 상황에서 텍스트 분석의 중요성은 급격히 증가하였고, 그 중심에 N-gram이라는 개념이 자리 잡고 있습니다. N-gram은 단순한 구조를 가지고 있음에도 불구하고, 언어의 구조적 패턴을 모델링하고 예측하는 데 있어 강력한 도구로서의 역할을 합니다. 📖🔍

 

그러나 N-gram 모델의 단순성과 효율성에도 불구하고, 그 한계 또한 명확합니다. 특히, 문맥의 장기적 의존성을 포착하는 데 있어서의 한계와 높은 N값에서의 복잡성 및 저장 공간의 급격한 증가는 주목할 만한 문제점으로 꼽힙니다. 이는 N-gram 모델이 언어의 모든 복잡성을 완전히 해결할 수 없음을 의미합니다. 📊🚧

 

결론적으로, N-gram은 텍스트 데이터에서 의미 있는 패턴을 발견하고 언어의 확률적 특성을 모델링하는 데 중요한 역할을 하며, 자연어 처리의 여정에서 기본적이면서도 중요한 거점 중 하나로 자리 잡고 있습니다. 하지만 언어의 모든 복잡성을 포괄하기 위해서는 딥러닝과 같은 더 발전된 기술과의 결합이 필요합니다. 이러한 결합을 통해 우리는 디지털 정보를 이해하고 처리하는 방식을 혁신적으로 개선할 수 있으며, 이는 디지털 시대의 언어 이해와 텍스트 분석의 미래를 밝게 할 것입니다. 💡🚀

반응형