
OCTIS (optimiser et comparer les modèles de sujets est simple) vise à former, à analyser et à comparer les modèles de sujets, dont les hyperparamètres optimaux sont estimés au moyen d'une approche d'optimisation bayésienne. Ce travail a été accepté sur la piste de démonstration de l'EACL2021. Cliquez pour lire le journal!
Table des matières
Vous pouvez installer OCTIS avec la commande suivante:
Pip Install Octis
Vous pouvez trouver les exigences dans le fichier exigence.txt.
Pour comprendre facilement comment utiliser les octis, nous vous invitons à essayer nos tutoriels :)
| Nom | Lien |
|---|---|
| Comment construire un modèle de sujet et évaluer les résultats (LDA sur 20NewsGroups) | |
| Comment optimiser les hyperparamètres d'un modèle de sujet neuronal (CTM sur M10) |
Deux guides sur la façon d'utiliser des octis avec des exemples pratiques:
Un tutoriel sur la modélisation du sujet sur les paroles des chansons:
Pour charger l'un des ensembles de données déjà prétraités comme suit:
from octis . dataset . dataset import Dataset
dataset = Dataset ()
dataset . fetch_dataset ( "20NewsGroup" )Utilisez simplement l'un des noms d'ensemble de données répertoriés ci-dessous. Remarque: c'est sensible à la casse!
| Nom en octis | Source | # Docs | # Mots | # Étiquettes | Langue |
|---|---|---|---|---|---|
| 20Newsgroup | 20Newsgroup | 16309 | 1612 | 20 | Anglais |
| BBC_NEWS | BBC-News | 2225 | 2949 | 5 | Anglais |
| Dblp | Dblp | 54595 | 1513 | 4 | Anglais |
| M10 | M10 | 8355 | 1696 | 10 | Anglais |
| Dbpedia_it | Dbpedia_it | 4251 | 2047 | 5 | italien |
| Europarl_it | Europarl_it | 3613 | 2000 | N / A | italien |
Sinon, vous pouvez charger un ensemble de données prétraité personnalisé de la manière suivante:
from octis . dataset . dataset import Dataset
dataset = Dataset ()
dataset . load_custom_dataset_from_folder ( "../path/to/the/dataset/folder" )La partition peut être "Train" pour la partition de formation, "test" pour le test de partition, ou "Val" pour la partition de validation. Un exemple de jeu de données peut être trouvé ici: Sample_dataset.
De façon similaire aux ensembles de données TensorFlow et à la bibliothèque NLP de HuggingFace, nous venons de télécharger et de préparer des ensembles de données publiques. Nous n'hébergeons ni ne distribuons pas ces ensembles de données, ne garantissons pas leur qualité ou leur équité, ni ne prétendons que vous avez une licence pour utiliser l'ensemble de données. Il est de votre responsabilité de déterminer si vous avez la permission d'utiliser l'ensemble de données sous la licence de l'ensemble de données et de citer le bon propriétaire de l'ensemble de données.
Si vous êtes propriétaire d'un ensemble de données et que vous souhaitez mettre à jour n'importe quelle partie de celui-ci, ou si vous ne souhaitez pas que votre ensemble de données soit inclus dans cette bibliothèque, veuillez nous contacter via un problème GitHub.
Si vous êtes propriétaire d'un ensemble de données et que vous souhaitez inclure votre ensemble de données dans cette bibliothèque, veuillez nous contacter via un problème GitHub.
Pour prétraiter un ensemble de données, importez la classe de prétraitement et utilisez la méthode 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' )Pour plus de détails sur le prétraitement, consultez l'exemple de démonstration de prétraitement dans le dossier Exemples.
Pour construire un modèle, chargez un ensemble de données prétraité, définissez les hyperparamètres du modèle et utilisez train_model() pour former le modèle.
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 modelSi l'ensemble de données est partitionné, vous pouvez:
| Nom | Mise en œuvre |
|---|---|
| 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://radimherek.com/Gensim/ |
| LDA (Blei et al. 2003) | https://radimherek.com/Gensim/ |
| LSI (Landauer et al. 1998) | https://radimherek.com/Gensim/ |
| NMF (Lee et Seung 2000) | https://radimherek.com/Gensim/ |
| Neurallda (Srivastava et Sutton 2017) | https://github.com/estebandito22/pytorchavitm |
| Prodlda (Srivastava et Sutton 2017) | https://github.com/estebandito22/pytorchavitm |
Si vous utilisez l'une de ces implémentations, assurez-vous de citer le bon papier.
Si vous avez implémenté un modèle et que vous souhaitez mettre à jour une partie de celui-ci, ou si vous ne souhaitez pas que votre modèle soit inclus dans cette bibliothèque, veuillez nous contacter via un problème GitHub.
Si vous avez implémenté un modèle et que vous souhaitez inclure votre modèle dans cette bibliothèque, veuillez nous contacter via un problème GitHub. Sinon, si vous souhaitez inclure le modèle par vous-même, consultez la section suivante.
Pour évaluer un modèle, choisissez une métrique et utilisez la méthode score() de la classe métrique.
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 metricMétriques de classification :
- F1-score:
F1Score(dataset)- Précision:
PrecisionScore(dataset)- Rappel:
RecallScore(dataset)- Précision:
AccuracyScore(dataset)
Métriques de cohérence :
- Cohérence UMass:
Coherence(measure='u_mass')- C_v Coherence:
Coherence(measure='c_v')- UCI Coherence:
Coherence(measure='c_uci')- Cohérence NPMI:
Coherence(measure='c_npmi')- COHERENCE BASÉE BASÉE MOTS PAIR:
WECoherencePairwise()- Centroïde de cohérence basé sur les mots:
WECoherenceCentroid()
Métriques de la diversité :
- Diversité des sujets:
TopicDiversity()- InverseDrbo:
InvertedRBO()- Matches inversées basées sur l'intégration des mots:
WordEmbeddingsInvertedRBO()- Mot d'intégration d'intégration InversédRbo Centroïde:
WordEmbeddingsInvertedRBOCentroid()- Ratio de cotes logarithmiques:
LogOddsRatio()- Kullback-Liebler Divergence:
KLDivergence()
Métriques de similitude :
- Chevauchement biaisé:
RBO()- Matchs RBO basés sur les mots:
WordEmbeddingsRBOMatch()- Word Embedding Based RBO Centroïde:
WordEmbeddingsRBOCentroid()- Word Embeddings basé sur la similitude par paire:
WordEmbeddingsPairwiseSimilarity()- Word Embeddings Based Cenroid similitude:
WordEmbeddingsCentroidSimilarity()- Word Embeddings basé sur la somme pondérée de la somme:
WordEmbeddingsWeightedSumSimilarity()- Pairwise Jaccard similitude:
PairwiseJaccardSimilarity()
Métriques de signification du sujet :
- KL Uniform:
KL_uniform()- Kl vide:
KL_vacuous()- KL Background:
KL_background()
Les modèles héritent de la classe AbstractModel définie dans Octis / Models / Model.py. Pour construire votre propre modèle, votre classe doit remplacer la méthode Train_Model (self, jeu de données, hyperparamètres) qui nécessite toujours au moins un objet de jeu de données et un dictionnaire d'hyperparamètres en entrée et doit renvoyer un dictionnaire avec la sortie du modèle comme sortie.
Pour mieux comprendre le fonctionnement d'un modèle, examinons l'implémentation LDA. La première étape du développement d'un modèle personnalisé consiste à définir le dictionnaire des valeurs d'hyperparamètres par défaut:
hyperparameters = { 'corpus' : None , 'num_topics' : 100 , 'id2word' : None , 'alpha' : 'symmetric' ,
'eta' : None , # ...
'callbacks' : None }La définition des valeurs d'hyperparamètres par défaut permet aux utilisateurs de travailler sur un sous-ensemble d'entre eux sans avoir à attribuer une valeur à chaque paramètre.
L'étape suivante est la priorité Train_Model ():
def train_model ( self , dataset , hyperparameters = {}, top_words = 10 ):La méthode LDA nécessite un ensemble de données, le dictionnaire des hyperparamètres et un argument supplémentaire (facultatif) utilisé pour sélectionner le nombre de mots les plus significatifs sur chaque sujet.
Avec les hyperparamètres par défaut, ceux dans l'entrée et l'ensemble de données, vous devriez pouvoir écrire votre propre code et retourner en difficulté un dictionnaire avec au moins 3 entrées:
Si votre modèle prend en charge le partitionnement de formation / test, il doit également revenir:
Pour optimiser un modèle, vous devez sélectionner un ensemble de données, une métrique et l'espace de recherche des hyperparamètres à optimiser. Pour les types d'hyperparamètres, nous utilisons des types 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" )Le résultat fournira la valeur la plus constituée de la métrique avec la configuration hyperparamètre correspondante, et les hyperparamètres et la valeur métrique pour chaque itération de l'optimisation. Pour visualiser ces informations, vous devez définir l'attribut «tracé» de Bayesian_Optimisation à True.
Vous pouvez en trouver plus ici: Optimizer Readme
Octtis comprend une interface graphique conviviale pour la création, la surveillance et la visualisation des expériences. Suivant les normes d'implémentation des ensembles de données, des modèles et des métriques, le tableau de bord mettra automatiquement à jour et vous permettra d'utiliser vos propres implémentations personnalisées.
Pour exécuter le tableau de bord, vous devez cloner le repo. Tandis que dans le répertoire du projet, exécutez la commande suivante:
python OCTIS/dashboard/server.pyLe navigateur s'ouvrira et vous serez redirigé vers le tableau de bord. Dans le tableau de bord, vous pouvez:
Ce travail a été accepté sur la piste de démonstration de l'EACL 2021! Cliquez pour lire le journal! Si vous décidez d'utiliser cette ressource, veuillez citer:
@inproceedings {terragni2020octis,
title = {{octtis}: comparer et optimiser les modèles de sujets est simple!},
Auteur = {Terragni, Silvia et Fersini, Elisabetta et Galuzzi, Bruno Giovanni et Tropeano, Pietro et Candelieri, Antonio},
année = {2021},
booktitle = {Actes de la 16e conférence du chapitre européen de l'Association pour la linguistique informatique: démonstrations du système},
mois = avril,
année = "2021",
Publisher = "Association for Computational Linguistics",
url = "https://www.aclweb.org/anthology/2021.ecl-demos.31",
pages = "263--270",
}
@inproceedings {dblp: conf / clic-it / terragnif21,
auteur = {Silvia Terragni et Elisabetta Fersini},
éditeur = {Elisabetta Fersini et Marco Passarotti et Viviana Patti},
Titre = {{Octtis 2.0: Optimiser et comparer les modèles de sujet en italien est même
Plus simple!}},
booktitle = {Actes de la huitième conférence italienne sur la linguistique informatique,
CLIC-IT 2021, Milan, Italie, 26-28 janvier, 2022},
série = {{ceur} Procédures d'atelier},
volume = {3033},
éditeur = {ceur-ws.org},
année = {2021},
url = {http://ceur-ws.org/vol-3033/paper55.pdf},
}
Ce package a été créé avec Cookietter et le modèle de projet Audreyr / Cookiecutter-Package. Merci à tous les développeurs qui ont publié les implémentations de leurs modèles de sujet. Un remerciement spécial va à Tenggaard qui nous a aidés à trouver de nombreux bugs dans les premières versions d'Octis et à Emil Rijcken qui a gentiment écrit deux guides sur la façon d'utiliser des octis :)