
옥시 (주제 모델 최적화 및 비교)는 주제 모델을 훈련, 분석 및 비교하는 데있어서, 최적의 하이퍼 파라미터가 베이지안 최적화 접근법을 통해 추정되는 것을 목표로합니다. 이 작업은 EACL2021의 데모 트랙에 받아 들여졌습니다. 종이를 읽으려면 클릭하십시오!
목차
다음 명령으로 옥시를 설치할 수 있습니다.
PIP 설치 낙지
요구 사항 .txt 파일에서 요구 사항을 찾을 수 있습니다.
옥시를 사용하는 방법을 쉽게 이해하기 위해 튜토리얼을 시도해 보도록 초대합니다. :)
| 이름 | 링크 |
|---|---|
| 주제 모델을 구축하고 결과를 평가하는 방법 (20Newsgroups의 LDA) | |
| 신경 주제 모델의 초 파라미터를 최적화하는 방법 (M10의 CTM) |
실제 예제와 함께 옥시를 사용하는 방법에 대한 두 가지 가이드 :
노래 가사에 대한 주제 모델링에 대한 튜토리얼 :
이미 전처리 된 데이터 세트 중 하나를 다음과 같이로드하려면 다음과 같이합니다.
from octis . dataset . dataset import Dataset
dataset = Dataset ()
dataset . fetch_dataset ( "20NewsGroup" )아래에 나열된 데이터 세트 이름 중 하나를 사용하십시오. 참고 : 그것은 대소 문자에 민감합니다!
| 옥시의 이름 | 원천 | # 문서 | # 단어 | # 라벨 | 언어 |
|---|---|---|---|---|---|
| 20Newsgroup | 20Newsgroup | 16309 | 1612 | 20 | 영어 |
| BBC_News | BBC-News | 2225 | 2949 | 5 | 영어 |
| DBLP | DBLP | 54595 | 1513 | 4 | 영어 |
| M10 | M10 | 8355 | 1696 | 10 | 영어 |
| dbpedia_it | dbpedia_it | 4251 | 2047 | 5 | 이탈리아 사람 |
| EUROPARL_IT | EUROPARL_IT | 3613 | 2000 | NA | 이탈리아 사람 |
그렇지 않으면 다음과 같은 방식으로 사용자 정의 전처리 데이터 세트를로드 할 수 있습니다.
from octis . dataset . dataset import Dataset
dataset = Dataset ()
dataset . load_custom_dataset_from_folder ( "../path/to/the/dataset/folder" )파티션은 훈련 파티션의 "기차", 파티션 테스트의 "테스트"또는 검증 파티션의 경우 "VAL"일 수 있습니다. 데이터 세트의 예는 여기에서 찾을 수 있습니다 : sample_dataset.
Tensorflow 데이터 세트 및 Huggingface의 NLP 라이브러리와 마찬가지로 공개 데이터 세트를 다운로드하여 준비했습니다. 당사는 이러한 데이터 세트를 호스팅하거나 배포하지 않거나 품질이나 공정성을 보증하거나 데이터 세트를 사용할 수있는 라이센스가 있다고 주장합니다. 데이터 세트 라이센스에 따라 데이터 세트를 사용할 수있는 권한이 있는지 확인하고 데이터 세트의 올바른 소유자를 인용하는 것은 귀하의 책임입니다.
데이터 세트 소유자이고 일부 부분을 업데이트하려면이 라이브러리에 데이터 세트가 포함되기를 원하지 않으면 GitHub 문제를 해결하십시오.
데이터 세트 소유자 이고이 라이브러리에 데이터 세트를 포함시키려면 GitHub 문제를 해결하십시오.
데이터 세트를 전처리하려면 전처리 클래스를 가져 와서 preprocess_dataset 메소드를 사용하십시오.
import os
import string
from octis . preprocessing . preprocessing import Preprocessing
os . chdir ( os . path . pardir )
# Initialize preprocessing
preprocessor = Preprocessing ( vocabulary = None , max_features = None ,
remove_punctuation = True , punctuation = string . punctuation ,
lemmatize = True , stopword_list = 'english' ,
min_chars = 1 , min_words_docs = 0 )
# preprocess
dataset = preprocessor . preprocess_dataset ( documents_path = r'..corpus.txt' , labels_path = r'..labels.txt' )
# save the preprocessed dataset
dataset . save ( 'hello_dataset' )전처리에 대한 자세한 내용은 예제 폴더의 전처리 데모 예제를 참조하십시오.
모델을 만들려면 전처리 데이터 세트를로드하고 모델 하이퍼 파라미터를 설정하고 train_model() 사용하여 모델을 교육하십시오.
from octis . dataset . dataset import Dataset
from octis . models . LDA import LDA
# Load a dataset
dataset = Dataset ()
dataset . load_custom_dataset_from_folder ( "dataset_folder" )
model = LDA ( num_topics = 25 ) # Create model
model_output = model . train_model ( dataset ) # Train the model데이터 세트가 분할 된 경우 다음을 수행 할 수 있습니다.
| 이름 | 구현 |
|---|---|
| CTM (Bianchi et al. 2021) | https://github.com/milanlproc/contextualized-topic-models |
| ETM (Dieng et al. 2020) | https://github.com/adjidieng/etm |
| HDP (Blei et al. 2004) | https://radimrehurek.com/gensim/ |
| LDA (Blei et al. 2003) | https://radimrehurek.com/gensim/ |
| LSI (Landauer et al. 1998) | https://radimrehurek.com/gensim/ |
| NMF (Lee and Seung 2000) | https://radimrehurek.com/gensim/ |
| Neurallda (Srivastava and Sutton 2017) | https://github.com/estebandito22/pytorchavitm |
| Prodlda (Srivastava and Sutton 2017) | https://github.com/estebandito22/pytorchavitm |
이러한 구현 중 하나를 사용하는 경우 올바른 용지를 인용하십시오.
모델을 구현하고 모델의 일부를 업데이트하려면이 라이브러리에 모델이 포함되기를 원하지 않으면 GitHub 문제를 해결하십시오.
모델을 구현 하고이 라이브러리에 모델을 포함시키려면 GitHub 문제를 해결하십시오. 그렇지 않으면 모델을 직접 포함시키려면 다음 섹션을 참조하십시오.
모델을 평가하려면 메트릭을 선택하고 메트릭 클래스의 score() 메소드를 사용하십시오.
from octis . evaluation_metrics . diversity_metrics import TopicDiversity
metric = TopicDiversity ( topk = 10 ) # Initialize metric
topic_diversity_score = metric . score ( model_output ) # Compute score of the metric분류 지표 :
- F1- 점수 :
F1Score(dataset)- 정밀도 :
PrecisionScore(dataset)- Recall :
RecallScore(dataset)- 정확도 :
AccuracyScore(dataset)
일관성 메트릭 :
- UMASS 일관성 :
Coherence(measure='u_mass')- C_V 일관성 :
Coherence(measure='c_v')- UCI 일관성 :
Coherence(measure='c_uci')- NPMI 일관성 :
Coherence(measure='c_npmi')- 단어 임베딩 기반 일관성 쌍별 :
WECoherencePairwise()- Word Embedding 기반 일관성 Centroid :
WECoherenceCentroid()
다양성 측정 항목 :
- 주제 다양성 :
TopicDiversity()- invertedrbo :
InvertedRBO()- Word Embedding 기반 Invertedrbo Matches :
WordEmbeddingsInvertedRBO()- Word Embedding 기반 인버트 보 중심 :
WordEmbeddingsInvertedRBOCentroid()- 로그 승산 비율 :
LogOddsRatio()- Kullback-Liebler Divergence :
KLDivergence()
유사성 측정 항목 :
- 순위 바이어스 겹침 :
RBO()- Word Embedding 기반 RBO 매치 :
WordEmbeddingsRBOMatch()- Word Embedding 기반 RBO Centroid :
WordEmbeddingsRBOCentroid()- Word Embedings 기반 쌍별 유사성 :
WordEmbeddingsPairwiseSimilarity()- Word Embeddings 기반 중심 유사성 :
WordEmbeddingsCentroidSimilarity()- Word Embeddings 기반 가중 합계 유사성 :
WordEmbeddingsWeightedSumSimilarity()- Pairwise Jaccard 유사성 :
PairwiseJaccardSimilarity()
주제 중요 지표 :
- KL 유니폼 :
KL_uniform()- kl pacuous :
KL_vacuous()- KL 배경 :
KL_background()
Octis/Models/Model.py에 정의 된 클래스 AbstractModel에서 모델이 상속됩니다. 자신의 모델을 구축하려면 클래스는 항상 데이터 세트 객체와 하이퍼 파라미터 사전을 입력으로 요구하고 모델의 출력으로 사전을 출력으로 반환 해야하는 TRAIN_MODEL (SELF, DATASET, HYPERAPARAMETERS) 메소드를 무시해야합니다.
모델의 작동 방식을 더 잘 이해하려면 LDA 구현을 살펴 보겠습니다. 사용자 정의 모델을 개발하는 첫 번째 단계는 기본 하이퍼 파라메이트 값의 사전을 정의하는 것입니다.
hyperparameters = { 'corpus' : None , 'num_topics' : 100 , 'id2word' : None , 'alpha' : 'symmetric' ,
'eta' : None , # ...
'callbacks' : None }기본 하이퍼 파라미터 값을 정의하면 사용자는 각 매개 변수에 값을 할당하지 않고도 하위 집합에서 작업 할 수 있습니다.
다음 단계는 TRAIN_MODEL () 오버라이드입니다.
def train_model ( self , dataset , hyperparameters = {}, top_words = 10 ):LDA 메소드에는 데이터 세트, 하이퍼 파라미터 사전 및 각 주제에 대해 가장 중요한 단어가 얼마나 많은지를 선택하는 데 사용되는 추가 (선택적) 인수가 필요합니다.
하이퍼 파라미터 기본값을 사용하면 입력 및 데이터 세트의 기본값을 사용하면 자신의 코드를 작성하고 최소 3 개의 항목으로 사전을 출력하여 반환 할 수 있어야합니다.
모델이 교육/테스트 파티셔닝을 지원하는 경우 다음에 반환해야합니다.
모델을 최적화하려면 최적화하려면 데이터 세트, 메트릭 및 검색 공간을 선택해야합니다. 하이퍼 파라 미터의 유형의 경우 scikit-optimize 유형 (https://scikit-optimize.github.io/stable/modules/space.html)을 사용합니다.
from octis . optimization . optimizer import Optimizer
from skopt . space . space import Real
# Define the search space. To see which hyperparameters to optimize, see the topic model's initialization signature
search_space = { "alpha" : Real ( low = 0.001 , high = 5.0 ), "eta" : Real ( low = 0.001 , high = 5.0 )}
# Initialize an optimizer object and start the optimization.
optimizer = Optimizer ()
optResult = optimizer . optimize ( model , dataset , eval_metric , search_space , save_path = "../results" # path to store the results
number_of_call = 30 , # number of optimization iterations
model_runs = 5 ) # number of runs of the topic model
#save the results of th optimization in a csv file
optResult . save_to_csv ( "results.csv" )결과는 해당 하이퍼 파라미터 구성과 최적화의 각 반복에 대한 하이퍼 파라미터 및 메트릭 값으로 메트릭의 가장 잘 보이는 값을 제공합니다. 이 정보를 시각화하려면 Bayesian_optimization의 '플롯'속성을 true로 설정해야합니다.
당신은 여기에서 더 찾을 수 있습니다 : Optimizer readme
Octis에는 실험을 작성, 모니터링 및보기위한 사용자 친화적 인 그래픽 인터페이스가 포함되어 있습니다. 데이터 세트, 모델 및 메트릭의 구현 표준에 따라 대시 보드는 자동으로 업데이트되며 고유 한 사용자 정의 구현을 사용할 수 있습니다.
대시 보드를 실행하려면 저장소를 복제해야합니다. 프로젝트 디렉토리에있는 동안 다음 명령을 실행합니다.
python OCTIS/dashboard/server.py브라우저가 열리고 대시 보드로 리디렉션됩니다. 대시 보드에서
이 작업은 EACL 2021의 데모 트랙에서 받아 들여졌습니다! 종이를 읽으려면 클릭하십시오! 이 리소스를 사용하기로 결정한 경우 다음을 인용하십시오.
@InProCeedings {Terragni2020octis,
Title = {{Octis} : 주제 모델을 비교하고 최적화하는 것은 간단합니다!},
저자 = {Terragni, Silvia and Fersini, Elisabetta 및 Galuzzi, Bruno Giovanni 및 Tropeano, Pietro and Candelieri, Antonio},
연도 = {2021},
서적 = {계산 언어 협회 협회 유럽 장 16 차 회의 절차 : 시스템 데모},
달 = 4 월,
년 = "2021",
게시자 = "계산 언어학 협회",
url = "https://www.aclweb.org/anthology/2021.acl-demos.31",
pages = "263--270",
}
@InProCeedings {dblp : conf/clic-it/terragnif21,
저자 = {Silvia Terragni 및 Elisabetta Fersini},
편집자 = {Elisabetta Fersini 및 Marco Passarotti 및 Viviana Patti},
title = {{옥스 2.0 : 이탈리아어의 주제 모델 최적화 및 비교도
더 간단한!}},
서적 = {계산 언어학에 관한 여덟 번째 이탈리아 회의의 절차,
CLIC-IT 2021, 이탈리아 밀라노, 2022 년 1 월 26-28 일},
시리즈 = {{ceur} 워크숍 절차},
볼륨 = {3033},
게시자 = {ceur-ws.org},
연도 = {2021},
url = {http://ceur-ws.org/vol-3033/paper55.pdf},
}
이 패키지는 CookieCutter 및 Audreyr/CookieCutter-Pypackage Project 템플릿으로 만들어졌습니다. 주제 모델 구현을 발표 한 모든 개발자에게 감사합니다. 초기 옥시 릴리스에서 많은 버그를 찾는 데 도움이 된 Tenggaard와 옥시를 사용하는 방법에 대한 두 가지 가이드를 썼던 Emil Rijcken에게 특별한 감사를드립니다. :)