상황에 맞는 주제 모델 (CTM)은 주제 모델링을 지원하기 위해 미리 훈련 된 언어 표현 (예 : BERT)을 사용하는 주제 모델의 패밀리입니다. 자세한 내용은 논문을 참조하십시오.
우리의 새로운 주제 모델링 패밀리는 다양한 다른 언어 (예 : 포옹 페이스 모델로 지원되는 언어)를 지원하고 두 가지 버전으로 제공됩니다. CombinedTM은 문맥 적 내부를 좋은 오래된 단어의 가방과 결합하여 더 일관된 주제를 만듭니다. Zeroshottm 은 테스트 데이터에 누락 된 단어가있을 수있는 작업에 대한 완벽한 주제 모델이며, 다국어 임베딩으로 교육을받은 경우 다국어 주제 모델의 속성을 상속합니다!
가장 큰 장점은 CTM에 다른 임베딩을 사용할 수 있다는 것입니다. 따라서 새로운 임베딩 방법이 나오면 코드에서 사용하여 결과를 향상시킬 수 있습니다. 우리는 더 이상 활로 제한되지 않습니다.
우리는 또한 키티가 있습니다! 문서를 신속하게 분류하고 이름이 지정된 클러스터를 생성하기 위해 인간-루프 분류기를 만드는 데 사용할 수있는 새로운 하위 모듈.
중간 블로그 게시물을 보거나 Colab 튜토리얼 중 하나에서 시작할 수 있습니다.
| 이름 | 링크 |
|---|---|
| Wikipedia 데이터에 대한 TM (Preproc+Saving+Viz) (안정적인 v2.3.0 ) | |
| Zero-Shot Cross-LINGUAL TOPIL MODEMING (PREPROC+VIZ) (안정 V2.3.0 ) | |
| 키티 : 루프 분류기의 인간 (고급 사용량) (안정적인 v2.2.0 ) | |
| SuperCTM 및 β-CTM (높은 수준의 사용) (안정 V2.2.0 ) |
중요 : CUDA를 사용하려면 배포와 일치하는 올바른 버전의 CUDA 시스템을 설치해야합니다. Pytorch를 참조하십시오.
PIP를 사용하여 패키지를 설치하십시오
pip install -U contextualized_topic_models고려해야 할 중요한 측면은 어떤 네트워크를 사용하려는 네트워크입니다 : 상황에 맞는 임베딩과 활 (combinedtm)을 결합한 네트워크 또는 단지 상황에 맞는 임베딩 (Zeroshottm)을 사용하는 네트워크입니다.
그러나 Zeroshottm 모델에서만 제로 샷 교차 주제 모델링을 수행 할 수 있습니다.
상황에 맞는 주제 모델은 또한 감독 (SUPERCTM)을 지원합니다. 문서에서 이에 대한 자세한 내용을 읽을 수 있습니다.
또한 Kitty가 있습니다. 문서의 루프 분류에서 더 간단한 인간을 수행하는 데 사용할 수있는 유틸리티입니다. 이것은 문서 필터링을 수행하는 데 매우 유용 할 수 있습니다. 또한 문구 간 설정에서도 작동하므로 알지 못하는 언어로 문서를 필터링 할 수 있습니다!
이것이 유용하다고 생각되면 다음 논문을 인용 할 수 있습니다. :)
Zeroshottm
@inproceedings {Bianchi-Etal-2021-Cross,
title = "샷 학습이없는 문맥 상호 문맥 화 된 주제 모델",
저자 = "Bianchi, Federico and Terragni, Silvia and Hovy, Dirk 및
Nozza, Debora 및 Fersini, Elisabetta ",
Booktitle = "계산 언어 협회 협회 유럽 장 16 번째 회의 절차 : 주요 볼륨",
달 = 4 월,
년 = "2021",
주소 = "온라인",
게시자 = "계산 언어학 협회",
url = "https://www.aclweb.org/anthology/2021.acl-main.143",
pages = "1676-1683",
}
결합 된 TM
@inproceedings {Bianchi-Etal-2021-pre,
title = "사전 훈련은 뜨거운 주제입니다 : 상황에 맞는 문서 임베드는 주제 일관성을 향상시킵니다",
저자 = "Bianchi, Federico 및
Terragni, Silvia 및
Hovy, Dirk ",
Booktitle = "컴퓨터 언어학 협회 59 번째 연례 회의 및 자연 언어 처리에 관한 제 11 회 국제 공동 회의 (2 권 : 짧은 논문)",
월 = 8 월,
년 = "2021",
주소 = "온라인",
게시자 = "계산 언어학 협회",
url = "https://aclanthology.org/2021.acl-short.96",
doi = "10.18653/v1/2021.acl-short.96",
pages = "759--766",
}
아래 예제 중 일부는 다국어 임베딩 모델 paraphrase-multilingual-mpnet-base-v2 사용합니다. 이것은 당신이 사용할 표현이 자극적이라는 것을 의미합니다. 그러나 언어의 광범위한 범위 또는 하나의 특정 언어 만 필요할 수 있습니다. 다른 언어에 대한 모델을 선택하는 방법을 보려면 문서의 페이지를 참조하십시오. 이 경우 Sbert를 확인하여 사용할 완벽한 모델을 찾을 수 있습니다.
여기에서는 언어 관련 및 뮬리 틀링에 대한 자세한 내용을 읽을 수 있습니다.
이러한 주제 모델의 작동 방식을 더 잘 이해하려면 문서를 살펴보아야합니다.
CompinedTM을 사용하는 방법은 다음과 같습니다. 이것은 상황에 맞는 임베딩을 사용하는 표준 주제 모델입니다. CombinedTM의 좋은 점은 주제를 훨씬 더 일관성있게 만든다는 것입니다 (논문 https://arxiv.org/abs/2004.03974 참조). n_components = 50 주제 수를 지정합니다.
from contextualized_topic_models . models . ctm import CombinedTM
from contextualized_topic_models . utils . data_preparation import TopicModelDataPreparation
from contextualized_topic_models . utils . data_preparation import bert_embeddings_from_file
qt = TopicModelDataPreparation ( "all-mpnet-base-v2" )
training_dataset = qt . fit ( text_for_contextual = list_of_unpreprocessed_documents , text_for_bow = list_of_preprocessed_documents )
ctm = CombinedTM ( bow_size = len ( qt . vocab ), contextual_size = 768 , n_components = 50 ) # 50 topics
ctm . fit ( training_dataset ) # run the model
ctm . get_topics ( 2 )고급 메모 : 결합 된 TM은 Bow를 Sbert와 결합하여 예측 된 주제의 일관성을 높이는 과정 (https://arxiv.org/pdf/2004.03974.pdf)을 결합합니다.
우리의 Zeroshottm은 제로 샷 주제 모델링에 사용될 수 있습니다. 훈련 단계에서 사용되지 않은 단어를 처리 할 수 있습니다. 더 흥미롭게 도이 모델은 문구 간 주제 모델링에 사용될 수 있습니다 (다음 섹션 참조)! 논문을 참조하십시오 (https://www.aclweb.org/anthology/2021.acl-main.143)
from contextualized_topic_models . models . ctm import ZeroShotTM
from contextualized_topic_models . utils . data_preparation import TopicModelDataPreparation
from contextualized_topic_models . utils . data_preparation import bert_embeddings_from_file
text_for_contextual = [
"hello, this is unpreprocessed text you can give to the model" ,
"have fun with our topic model" ,
]
text_for_bow = [
"hello unpreprocessed give model" ,
"fun topic model" ,
]
qt = TopicModelDataPreparation ( "paraphrase-multilingual-mpnet-base-v2" )
training_dataset = qt . fit ( text_for_contextual = text_for_contextual , text_for_bow = text_for_bow )
ctm = ZeroShotTM ( bow_size = len ( qt . vocab ), contextual_size = 768 , n_components = 50 )
ctm . fit ( training_dataset ) # run the model
ctm . get_topics ( 2 )보시다시피, 텍스트를 처리하는 고급 API는 사용하기 쉽습니다. Text_for_bert는 전처리되지 않은 문서 목록을 모델로 전달하는 데 사용해야합니다. 대신, Text_for_bow 로 보우를 만드는 데 사용되는 전처리 텍스트를 전달해야합니다.
고급 메모 : 이런 식으로 Sbert는 텍스트의 모든 정보를 사용하여 표현을 생성 할 수 있습니다.
모델이 훈련되면 주제를 얻는 것이 매우 쉽습니다!
ctm . get_topics ()변환 방법은 모델이 훈련에서 본 단어 만 고려하여 해당 활의 생성과 같은 대부분의 것들을 처리합니다. 그러나 다음 섹션에서 SE와 같이 Zeroshottm을 다룰 때 약간의 충돌이 발생합니다.
그러나 원하는 경우 임베딩을 수동으로로드 할 수 있습니다 (이 문서의 고급 부분 참조).
CombinedTM을 사용하는 경우 활에 대한 테스트 텍스트를 포함해야합니다.
testing_dataset = qt . transform ( text_for_contextual = testing_text_for_contextual , text_for_bow = testing_text_for_bow )
# n_sample how many times to sample the distribution (see the doc)
ctm . get_doc_topic_distribution ( testing_dataset , n_samples = 20 ) # returns a (n_documents, n_topics) matrix with the topic distribution of each documentZeroshottm을 사용하는 경우 다른 테스트 문서 세트를 사용하는 경우 다른 크기의 활이 생성되므로 Testing_Text_for_bow를 사용할 필요가 없습니다. 따라서이 작업을 수행하는 가장 좋은 방법은 컨텍스트 모델에 입력 할 텍스트 만 전달하는 것입니다.
testing_dataset = qt . transform ( text_for_contextual = testing_text_for_contextual )
# n_sample how many times to sample the distribution (see the doc)
ctm . get_doc_topic_distribution ( testing_dataset , n_samples = 20 )다국어 임베딩으로 Zeroshottm 모델을 훈련 한 후에는이 간단한 파이프 라인을 사용하여 다른 언어로 문서 주제를 예측할 수 있습니다 (이 언어가 Paraphrase-Multingual-MPNet-Base-V2 로 덮여있는 한).
# here we have a Spanish document
testing_text_for_contextual = [
"hola, bienvenido" ,
]
# since we are doing multilingual topic modeling, we do not need the BoW in
# ZeroShotTM when doing cross-lingual experiments (it does not make sense, since we trained with an english Bow
# to use the spanish BoW)
testing_dataset = qt . transform ( testing_text_for_contextual )
# n_sample how many times to sample the distribution (see the doc)
ctm . get_doc_topic_distribution ( testing_dataset , n_samples = 20 ) # returns a (n_documents, n_topics) matrix with the topic distribution of each document고급 노트 : 우리는 스페인어 단어 가방을 전달할 필요가 없습니다. 두 언어의 단어 가방은 비교할 수 없습니다! 우리는 호환성의 이유로 모델에 전달하고 있지만 모델의 출력 (예 : 훈련 된 언어의 예상 활)를 얻을 수는없고 테스트 언어와 비교할 수는 없습니다.
전처리 파이프 라인을 실행하려면 빠른 스크립트가 필요합니까? 우리는 당신을 덮었습니다! 문서를로드 한 다음 SimpleProcessing 클래스를 사용하십시오. 드러난 단어를 자동으로 필터링하고 훈련 후 비어있는 문서를 제거합니다. 전처리 방법은 전처리 및 처리되지 않은 문서를 반환합니다. 우리는 일반적으로 Bert에 대해 처리되지 않은 것을 사용하고 단어의 가방에 대해 전처리를 사용합니다.
from contextualized_topic_models . utils . preprocessing import WhiteSpacePreprocessing
documents = [ line . strip () for line in open ( "unpreprocessed_documents.txt" ). readlines ()]
sp = WhiteSpacePreprocessing ( documents , "english" )
preprocessed_documents , unpreprocessed_corpus , vocab , retained_indices = sp . preprocess ()맞춤 임베드가 있고 더 빠른 결과를 위해 사용하고 싶습니까? 그냥 키티에게 줘!
from contextualized_topic_models . models . kitty_classifier import Kitty
import numpy as np
# read the training data
training_data = list ( map ( lambda x : x . strip (), open ( "train_data" ). readlines ()))
custom_embeddings = np . load ( 'custom_embeddings.npy' )
kt = Kitty ()
kt . train ( training_data , custom_embeddings = custom_embeddings , stopwords_list = [ "stopwords" ])
print ( kt . pretty_print_word_classes ())참고 : 사용자 정의 임베딩은 numpy.arrays 여야합니다.
이 패키지는 CookieCutter 및 Audreyr/CookieCutter-Pypackage Project 템플릿으로 만들어졌습니다. 라이브러리 사용을 용이하게하기 위해 RBO 패키지도 포함되어 있습니다.
이것은 연구 도구라는 것을 기억하십시오 :)