딥러닝과 자연어 처리(NLP)의 발전으로 많은 기업들이 텍스트 데이터를 분석하는 다양한 방법들을 모색하고 있습니다. 그 중에서도 BERT(Bidirectional Encoder Representations from Transformers)는 텍스트 데이터의 의미를 보다 깊이 이해하는 데 혁신적인 모델로 자리잡았습니다. 본 강좌에서는 허깅페이스의 트랜스포머(Transformers) 라이브러리를 이용해 모더나와 화이자 Covid-19 백신 관련 텍스트에서 [CLS] 벡터를 추출하는 방법을 다루겠습니다.
1. BERT 모델 소개
BERT는 구글에서 개발한 사전 학습된 언어 모델로, 주어진 문장의 컨텍스트를 이해하고 다양한 자연어 처리 태스크에 활용할 수 있습니다. BERT의 구조는 다음과 같습니다:
- Bidirectional: BERT는 문맥을 이해하기 위해 문장을 양방향으로 처리합니다. 이는 단어의 의미를 주변 단어들과의 관계에서 파악할 수 있게 합니다.
- Transformer: BERT는 Transformer 아키텍처를 기반으로 하며, self-attention 메커니즘을 통해 문장 내의 모든 단어 간의 관계를 학습합니다.
- [CLS] 토큰: BERT 모델에 입력되는 문장의 시작 부분에는 항상 [CLS]라는 특별한 토큰이 추가됩니다. 이 토큰의 벡터는 문장 전체의 의미를 표현하며, 분류 문제에서 중요한 역할을 합니다.
2. 허깅페이스 트랜스포머 라이브러리 설치
허깅페이스 트랜스포머 라이브러리는 자연어 처리 작업을 위한 다양한 모델과 토크나이저를 제공합니다. 설치는 다음과 같이 진행합니다:
pip install transformers torch
3. 데이터 준비
이제 모더나와 화이자 관련 문서들을 준비하겠습니다. 여기서는 예시로 간단한 문장들을 사용하겠습니다. 실제 사용 시에는 더 많은 데이터를 수집해야 합니다.
texts = [
"모더나 Covid-19 백신은 94.1%의 효능을 보였다.",
"화이자 백신의 효능은 95%로 보고되었다.",
"모더나와 화이자 백신은 mRNA 기술을 사용한다."
]
4. BERT 모델 로드 및 벡터 추출
BERT 모델과 토크나이저를 로드한 후, 입력 문장에 대한 [CLS] 벡터를 추출하는 방법을 소개하겠습니다.
from transformers import BertTokenizer, BertModel
import torch
# BERT 모델과 토크나이저 로드
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')
# 텍스트 입력
texts = [
"모더나 Covid-19 백신은 94.1%의 효능을 보였다.",
"화이자 백신의 효능은 95%로 보고되었다.",
"모더나와 화이자 백신은 mRNA 기술을 사용한다."
]
# [CLS] 벡터 추출
cls_vectors = []
for text in texts:
inputs = tokenizer(text, return_tensors='pt', truncation=True, padding=True)
outputs = model(**inputs)
cls_vector = outputs.last_hidden_state[0][0] # [CLS] 벡터
cls_vectors.append(cls_vector.detach().numpy())
5. 결과 분석
위 코드를 실행하면 각 문장에 대한 [CLS] 벡터가 추출됩니다. 이 벡터들은 문장의 의미를 고차원 공간에서 표현하므로, 이후 다른 NLP 태스크에 활용될 수 있습니다.
5.1. 벡터 시각화 예제
추출한 벡터를 시각화하거나 군집화하여 문장 간의 유사성 분석을 진행할 수 있습니다.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
# 벡터를 2차원으로 축소
pca = PCA(n_components=2)
reduced_vectors = pca.fit_transform(np.array(cls_vectors))
# 시각화
plt.figure(figsize=(10, 6))
for i, text in enumerate(texts):
plt.scatter(reduced_vectors[i, 0], reduced_vectors[i, 1])
plt.annotate(text, (reduced_vectors[i, 0], reduced_vectors[i, 1]))
plt.title('BERT [CLS] Vectors Visualization')
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.grid()
plt.show()
6. 결론
이번 강좌에서는 허깅페이스의 트랜스포머 라이브러리를 활용하여 BERT 모델로부터 모더나와 화이자 백신 관련 텍스트의 [CLS] 벡터를 추출하는 과정을 다루었습니다. 이를 통해 텍스트 데이터의 의미를 이해하고, 다양한 NLP 응용 프로그램에 활용할 수 있는 기초를 마련하였습니다.
이러한 기술들은 연구 논문, 사회적 여론 분석 등 많은 분야에서 활용될 수 있으며, 앞으로도 더욱 발전할 것입니다. 차후에는 이러한 벡터를 이용한 분류 문제나 감정 분석 같은 보다 다양한 응용 예제를 다룰 수 있도록 하겠습니다.