Les modèles de sujets contextualisés (CTM) sont une famille de modèles de sujet qui utilisent des représentations pré-formées du langage (par exemple, Bert) pour soutenir la modélisation des sujets. Voir les articles pour plus de détails:
Notre nouvelle famille de modélisation de sujets prend en charge de nombreuses langues différentes (c'est-à-dire celles soutenues par des modèles HuggingFace) et se présente en deux versions: CombinedTM combine des intérêts contextuels avec le bon vieux sac de mots pour faire des sujets plus cohérents; Zeroshottm est le modèle de sujet parfait pour la tâche dans laquelle vous pourriez avoir des mots manquants dans les données de test et également, si vous êtes formé avec des intégres multilingues, hérite de la propriété d'être un modèle de sujet multilingue!
Le gros avantage est que vous pouvez utiliser différentes intérêts pour CTMS. Ainsi, lorsqu'une nouvelle méthode d'incorporation sort, vous pouvez l'utiliser dans le code et améliorer vos résultats. Nous ne sommes plus limités par l'arc.
Nous avons aussi Kitty! Un nouveau sous-module qui peut être utilisé pour créer un classificateur humain en boucle pour classer rapidement vos documents et créer des clusters nommés.
Vous pouvez consulter notre article de blog moyen ou commencer à partir de l'un de nos tutoriels Colab:
| Nom | Lien |
|---|---|
| TM combiné sur les données de Wikipedia (Preproc + Saving + Viz) (stable v2.3.0 ) | |
| Modélisation de la rubrique inter-greatrice zéro (Preproc + Viz) (stable v2.3.0 ) | |
| Kitty: Human in the Loop Classifier (utilisation de haut niveau) (stable v2.2.0 ) | |
| SuperCTM et β-CTM (utilisation de haut niveau) ( V2.2.0 ) stable |
IMPORTANT : Si vous souhaitez utiliser CUDA, vous devez installer la version correcte des systèmes CUDA qui correspond à votre distribution, voir Pytorch.
Installez le package à l'aide de PIP
pip install -U contextualized_topic_modelsUn aspect important à prendre en compte est le réseau que vous souhaitez utiliser: celui qui combine des incorporations contextualisées et l'arc (combinée) ou celle qui utilise simplement des incorporations contextualisées (Zeroshottm)
Mais n'oubliez pas que vous pouvez faire une modélisation de sujets inter-linguaux zéro-shot uniquement avec le modèle Zeroshottm.
Les modèles de sujets contextualisés prennent également en charge la supervision (SuperCTM). Vous pouvez en savoir plus à ce sujet sur la documentation.
Nous avons également Kitty: un utilitaire que vous pouvez utiliser pour faire un humain plus simple dans la classification en boucle de vos documents. Cela peut être très utile pour faire le filtrage des documents. Il fonctionne également en milieu interdictionnel et vous pourriez donc être en mesure de filtrer les documents dans une langue que vous ne connaissez pas!
Si vous trouvez cela utile, vous pouvez citer les articles suivants :)
Zeroshottm
@inproceedings {Bianchi-etal-2021-cross,
title = "Modèles de sujet contextualisés croisés avec apprentissage zéro-shot",
Auteur = "Bianchi, Federico et Terragni, Silvia et Hovy, Dirk et
Nozza, Debora et Fersini, Elisabetta ",
booktitle = "Actes de la 16e conférence du chapitre européen de l'Association pour la linguistique informatique: volume principal",
mois = avril,
année = "2021",
adresse = "en ligne",
Publisher = "Association for Computational Linguistics",
url = "https://www.aclweb.org/anthology/2021.ecl-main.143",
pages = "1676--1683",
}
Combiné
@inproceedings {Bianchi-etal-2021-pre,
Title = "La pré-formation est un sujet brûlant: les intégres de documents contextualisés améliorent la cohérence du sujet",
auteur = "Bianchi, Federico et
Terragni, Silvia et
Hovy, Dirk ",
booktitle = "Actes de la 59e réunion annuelle de l'Association de linguistique informatique et de la 11e Conférence conjointe internationale sur le traitement du langage naturel (Volume 2: Papiers courts)",
mois = août,
année = "2021",
adresse = "en ligne",
Publisher = "Association for Computational Linguistics",
url = "https://aclanthology.org/2021.acl-short.96",
doi = "10.18653 / v1 / 2021.acl-short.96",
pages = "759--766",
}
Certains des exemples ci-dessous utilisent un modèle d'incorporation multilingue paraphrase-multilingual-mpnet-base-v2 . Cela signifie que les représentations que vous allez utiliser sont mutlilisées. Cependant, vous pourriez avoir besoin d'une couverture plus large des langues ou d'une seule langue spécifique. Reportez-vous à la page dans la documentation pour voir comment choisir un modèle pour une autre langue. Dans ce cas, vous pouvez vérifier SBERT pour trouver le modèle parfait à utiliser.
Ici, vous pouvez en savoir plus sur le langage spécifique et mulitlingue.
Vous devriez certainement jeter un œil à la documentation pour mieux comprendre comment ces modèles de sujet fonctionnent.
Voici comment vous pouvez utiliser le combiné. Il s'agit d'un modèle de sujet standard qui utilise également des intérêts contextualisés. La bonne chose à propos de CombinedTM est qu'il rend votre sujet beaucoup plus cohérent (voir le papier https://arxiv.org/abs/2004.03974). n_components = 50 Spécifie le nombre de sujets.
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 )Remarques avancées: TM combiné combine l'arc avec SBERT, un processus qui semble augmenter la cohérence des sujets prévus (https://arxiv.org/pdf/2004.03974.pdf).
Notre Zeroshottm peut être utilisé pour la modélisation de sujets à tirs zéro. Il peut gérer des mots qui ne sont pas utilisés pendant la phase d'entraînement. Plus intéressant, ce modèle peut être utilisé pour la modélisation de sujets inter-galenaires (voir les sections suivantes)! Voir l'article (https://www.aclweb.org/anthology/2021.ecl-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 )Comme vous pouvez le voir, l'API de haut niveau pour gérer le texte est assez facile à utiliser; text_for_bert doit être utilisé pour passer au modèle une liste de documents qui ne sont pas prétraités. Au lieu de cela, pour Text_For_Bow, vous devez passer le texte prétraité utilisé pour construire l'arc.
Remarques avancées: De cette manière, SBERT peut utiliser toutes les informations du texte pour générer les représentations.
Une fois le modèle formé, il est très facile d'obtenir les sujets!
ctm . get_topics ()La méthode de transformation s'occupera de la plupart des choses pour vous, par exemple la génération d'un arc correspondant en considérant uniquement les mots que le modèle a vus dans la formation. Cependant, cela est livré avec des bosses lorsqu'ils traitent avec le Zeroshottm, comme nous allons SE dans la section suivante.
Vous pouvez cependant charger manuellement les intégres si vous le souhaitez (voir la partie avancée de cette documentation).
Si vous utilisez CombinedTM , vous devez inclure le texte de test pour l'arc:
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 documentSi vous utilisez Zeroshottm, vous n'avez pas besoin d'utiliser le test_text_for_bow car si vous utilisez un ensemble différent de documents de test, cela créera un arc d'une taille différente. Ainsi, la meilleure façon de procéder est de passer le texte qui va être donné en entrée au modèle contexuel:
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 )Une fois que vous avez formé le modèle Zeroshottm avec des incorporations multilingues, vous pouvez utiliser ce pipeline simple pour prédire les sujets des documents dans une langue différente (tant que cette langue est couverte par la paraphrase-multitilingue-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 documentRemarques avancées: Nous n'avons pas besoin de passer le sac espagnol de mot: le sac de mots des deux langues ne sera pas comparable! Nous le transmettons au modèle pour des raisons de compatibilité, mais vous ne pouvez pas obtenir la sortie du modèle (c'est-à-dire l'arc prévu du langage formé) et le comparer avec le langage de test.
Avez-vous besoin d'un script rapide pour exécuter le pipeline de prétraitement? Nous vous avons couvert! Chargez vos documents, puis utilisez notre classe SimpleProcessing. Il filtrera automatiquement les mots peu fréquents et supprimera les documents vides après la formation. La méthode du prétraitement renverra les documents pré-troqués et non pré-procédés. Nous utilisons généralement le non pré-procédé pour Bert et le prétraité pour le sac de mot.
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 ()Avez-vous des incorporations personnalisées et souhaitez-vous les utiliser pour des résultats plus rapides? Donnez-les à Kitty!
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 ())Remarque: les incorporations personnalisées doivent être Numpy.arrays.
Ce package a été créé avec Cookietter et le modèle de projet Audreyr / Cookiecutter-Package. Pour faciliter l'utilisation de la bibliothèque, nous avons également inclus le package RBO, tous les droits réservés à l'auteur de ce package.
N'oubliez pas qu'il s'agit d'un outil de recherche :)