โมเดลหัวข้อบริบท (CTM) เป็นตระกูลของโมเดลหัวข้อที่ใช้การเป็นตัวแทนของภาษา (เช่น BERT) เพื่อสนับสนุนการสร้างแบบจำลองหัวข้อ ดูรายละเอียดเอกสาร:
การสร้างแบบจำลองหัวข้อใหม่ของเราสนับสนุนภาษาที่แตกต่างกันมากมาย (เช่นหนึ่งที่สนับสนุนโดยโมเดล HuggingFace) และมาในสองเวอร์ชัน: CombinedTM รวมการฝังบริบทกับกระเป๋าคำเก่าที่ดีเพื่อทำให้หัวข้อที่สอดคล้องกันมากขึ้น Zeroshottm เป็นรูปแบบหัวข้อที่สมบูรณ์แบบสำหรับงานที่คุณอาจมีคำที่ขาดหายไปในข้อมูลการทดสอบและหากได้รับการฝึกฝนด้วยการฝังตัวหลายภาษาสืบทอดคุณสมบัติของการเป็นแบบจำลองหัวข้อหลายภาษา!
ข้อได้เปรียบที่ยิ่งใหญ่คือคุณสามารถใช้การฝังตัวที่แตกต่างกันสำหรับ CTMS ดังนั้นเมื่อวิธีการฝังใหม่ออกมาคุณสามารถใช้มันในรหัสและปรับปรุงผลลัพธ์ของคุณ เราไม่ได้ถูก จำกัด ด้วยธนูอีกต่อไป
เรายังมีคิตตี้! submodule ใหม่ที่สามารถใช้ในการสร้างตัวจําแนกมนุษย์ในลูปเพื่อจัดประเภทเอกสารของคุณอย่างรวดเร็วและสร้างกลุ่มที่มีชื่อ
คุณสามารถดูโพสต์บล็อกกลางของเราหรือเริ่มต้นจากหนึ่งในบทเรียน colab ของเรา:
| ชื่อ | การเชื่อมโยง |
|---|---|
| รวม TM บนข้อมูล Wikipedia (preproc+saving+viz) (เสถียร v2.3.0 ) | |
| การสร้างแบบจำลองหัวข้อข้ามภาษาแบบไม่มีการถ่ายภาพ (preproc+viz) (เสถียร v2.3.0 ) | |
| คิตตี้: มนุษย์ในตัวแยกประเภทวน (การใช้งานระดับสูง) (เสถียร v2.2.0 ) | |
| SuperCTM และβ-CTM (การใช้งานระดับสูง) (เสถียร v2.2.0 ) |
สำคัญ : หากคุณต้องการใช้ CUDA คุณต้องติดตั้งระบบ CUDA เวอร์ชันที่ถูกต้องที่ตรงกับการกระจายของคุณดู Pytorch
ติดตั้งแพ็คเกจโดยใช้ PIP
pip install -U contextualized_topic_modelsสิ่งสำคัญที่ต้องคำนึงถึงคือเครือข่ายที่คุณต้องการใช้: สิ่งที่รวมการฝังบริบทและธนู (รวมกัน) หรือเครือข่ายที่เพิ่งใช้การฝังบริบท (ZeroShottm)
แต่โปรดจำไว้ว่าคุณสามารถทำแบบจำลองหัวข้อข้ามภาษาแบบไม่มีการยิงแบบไม่ใช้กับรุ่น ZeroShottm เท่านั้น
โมเดลหัวข้อบริบทยังสนับสนุนการกำกับดูแล (superCTM) คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ในเอกสาร
นอกจากนี้เรายังมีคิตตี้: ยูทิลิตี้ที่คุณสามารถใช้ในการทำมนุษย์ที่ง่ายขึ้นในการจำแนกประเภทวนของเอกสารของคุณ สิ่งนี้มีประโยชน์มากในการกรองเอกสาร นอกจากนี้ยังใช้งานได้ในการตั้งค่าข้ามภาษาและทำให้คุณสามารถกรองเอกสารเป็นภาษาที่คุณไม่รู้จัก!
หากคุณพบว่าสิ่งนี้มีประโยชน์คุณสามารถอ้างอิงเอกสารต่อไปนี้ :)
Zeroshottm
@inproceedings {Bianchi-etal-20121-Cross
title = "โมเดลหัวข้อเชิงบริบทแบบข้ามภาษาที่มีการเรียนรู้แบบศูนย์-ช็อต"
ผู้แต่ง = "Bianchi, Federico และ Terragni, Silvia และ Hovy, Dirk และ
Nozza, Debora และ Fersini, Elisabetta "
BookTitle = "การดำเนินการของการประชุมครั้งที่ 16 ของบทยุโรปของสมาคมเพื่อการคำนวณภาษาศาสตร์: เล่มหลัก"
เดือน = เม.ย.
ปี = "2021"
ที่อยู่ = "ออนไลน์"
Publisher = "สมาคมเพื่อการคำนวณภาษาศาสตร์"
url = "https://www.aclweb.org/anthology/2021.eacl-main.143"
หน้า = "1676--1683"
-
รวมกัน
@Inproceedings {Bianchi-etal-201-2021-pre,
title = "pre-training เป็นหัวข้อร้อนแรง: การฝังเอกสารเชิงบริบทปรับปรุงการเชื่อมโยงหัวข้อ"
ผู้แต่ง = "Bianchi, Federico และ
Terragni, Silvia และ
Hovy, Dirk ",
BookTitle = "การดำเนินการของการประชุมประจำปีครั้งที่ 59 ของสมาคมเพื่อการคำนวณภาษาศาสตร์และการประชุมร่วมระหว่างประเทศครั้งที่ 11 เกี่ยวกับการประมวลผลภาษาธรรมชาติ (เล่มที่ 2: เอกสารสั้น ๆ )"
เดือน = ส.ค.
ปี = "2021"
ที่อยู่ = "ออนไลน์"
Publisher = "สมาคมเพื่อการคำนวณภาษาศาสตร์"
url = "https://aclanthology.org/2021.acl-short.96"
doi = "10.18653/v1/2021.acl-short.96"
หน้า = "759--766"
-
ตัวอย่างบางส่วนด้านล่างใช้โมเดลการฝังแบบหลายภาษาการ paraphrase-multilingual-mpnet-base-v2 ซึ่งหมายความว่าการเป็นตัวแทนที่คุณกำลังจะใช้เป็นภาษาที่พูดได้ อย่างไรก็ตามคุณอาจต้องครอบคลุมภาษาที่กว้างขึ้นหรือเพียงภาษาเดียว อ้างถึงหน้าเว็บในเอกสารเพื่อดูวิธีการเลือกแบบจำลองสำหรับภาษาอื่น ในกรณีนี้คุณสามารถตรวจสอบ Sbert เพื่อค้นหาโมเดลที่สมบูรณ์แบบที่จะใช้
ที่นี่คุณสามารถอ่านเพิ่มเติมเกี่ยวกับภาษาเฉพาะและ mulitlingual
คุณควรดูเอกสารเพื่อทำความเข้าใจว่าโมเดลหัวข้อเหล่านี้ทำงานอย่างไร
นี่คือวิธีที่คุณสามารถใช้ combinedTm นี่คือรูปแบบหัวข้อมาตรฐานที่ใช้การฝังบริบท สิ่งที่ดีเกี่ยวกับ 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 รวมกันรวมโบว์กับ Sbert ซึ่งเป็นกระบวนการที่ดูเหมือนจะเพิ่มการเชื่อมโยงของหัวข้อที่คาดการณ์ไว้ (https://arxiv.org/pdf/2004.03974.pdf)
ZeroShottm ของเราสามารถใช้สำหรับการสร้างแบบจำลองหัวข้อ zero-shot มันสามารถจัดการกับคำที่ไม่ได้ใช้ในระหว่างขั้นตอนการฝึกอบรม ที่น่าสนใจยิ่งกว่านั้นรุ่นนี้สามารถใช้สำหรับการสร้างแบบจำลองหัวข้อข้ามภาษา (ดูส่วนถัดไป)! ดูกระดาษ (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 )อย่างที่คุณเห็น API ระดับสูงในการจัดการข้อความนั้นใช้งานง่าย ควรใช้ text_for_bert เพื่อส่งผ่านไปยังโมเดลรายการเอกสารที่ไม่ได้ประมวลผลล่วงหน้า แทน to text_for_bow คุณควรผ่านข้อความที่ประมวลผลล่วงหน้าที่ใช้ในการสร้างธนู
หมายเหตุขั้นสูง: ด้วยวิธีนี้ Sbert สามารถใช้ข้อมูลทั้งหมดในข้อความเพื่อสร้างการเป็นตัวแทน
เมื่อโมเดลได้รับการฝึกฝนมันเป็นเรื่องง่ายมากที่จะได้รับหัวข้อ!
ctm . get_topics ()วิธี การแปลง จะดูแลสิ่งต่าง ๆ ส่วนใหญ่สำหรับคุณตัวอย่างเช่นการสร้างคันธนูที่สอดคล้องกันโดยพิจารณาเฉพาะคำที่โมเดลได้เห็นในการฝึกอบรม อย่างไรก็ตามสิ่งนี้มาพร้อมกับการกระแทกบางอย่างเมื่อต้องรับมือกับ Zeroshottm อย่างที่เราจะอยู่ในส่วนถัดไป
อย่างไรก็ตามคุณสามารถโหลด embeddings ด้วยตนเองได้หากคุณต้องการ (ดูส่วนขั้นสูงของเอกสารนี้)
หากคุณใช้ 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 documentหากคุณใช้ ZeroShottm คุณไม่จำเป็นต้องใช้ testing_text_for_bow เพราะถ้าคุณใช้เอกสารทดสอบชุดอื่นสิ่งนี้จะสร้างคันธนูที่มีขนาดแตกต่างกัน ดังนั้นวิธีที่ดีที่สุดในการทำเช่นนี้คือการส่งผ่านข้อความที่จะได้รับในอินพุตไปยังโมเดล contexual:
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 ด้วยการฝังตัวหลายภาษาคุณสามารถใช้ไปป์ไลน์ง่าย ๆ นี้เพื่อทำนายหัวข้อสำหรับเอกสารในภาษาที่แตกต่างกัน (ตราบใดที่ภาษานี้ถูกปกคลุมด้วย การถอดความ-ภาษา 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หมายเหตุขั้นสูง: เราไม่จำเป็นต้องส่งคำภาษาสเปน: ถุงคำของทั้งสองภาษาจะไม่เทียบได้! เรากำลังส่งผ่านไปยังแบบจำลองด้วยเหตุผลความเข้ากันได้ แต่คุณไม่สามารถรับผลลัพธ์ของโมเดล (เช่นธนูที่คาดการณ์ไว้ของภาษาที่ผ่านการฝึกอบรม) และเปรียบเทียบกับภาษาทดสอบ
คุณต้องการสคริปต์ด่วนเพื่อเรียกใช้ท่อส่งล่วงหน้าหรือไม่? เรามีคุณครอบคลุม! โหลดเอกสารของคุณแล้วใช้คลาส SimplePreprocessing ของเรา มันจะกรองคำไม่บ่อยนักและลบเอกสารที่ว่างเปล่าหลังจากการฝึกอบรม วิธีประมวลผลล่วงหน้าจะส่งคืนเอกสารที่ประมวลผลล่วงหน้าและเอกสารที่ไม่ได้คาดการณ์ไว้ โดยทั่วไปเราใช้การประมวลผลที่ไม่ได้คาดการณ์ไว้สำหรับเบิร์ตและการประมวลผลล่วงหน้าสำหรับกระเป๋าคำ
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 เพื่อความสะดวกในการใช้ห้องสมุดเราได้รวมแพ็คเกจ RBO ซึ่งเป็นลิขสิทธิ์ทั้งหมดที่สงวนไว้สำหรับผู้เขียนแพ็คเกจนั้น
โปรดจำไว้ว่านี่เป็นเครื่องมือวิจัย :)