
Octis (оптимизация и сравнение тематических моделей - это просто) направлен на обучение, анализ и сравнение тематических моделей, оптимальные гиперпараметры которых оцениваются с помощью подхода байесовской оптимизации. Эта работа была принята на демонстрацию EACL2021. Нажмите, чтобы прочитать газету!
Оглавление
Вы можете установить Octis со следующей командой:
PIP установить Octis
Вы можете найти требования в файле TEDS.TXT.
Чтобы легко понять, как использовать Octis, мы приглашаем вас попробовать наши учебники :)
| Имя | Связь |
|---|---|
| Как построить тематическую модель и оценить результаты (LDA на 20newsgroups) | |
| Как оптимизировать гиперпараметры модели нейронной темы (CTM на M10) |
Два гида о том, как использовать Octis с практическими примерами:
Учебное пособие по тематическому моделированию по текстам песен:
Чтобы загрузить один из уже предварительно обработанных наборов данных следующим образом:
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 | Английский |
| М10 | М10 | 8355 | 1696 | 10 | Английский |
| Dbpedia_it | Dbpedia_it | 4251 | 2047 | 5 | Итальянский |
| Europarl_it | Europarl_it | 3613 | 2000 | НА | Итальянский |
В противном случае вы можете загрузить собственный предварительный набор данных следующим образом:
from octis . dataset . dataset import Dataset
dataset = Dataset ()
dataset . load_custom_dataset_from_folder ( "../path/to/the/dataset/folder" )Разделение может быть «поездом» для учебного раздела, «тестирование» для испытаний раздел или «val» для проверки проверки. Пример набора данных можно найти здесь: sample_dataset.
Подобно наборам данных TensorFlow и библиотеке NLP Huggingface, мы только что загрузили и подготовили публичные наборы данных. Мы не размещаем и не размещаем эти наборы данных, не ручаются за их качество или справедливость, или утверждаем, что у вас есть лицензия на использование набора данных. Вы обязаны определить, есть ли у вас разрешение на использование набора данных по лицензии набора данных и цитировать правильного владельца набора данных.
Если вы владелец набора данных и хотите обновить какую -либо его часть, или не хотите, чтобы ваш набор данных был включен в эту библиотеку, свяжитесь с нами с помощью проблемы 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/contextized-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-Score:
F1Score(dataset)- Точность:
PrecisionScore(dataset)- Напомним:
RecallScore(dataset)- Точность:
AccuracyScore(dataset)
Показатели когерентности :
- Умс -когерентность:
Coherence(measure='u_mass')- C_V Coherence:
Coherence(measure='c_v')- Когерентность UCI:
Coherence(measure='c_uci')- NPMI -когерентность:
Coherence(measure='c_npmi')- Слово встраивание когерентности пары:
WECoherencePairwise()- Слово на основе когерентности центроид:
WECoherenceCentroid()
Метрики разнообразия :
- Тематическое разнообразие:
TopicDiversity()- Invertedrbo:
InvertedRBO()- Слово внедрение на основе инвертированных матчей:
WordEmbeddingsInvertedRBO()- Слово встраивание на основе InvertedRbo Centroid:
WordEmbeddingsInvertedRBOCentroid()- Соотношение шансов на журнал:
LogOddsRatio()- Kullback-Liebler Divergence:
KLDivergence()
Показатели сходства :
- Перекрытие с рейтингом:
RBO()- Слово встраивание RBO Matches:
WordEmbeddingsRBOMatch()- Слово-на основе RBO Centroid:
WordEmbeddingsRBOCentroid()- Слово встраиваемое на основе парного сходства:
WordEmbeddingsPairwiseSimilarity()- Сходство центроида на основе слов:
WordEmbeddingsCentroidSimilarity()- Взвешенное сходство на основе слов:
WordEmbeddingsWeightedSumSimilarity()- Сходство в паре Jaccard:
PairwiseJaccardSimilarity()
Тема Значения Метрики :
- КЛ Униформа:
KL_uniform()- Kl
KL_vacuous()- КЛ ПРИМЕНАНИЕ:
KL_background()
Модели наследуют от класса Abstractmodel, определенной в Octis/Models/Model.py. Чтобы построить свою собственную модель, ваш класс должен переопределить метод Train_model (Self, DataSet, Hypparameters), который всегда требует, по крайней мере, объекта набора данных и словаря гиперпараметров в качестве входных данных и должен вернуть словарь с выводом модели в качестве вывода.
Чтобы лучше понять, как работает модель, давайте посмотрим на реализацию 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.
Вы можете найти больше здесь: оптимизатор readme
Octis включает в себя удобный для пользователя графический интерфейс для создания, мониторинга и просмотра экспериментов. Следуя стандартам реализации наборов данных, моделей и метрик, панель инструментов автоматически обновляет и позволит вам использовать свои собственные реализации.
Чтобы запустить приборную панель, вам нужно клонировать репо. В то время как в каталоге проекта запустите следующую команду:
python OCTIS/dashboard/server.pyБраузер откроется, и вы будете перенаправлены на приборную панель. В приборной панели вы можете:
Эта работа была принята на демонстрационном треке EACL 2021! Нажмите, чтобы прочитать газету! Если вы решите использовать этот ресурс, укажите:
@inproceedings {terragni202020octis,
title = {{octis}: сравнение и оптимизация тематических моделей просто!},
Автор = {Террагни, Сильвия и Ферсини, Элизабетта и Галуцци, Бруно Джованни и Троанео, Пьетро и Канделяри, Антонио},
Год = {2021},
BookTitle = {Труды 16 -й конференции Европейской главы Ассоциации вычислительной лингвистики: демонстрации системы},
месяц = апрель,
Год = "2021",
Publisher = "Ассоциация вычислительной лингвистики",
url = "https://www.aclweb.org/anthology/2021.eacl-demos.31",
страницы = "263--270",
}
@inproceedings {dblp: conf/clic-it/terragnif21,
Автор = {Сильвия Террагни и Элизабетта Ферсини},
Editor = {Elisabetta Fersini и Marco Passarotti и Viviana Patti},
title = {{octis 2.0: оптимизация и сравнение тематических моделей на итальянском
Проще!}},
BookTitle = {Труды восьмой итальянской конференции по вычислительной лингвистике,
Clic-It 2021, Милан, Италия, 26-28 января 2022 года},
series = {{Ceur} Сборник семинар},
том = {3033},
Publisher = {Ceur-ws.org},
Год = {2021},
url = {http://ceur-ws.org/vol-3033/paper55.pdf},
}
Этот пакет был создан с помощью шаблона проекта CookieCutter и проекта Audreyr/CookieCutter-Pypackage. Благодаря всем разработчикам, которые выпустили реализации их тематических моделей. Особая благодарность Тенггаарду, который помог нам найти много ошибок в ранних выпусках Октиса, и Эмилю Риджкен, который любезно написал два руководства о том, как использовать Octis :)