Model topik kontekstual (CTM) adalah keluarga model topik yang menggunakan representasi bahasa pra-terlatih (misalnya, BerT) untuk mendukung pemodelan topik. Lihat surat -surat untuk detailnya:
Keluarga pemodelan topik baru kami mendukung banyak bahasa yang berbeda (yaitu, yang didukung oleh model Huggingface) dan hadir dalam dua versi: CombinedTM menggabungkan embeddings kontekstual dengan tas kata -kata lama yang baik untuk membuat topik yang lebih koheren; Zeroshottm adalah model topik yang sempurna untuk tugas di mana Anda mungkin memiliki kata -kata yang hilang dalam data uji dan juga, jika dilatih dengan embeddings multibahasa, mewarisi properti menjadi model topik multibahasa!
Keuntungan besar adalah Anda dapat menggunakan embeddings yang berbeda untuk CTM. Dengan demikian, ketika metode penyematan baru keluar, Anda dapat menggunakannya dalam kode dan meningkatkan hasil Anda. Kami tidak dibatasi oleh busur lagi.
Kami juga memiliki Kitty! Submodule baru yang dapat digunakan untuk membuat classifier manusia-in-the-loop untuk dengan cepat mengklasifikasikan dokumen Anda dan membuat cluster bernama.
Anda dapat melihat posting blog sedang kami atau mulai dari salah satu tutorial Colab kami:
| Nama | Link |
|---|---|
| Gabungan TM pada data wikipedia (preproc+saving+viz) (stabil v2.3.0 ) | |
| Pemodelan topik lintas-bahasa Zero-Shot (Preproc+Viz) (stabil v2.3.0 ) | |
| Kitty: Manusia di Loop Classifier (Penggunaan Tingkat Tinggi) (Stabil V2.2.0 ) | |
| Superctm dan β-ctm (penggunaan tingkat tinggi) (stabil v2.2.0 ) |
PENTING : Jika Anda ingin menggunakan CUDA, Anda perlu menginstal versi yang benar dari sistem CUDA yang cocok dengan distribusi Anda, lihat Pytorch.
Instal paket menggunakan PIP
pip install -U contextualized_topic_modelsAspek penting yang perlu diperhitungkan adalah jaringan mana yang ingin Anda gunakan: yang menggabungkan embeddings kontekstual dan busur (gabungan) atau yang hanya menggunakan embeddings kontekstual (zeroshottm)
Tetapi ingat bahwa Anda dapat melakukan pemodelan topik lintas-bahasa zero-shot hanya dengan model Zeroshottm.
Model topik kontekstual juga mendukung pengawasan (SuperCTM). Anda dapat membaca lebih lanjut tentang ini di dokumentasi.
Kami juga memiliki Kitty: sebuah utilitas yang dapat Anda gunakan untuk melakukan manusia yang lebih sederhana dalam klasifikasi loop dokumen Anda. Ini bisa sangat berguna untuk melakukan pemfilteran dokumen. Ini juga berfungsi dalam pengaturan lintas-bahasa dan dengan demikian Anda mungkin dapat menyaring dokumen dalam bahasa yang tidak Anda ketahui!
Jika Anda menemukan ini berguna, Anda dapat mengutip makalah berikut :)
Zeroshottm
@InprOceding {Bianchi-ETAL-2021-CROSS,
title = "Model topik kontekstual lintas-bahasa dengan pembelajaran nol-shot",
penulis = "Bianchi, Federico dan Terragni, Silvia dan Hovy, Dirk dan
Nozza, Debora dan Fersini, Elisabetta ",
booktitle = "Prosiding Konferensi ke -16 Bab Eropa Asosiasi Linguistik Komputasi: Volume Utama",
Bulan = APR,
tahun = "2021",
alamat = "online",
Penerbit = "Asosiasi Linguistik Komputasi",
url = "https://www.aclweb.org/anthology/2021.eacl-main.143",
halaman = "1676--1683",
}
Gabungan
@InprOceding {Bianchi-ETAL-2021-Pre,
title = "Pra-Pelatihan adalah Topik Panas: Embeddings Dokumen Kontekstual Meningkatkan Koherensi Topik",
penulis = "Bianchi, Federico dan
Terragni, Silvia dan
Hovy, dirk ",
Booktitle = "Prosiding Pertemuan Tahunan ke -59 Asosiasi Linguistik Komputasi dan Konferensi Bersama Internasional ke -11 tentang Pemrosesan Bahasa Alami (Volume 2: Makalah Pendek)",
Bulan = Agustus,
tahun = "2021",
alamat = "online",
Penerbit = "Asosiasi Linguistik Komputasi",
url = "https://aclanthology.org/2021.acl-short.96",
doi = "10.18653/v1/2021.acl-short.96",
halaman = "759--766",
}
Beberapa contoh di bawah ini menggunakan model embedding multibahasa paraphrase-multilingual-mpnet-base-v2 . Ini berarti bahwa representasi yang akan Anda gunakan adalah mutlilingual. Namun Anda mungkin memerlukan liputan bahasa yang lebih luas atau hanya satu bahasa tertentu. Lihat halaman dalam dokumentasi untuk melihat cara memilih model untuk bahasa lain. Dalam hal ini, Anda dapat memeriksa Sbert untuk menemukan model yang sempurna untuk digunakan.
Di sini, Anda dapat membaca lebih lanjut tentang bahasa khusus dan mulitlingual.
Anda harus melihat dokumentasi untuk lebih memahami cara kerja model topik ini.
Inilah cara Anda dapat menggunakan gabungan. Ini adalah model topik standar yang juga menggunakan embeddings kontekstual. Hal yang baik tentang CombinedTM adalah membuat topik Anda jauh lebih koheren (lihat kertas https://arxiv.org/abs/2004.03974). N_Components = 50 Menentukan jumlah topik.
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 )Catatan Lanjutan: Gabungan TM menggabungkan busur dengan Sbert, sebuah proses yang tampaknya meningkatkan koherensi topik yang diprediksi (https://arxiv.org/pdf/2004.03974.pdf).
Zeroshottm kami dapat digunakan untuk pemodelan topik nol-shot. Ini dapat menangani kata -kata yang tidak digunakan selama fase pelatihan. Lebih menarik, model ini dapat digunakan untuk pemodelan topik lintas-bahasa (lihat bagian berikutnya)! Lihat makalah (https://www.aclweb.org/anthology/2021.eacl-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 )Seperti yang Anda lihat, API tingkat tinggi untuk menangani teks cukup mudah digunakan; text_for_bert harus digunakan untuk meneruskan ke model daftar dokumen yang tidak diproses. Sebaliknya, untuk text_for_bow Anda harus melewati teks praproses yang digunakan untuk membangun busur.
Catatan Lanjutan: Dengan cara ini, Sbert dapat menggunakan semua informasi dalam teks untuk menghasilkan representasi.
Setelah model dilatih, sangat mudah untuk mendapatkan topik!
ctm . get_topics ()Metode transformasi akan mengurus sebagian besar hal untuk Anda, misalnya pembuatan busur yang sesuai dengan mempertimbangkan hanya kata -kata yang telah dilihat model dalam pelatihan. Namun, ini datang dengan beberapa benjolan ketika berhadapan dengan Zeroshottm, karena kita akan SE di bagian selanjutnya.
Namun, Anda dapat memuat embeddings secara manual jika Anda suka (lihat bagian lanjutan dari dokumentasi ini).
Jika Anda menggunakan CombinedTM , Anda harus menyertakan teks uji untuk busur:
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 documentJika Anda menggunakan Zeroshottm , Anda tidak perlu menggunakan testing_text_for_bow karena jika Anda menggunakan serangkaian dokumen pengujian yang berbeda, ini akan membuat busur dengan ukuran yang berbeda. Dengan demikian, cara terbaik untuk melakukan ini adalah dengan meneruskan teks yang akan diberikan dalam input ke model konteksual:
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 )Setelah Anda melatih model Zeroshottm dengan embeddings multibahasa, Anda dapat menggunakan pipa sederhana ini untuk memprediksi topik untuk dokumen dalam bahasa yang berbeda (selama bahasa ini dicakup oleh parafrase-multipiling-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 documentCatatan Tingkat Lanjut: Kita tidak perlu melewati tas Spanyol kata: tas kata -kata dari kedua bahasa tidak akan sebanding! Kami meneruskannya ke model untuk alasan kompatibilitas, tetapi Anda tidak bisa mendapatkan output dari model (yaitu, busur yang diprediksi dari bahasa yang terlatih) dan membandingkannya dengan bahasa pengujian.
Apakah Anda memerlukan skrip cepat untuk menjalankan pipa preprocessing? Kami membuat Anda tertutup! Muat dokumen Anda dan kemudian gunakan kelas persiapan sederhana kami. Ini akan secara otomatis menyaring kata -kata yang jarang dan menghapus dokumen yang kosong setelah pelatihan. Metode preprocess akan mengembalikan dokumen preprocesed dan yang tidak diperbaiki. Kami umumnya menggunakan yang tidak diperbolehkan untuk Bert dan preproses untuk kantong kata.
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 ()Apakah Anda memiliki embeddings khusus dan ingin menggunakannya untuk hasil yang lebih cepat? Berikan saja mereka kepada 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 ())Catatan: Embeddings khusus harus numpy.arrays.
Paket ini dibuat dengan cookiecutter dan templat proyek Audreyr/Cookiecutter-Pypackage. Untuk memudahkan penggunaan perpustakaan, kami juga telah memasukkan paket RBO, semua hak yang dilindungi undang -undang untuk penulis paket itu.
Ingatlah bahwa ini adalah alat penelitian :)