[파이썬] Gensim의 활용 사례 스터디

Gensim은 Python에서 자연어 처리 및 토픽 모델링을 포함한 다양한 텍스트 처리 작업을 수행하는 데 사용되는 오픈 소스 라이브러리입니다. Gensim을 사용하면 간단하게 텍스트 문서를 처리하고, 단어 임베딩, 토픽 모델링, 유사도 계산 등 다양한 자연어 처리 작업을 수행할 수 있습니다. 이번 포스트에서는 Gensim의 주요 기능과 활용 사례에 대해 알아보겠습니다.

단어 임베딩

Gensim은 단어 임베딩 작업을 위한 Word2Vec 모델을 제공합니다. Word2Vec은 단어를 벡터로 표현하는 기법으로, 단어 간의 의미적 유사도 계산이 가능해집니다. 아래는 Gensim을 사용하여 Word2Vec 모델을 생성하고, 단어 간의 유사도를 계산하는 예제 코드입니다.

from gensim.models import Word2Vec

# 텍스트 문서를 준비합니다.
sentences = [["apple", "banana", "orange"], ["computer", "laptop", "keyboard"], ["cat", "dog", "bird"]]

# Word2Vec 모델을 생성합니다.
model = Word2Vec(sentences, min_count=1)

# 단어 간의 유사도를 계산합니다.
similarity = model.similarity("apple", "banana")
print(f"Similarity between 'apple' and 'banana': {similarity}")

위의 코드에서 min_count 매개변수는 Word2Vec 모델을 학습할 때 최소 단어 빈도를 설정하는 것입니다. 이를 사용해 더 유의미한 단어 임베딩을 얻을 수 있습니다.

토픽 모델링

Gensim은 토픽 모델링 알고리즘 중 하나인 Latent Dirichlet Allocation (LDA)를 구현한 기능을 제공합니다. LDA를 사용하면 주어진 문서 집합에서 각 문서의 토픽 분포와 각 토픽의 단어 분포를 추정할 수 있습니다.

from gensim.models import LdaModel
from gensim.corpora import Dictionary

# 텍스트 문서를 준비합니다.
documents = ["apple banana orange", "computer laptop keyboard", "cat dog bird"]

# 문서 집합을 단어의 Bag-of-Words로 변환합니다.
texts = [[word for word in document.lower().split()] for document in documents]
dictionary = Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]

# LDA 모델을 학습합니다.
num_topics = 2
model = LdaModel(corpus, num_topics=num_topics, id2word=dictionary, passes=10)

# 각 문서의 토픽 분포를 확인합니다.
for i, document in enumerate(corpus):
    topic_distribution = model[document]
    print(f"Document {i+1} : {topic_distribution}")

# 토픽별로 상위 단어들을 확인합니다.
for topic in model.show_topics(num_topics=num_topics):
    print(topic)

위의 코드에서 passes 매개변수는 LDA 모델을 학습할 때의 반복 횟수를 의미합니다. num_topics는 사용자가 지정한 토픽의 수를 나타냅니다.

유사도 계산

Gensim을 사용하면 문서나 단어 간의 유사도를 계산할 수 있습니다. similarity() 메소드를 통해 두 문서나 두 단어 간의 유사도를 계산할 수 있습니다.

from gensim import similarities

# 문서 집합을 단어의 Bag-of-Words로 변환합니다. (위의 LDA 예제와 동일)
texts = [[word for word in document.lower().split()] for document in documents]
corpus = [dictionary.doc2bow(text) for text in texts]

# 유사도 계산을 위한 임시 문서 준비
query_document = "orange"
query_text = [word for word in query_document.lower().split()]
query_corpus = dictionary.doc2bow(query_text)

# TF-IDF 모델을 생성하여 유사도 계산
tfidf = models.TfidfModel(corpus)
index = similarities.SparseMatrixSimilarity(tfidf[corpus], num_features=len(dictionary))
similarities = index[tfidf[query_corpus]]

# 유사도 결과를 출력합니다.
for i, similarity in enumerate(similarities):
    print(f"Similarity between query and document {i+1}: {similarity}")

위의 코드에서는 SparseMatrixSimilarity를 사용하여 TF-IDF 모델을 기반으로 문서의 유사도를 계산합니다. 유사도 계산 결과는 0과 1 사이의 값으로 표현되며, 두 문서 간의 유사도가 1에 가까울수록 유사한 것입니다.

이렇게 Gensim을 사용하면 텍스트 문서를 처리하고 다양한 자연어 처리 작업을 수행할 수 있습니다. Gensim은 강력하고 유연한 자연어 처리 도구로서, 다양한 분야에서 활용될 수 있습니다.