| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- KeyBert
- 트위치
- 블루아카이브 토픽모델링
- 붕괴 스타레일
- 자연어 모델
- 옵티마이저
- Roberta
- 클래스 분류
- 데이터리안
- BERTopic
- 개체명 인식
- 코사인 유사도
- 조축회
- LDA
- 블루 아카이브
- 데벨챌
- 데이터넥스트레벨챌린지
- 구글 스토어 리뷰
- 원신
- 피파온라인 API
- 문맥을 반영한 토픽모델링
- Tableu
- 토픽 모델링
- 포아송분포
- geocoding
- Optimizer
- CTM
- NLP
- SBERT
- 다항분포
- Today
- Total
분석하고싶은코코
NLP - 버토픽(BERTopic) 본문
버토픽(BERTopic)은 토픽 모델링의 기법중 하나입니다. BERTopic을 만든 개발자는 LDA를 대체할 수 있을 정도의 좋은 기술이라고 자부하고 있고 실제로 이를 이용한 사용자들에게도 좋은 모델로 평가 받고 있는 모델이라고 합니다. 그래서 이 버토픽에 대해서 어떻게 작동하는지 알아보고 직접 구현해보는 과정을 이번 포스팅에 작성해보겠습니다.
버토픽(BERTopic)의 구조
버토픽은 다음과 같은 순서로 작동합니다. 이번 글에서는 버토픽이 어떻게 동작하는지 이해하고 구현하는것에 포커스를 맞추기 때문에 UMAP과 HDBSCAN, c-TF-IDF에 대한 내용은 관련 레퍼런스 사이트 링크를 첨부하는 것으로 하겠습니다.
- 데이터를 임베딩합니다.
- UMAP을 사용하여 임베딩 차원을 줄이 HDBSCAN 기술을 이용하여 축소된 임베딩의 클러스터링 작업을 진행합니다.
- c-TF-IDF(클래스 or 토픽)을 통해서 토픽을 추출하고 MMR을 사용하여 최대한 다양한 토픽들을 선정합니다.

그런데 이 버토픽 역시 한국어를 대상으로 만든 것이 아니기 때문에 주의해야할 점이 있습니다. c-TF-IDF기반으로 마지막 토픽을 생성할때 버토픽은 CountVectorizer를 사용하게 되는데 기본 카운트벡터라이저는 이전에도 설명하였지만 띄어쓰기를 기준으로 진행됩니다. 그런데 한국어는 띄어쓰기를 기준으로 토큰화를 진행하는 것은 지양하기 때문에 KoNLPy에서 제공해주는 Tagger나 다른 토큰화 방법을 사용하여 적용해줄 필요가 있습니다.
BERTopic 구현해보기
!pip install bertopic[visualization]
!wget https://raw.githubusercontent.com/lovit/soynlp/master/tutorials/2016-10-20.txt
from tqdm import tqdm
from sklearn.feature_extraction.text import CountVectorizer
from konlpy.tag import Mecab
from bertopic import BERTopic
text_file = "2016-10-20.txt"
documents = [line.strip() for line in open(text_file, encoding="utf-8").readlines()]
preprocessed_documents = []
for line in tqdm(documents):
# 빈 문자열이거나 숫자로만 이루어진 줄은 제외
if line and not line.replace(' ', '').isdecimal():
preprocessed_documents.append(line)
class CustomTokenizer:
def __init__(self, tagger):
self.tagger = tagger
def __call__(self, sent):
sent = sent[:1000000]
word_tokens = self.tagger.morphs(sent)
result = [word for word in word_tokens if len(word) > 1]
return result
custom_tokenizer = CustomTokenizer(Mecab())
vectorizer = CountVectorizer(tokenizer=custom_tokenizer, max_features=3000)
MODEL_NAME = "sentence-transformers/xlm-r-100langs-bert-base-nli-stsb-mean-tokens"
model = BERTopic(embedding_model= MODEL_NAME, vectorizer_model=vectorizer, nr_topics=50, top_n_words=10, calculate_probabilities=True)
topics, probs = model.fit_transform(preprocessed_documents)
# 각 토픽의 정보 확인
# 토픽, 등장수, 상위 토픽, 토픽리스트, 예문 순서로 구성
model.get_topic_info()
# 분류된 토픽에 대한 시각화(버블 차트)
model.visualize_topics()
# 특정 Document에 대해서 Topic별 Probabilites를 확인.
model.visualize_distribution(probs[200], min_probability=0.015)
# Topic 별 Hierarchy를 보여준다.
model.visualize_hierarchy(top_n_topics=50)
# Topic을 대표하는 상위 단어 5개씩 보여준다.
model.visualize_barchart(top_n_topics=5)
# Topic간 유사도를 Cosine Similarity로 계산후 Heatmap으로 표현
model.visualize_heatmap(n_clusters=20, width=1000, height=1000)
# Topic내 대표하는 단어들에 대해서 c-tf-idf로 계산해서 각 단어가 Topic에서 차지하는 중요도를 계산했던 것을 Rank 순대로 보여준다.
model.visualize_term_rank()
결과(시각화 출력)
BERTopic이 matplotlib이 아니라 pyplot 모듈을 사용하여 시각화를 진행하고 있습니다. pyplot은 그래프를 동적으로 보여주기에 사용자가 그려진 그래프를 조작하여 다양하게 볼 수 있습니다. 밑에 있는 결과들은 스크린샷에 불과하니 직접 구현하여 BERTopic의 결과를 확인하는 것을 추천드립니다.






'머신러닝&딥러닝 > NLP' 카테고리의 다른 글
| 모바일 4가지 게임 리뷰 토픽 모델링 분석(2) (0) | 2023.10.11 |
|---|---|
| 모바일 4가지 게임 리뷰 토픽 모델링 분석(1) (0) | 2023.10.10 |
| NLP - CTM(Contextualized Topic Models) 토픽 모델링 (1) | 2023.10.09 |
| NLP - KeyBert 토픽 모델링 (1) | 2023.10.09 |
| NLP - 한국어 자연어 모델(Korean Language Model) (1) | 2023.10.06 |