الإنجليزية ، 한국어.
TomOtopy هو امتداد Python لـ Tomoto (أداة نمذجة الموضوع) وهي مكتبة نموذج قائمة على عينة Gibbs مكتوبة في C ++. يستخدم عودة من وحدات المعالجة المركزية الحديثة لزيادة السرعة. يدعم الإصدار الحالي من Tomoto العديد من نماذج الموضوعات الرئيسية بما في ذلك
يرجى زيارة https://bab2min.github.io/tomotopy لمعرفة مزيد من المعلومات.
يمكنك تثبيت tomotopy بسهولة باستخدام PIP. (https://pypi.org/project/tomotopy/)
$ pip install -reprage pip $ pip تثبيت tomotopy
إصدارات OS و Python المدعومة هي:
بعد التثبيت ، يمكنك بدء تشغيل tomotopy بمجرد الاستيراد.
استيراد tomotopy كـ TP طباعة (tp.isa) # يطبع "AVX2" أو "AVX" أو "SSE2" أو "لا شيء"
حاليًا ، يمكن أن يستغل Tomotopy تعليمات AVX2 أو AVX أو SSE2 SIMD لزيادة الأداء. عندما يتم استيراد الحزمة ، ستتحقق من مجموعات التعليمات المتاحة وتحديد الخيار الأفضل. إذا لم يخبر TP.ISA أي شيء ، فقد يستغرق تكرارات التدريب وقتًا طويلاً. ولكن نظرًا لأن معظم CPUs Modern Intel أو AMD توفر مجموعة تعليمات SIMD ، فقد يظهر تسارع SIMD تحسنًا كبيرًا.
فيما يلي نموذج رمز لتدريب LDA البسيط للنصوص من ملف "sample.txt".
استيراد tomotopy كـ TP
MDL = tp.ldamodel (k = 20)
لخط في Open ('sample.txt'):
mdl.add_doc (line.strip (). split ())
لأني في المدى (0 ، 100 ، 10):
MDL.Train (10)
print ('التكرار: {} tlog-likelihood: {}'. Format (i ، mdl.ll_per_word))
لـ K في المدى (MDL.K):
PRINT ('Top 10 Words of Topic #{}'. Format (k))
print (mdl.get_topic_words (k ، top_n = 10))
MDL.Summary ()
يستخدم Tomotopy عينة Gibbs المنهارة (CGS) لاستنتاج توزيع الموضوعات وتوزيع الكلمات. عمومًا ، تتقارب CGS ببطء أكثر من Bayes variational (VB) التي يستخدمها Ldamodel من Gensim ، ولكن يمكن حساب تكرارها بشكل أسرع بكثير. بالإضافة إلى ذلك ، يمكن أن يستفيد Tomotopy من وحدات المعالجة المركزية متعددة الأوساخ مع مجموعة تعليمات SIMD ، والتي يمكن أن تؤدي إلى تكرار أسرع.
يوضح الرسم البياني التالي مقارنة وقت تشغيل طراز LDA بين Tomotopy و Gensim. تتكون بيانات الإدخال من 1000 وثيقة عشوائية من ويكيبيديا الإنجليزية مع 1506،966 كلمة (حوالي 10.1 ميغابايت). توموتوبي يدرب 200 تكرار وقطارات Gensim 10 تكرار.
الأداء في Intel i5-6600 ، x86-64 (4 نوى)
الأداء في Intel Xeon E5-2620 V4 ، x86-64 (8 نوى ، 16 مؤشر ترابط)
على الرغم من تكرار توموتوبي 20 مرة ، إلا أن وقت التشغيل الإجمالي كان أسرع 5 ~ 10 مرات من Gensim. وهو ينتج عن نتيجة مستقرة.
من الصعب مقارنة CGS و VB مباشرة لأنها تقنيات مختلفة تمامًا. ولكن من وجهة نظر عملية ، يمكننا مقارنة السرعة والنتيجة بينهما. يعرض الرسم البياني التالي نتيجة احتمالية سجل لكل كلمة من النموذجين.
مجموعة تعليمات SIMD لها تأثير كبير على الأداء. فيما يلي مقارنة بين مجموعات تعليمات SIMD.
لحسن الحظ ، توفر معظم وحدات المعالجة المركزية X86-64 الحديثة مجموعة تعليمات AVX2 ، حتى نتمكن من الاستمتاع بأداء AVX2.
يوفر Tomotopy طريقة حفظ وتحميل كل فئة نموذج موضوع ، بحيث يمكنك حفظ النموذج في الملف وقتما تشاء ، وإعادة تحميله من الملف.
استيراد tomotopy كـ TP
mdl = tp.hdpmodel ()
لخط في Open ('sample.txt'):
mdl.add_doc (line.strip (). split ())
لأني في المدى (0 ، 100 ، 10):
MDL.Train (10)
print ('التكرار: {} tlog-likelihood: {}'. Format (i ، mdl.ll_per_word))
# حفظ في الملف
mdl.save ('sample_hdp_model.bin')
# التحميل من الملف
mdl = tp.hdpmodel.load ('sample_hdp_model.bin')
لـ K في المدى (MDL.K):
إذا لم يكن mdl.is_live_topic (k): تابع
PRINT ('Top 10 Words of Topic #{}'. Format (k))
print (mdl.get_topic_words (k ، top_n = 10))
# النموذج المحفوظ هو نموذج HDP ،
# لذلك عندما تقوم بتحميله بواسطة طراز LDA ، فإنه سيؤدي إلى استثناء
mdl = tp.ldamodel.load ('sample_hdp_model.bin')
عند تحميل النموذج من ملف ، يجب أن يتطابق نوع النموذج في الملف مع فئة الطرق.
شاهد المزيد في tomotopy.ldamodel.save و tomotopy.ldamodel.load أساليب.
يمكنك رؤية نتيجة النمذجة باستخدام المشاهد التفاعلي منذ V0.13.0.
استيراد tomotopy كـ TP النموذج = tp.ldamodel (...) # ... بعض رموز التدريب ... tp.viewer.open_viewer (نموذج ، مضيف = "LocalHost" ، Port = 9999) # وفتح http: // localhost: 9999 في متصفح الويب الخاص بك!
إذا كان لديك ملف طراز محفوظ ، فيمكنك أيضًا استخدام سطر الأوامر التالي.
Python -M tomotopy.viewer a_trained_model.bin -host localhost -port 9999
شاهد المزيد في وحدة Tomotopy.Viewer.
يمكننا استخدام نموذج الموضوع لغرضين رئيسيين. الأساسي هو اكتشاف موضوعات من مجموعة من المستندات نتيجة للنموذج المدرب ، والأكثر تقدماً هو استنتاج توزيعات الموضوع للوثائق غير المرئية باستخدام النموذج المدرب.
قمنا بتسمية المستند في الغرض السابق (المستخدم للتدريب النموذجي) كوثائق في النموذج ، والوثيقة في الغرض اللاحق (الوثيقة غير المرئية أثناء التدريب) كوثيقة خارج النموذج .
في tomotopy ، يتم إنشاء هذين النوعين المختلفين من المستندات بشكل مختلف. يمكن إنشاء مستند في النموذج بواسطة طريقة tomotopy.ldamodel.add_doc. يمكن استدعاء add_doc قبل بدء tomotopy.ldamodel.train. بمعنى آخر ، بعد استدعاء القطار ، لا يمكن لـ ADD_DOC إضافة مستند إلى النموذج لأن مجموعة المستندات المستخدمة للتدريب قد تم إصلاحها.
للحصول على مثيل المستند الذي تم إنشاؤه ، يجب عليك استخدام tomotopy.ldamodel.docs مثل:
MDL = tp.ldamodel (k = 20)
idx = mdl.add_doc (كلمات)
إذا idx <0: رفع Runtimeerror ("فشل في إضافة مستند")
doc_inst = mdl.docs [idx]
# doc_inst هو مثيل للوثيقة المضافة
يتم إنشاء مستند خارج النموذج بواسطة طريقة tomotopy.ldamodel.make_doc. لا يمكن استدعاء Make_doc إلا بعد بدء القطار. إذا كنت تستخدم Make_doc قبل أن تصبح مجموعة المستند المستخدم للتدريب ثابتًا ، فقد تحصل على نتائج خاطئة. نظرًا لأن Make_doc يقوم بإرجاع المثيل مباشرةً ، يمكنك استخدام قيمة الإرجاع الخاصة به للتلاعب الأخرى.
MDL = tp.ldamodel (k = 20) # add_doc ... MDL.Train (100) doc_inst = mdl.make_doc (unseen_doc) # doc_inst هو مثيل لمستند غير مرئي
إذا تم إنشاء مستند جديد بواسطة tomotopy.ldamodel.make_doc ، فيمكن استنتاج توزيع موضوعه بواسطة النموذج. يجب إجراء الاستدلال للوثيقة غير المرئية باستخدام طريقة tomotopy.ldamodel.infer.
MDL = tp.ldamodel (k = 20)
# add_doc ...
MDL.Train (100)
doc_inst = mdl.make_doc (unseen_doc)
topic_dist ، ll = mdl.infer (doc_inst)
طباعة ("توزيع الموضوع لمستندات غير مرئية:" ، topic_dist)
طباعة ("احتمالية سجل الاستدلال:" ، LL)
يمكن أن تستنتج طريقة الاستنتاج مثيلًا واحدًا فقط من tomotopy.document أو قائمة من مثيلات tomotopy.document. انظر المزيد في tomotopy.ldamodel.infer.
كل نموذج موضوع في tomotopy له نوع المستند الداخلي الخاص به. يمكن إنشاء مستند وإضافته إلى كل نموذج من خلال طريقة ADD_DOC الخاصة بكل طراز. ومع ذلك ، فإن محاولة إضافة نفس قائمة المستندات إلى نماذج مختلفة تصبح غير مريحة تمامًا ، لأنه يجب استدعاء Add_doc لنفس قائمة المستندات لكل نموذج مختلف. وبالتالي ، يوفر Tomotopy فئة tomotopy.utils.corpus التي تحمل قائمة بالوثائق. يمكن إدراج tomotopy.utils.corpus في أي نموذج عن طريق تمرير كحجة وسيطة إلى طريقة __init__ أو add_corpus لكل نموذج. لذلك ، فإن إدخال tomotopy.utils.corpus له نفس التأثير على إدخال المستندات التي يحملها Corpus.
تتطلب بعض نماذج الموضوع بيانات مختلفة لمستنداتها. على سبيل المثال ، يتطلب tomotopy.dmrmodel بيانات الوسيطة في نوع STR ، لكن tomotopy.pldamodel يتطلب ملصقات وسيطة في قائمة [str]. نظرًا لأن tomotopy.Utils.Corpus يحتفظ بمجموعة مستقلة من المستندات بدلاً من ربطها بنموذج موضوع معين ، فقد تكون أنواع البيانات المطلوبة بواسطة نموذج الموضوع غير متسقة عند إضافة مجموعة إلى نموذج الموضوع. في هذه الحالة ، يمكن تحويل البيانات المتنوعة لتكون نموذج موضوع الهدف باستخدام تحويل الوسيطة. انظر المزيد من التفاصيل في الكود التالي:
من tomotopy import dmrmodel
من tomotopy.utils استيراد مجموعة
corpus = corpus ()
corpus.add_doc ("ABCDE" .Split () ، a_data = 1)
corpus.add_doc ("efghi" .split () ، a_data = 2)
corpus.add_doc ("ijklm" .split () ، a_data = 3)
النموذج = dmrmodel (k = 10)
model.add_corpus (corpus)
# تفقد حقل "A_DATA" في "Corpus" ،
# و "البيانات الوصفية" التي يتطلبها "dmrmodel" تملأ بالقيمة الافتراضية ، STR فارغة.
نموذج تأكيد. docs [0] .metadata == ''
نموذج تأكيد. docs [1] .metadata == ''
نموذج تأكيد. docs [2]
def transform_a_data_to_metadata (misc: dict):
إرجاع {'metadata': str (misc ['a_data'])}
# هذه الوظيفة تحول `a_data` إلى metadata`
النموذج = dmrmodel (k = 10)
model.add_corpus (corpus ، transform = transform_a_data_to_metadata)
# الآن مستندات في "النموذج" لا تحتوي على "بيانات التعريف" ، والتي تم إنشاؤها من حقل "A_DATA".
نموذج تأكيد. docs [0] .metadata == '1'
نموذج تأكيد. docs [1] .metadata == '2'
نموذج تأكيد. docs [2]
منذ الإصدار 0.5.0 ، يتيح لك tomotopy اختيار خوارزمية التوازي. الخوارزمية المقدمة في الإصدارات قبل 0.4.2 هي Copy_merge ، والتي يتم توفيرها لجميع نماذج الموضوع. يجعل قسم الخوارزمية الجديدة ، المتاح منذ 0.5.0 ، التدريب بشكل عام أسرع وأكثر كفاءة في الذاكرة ، ولكنه متوفر في جميع نماذج الموضوعات.
يوضح الرسم البياني التالي فرق السرعة بين الخوارزميات بناءً على عدد الموضوعات وعدد العمال.
يتم عرض تغييرات الأداء حسب الإصدار في الرسم البياني التالي. تم قياس الوقت الذي يستغرقه تشغيل قطار طراز LDA مع 1000 تكرار. (مستندات: 11314 ، المفردات: 60382 ، الكلمات: 2364724 ، Intel Xeon Gold 5120 @2.2Ghz)
منذ الإصدار 0.6.0 ، تمت إضافة طريقة جديدة tomotopy.ldamodel.set_word_prior. يسمح لك بالتحكم في كلمة مسبقًا لكل موضوع. على سبيل المثال ، يمكننا ضبط وزن كلمة "الكنيسة" إلى 1.0 في الموضوع 0 ، والوزن إلى 0.1 في بقية المواضيع باتباع الرموز. هذا يعني أن احتمال أن يتم تعيين كلمة "الكنيسة" للموضوع 0 أعلى 10 مرات من احتمال تعيينه لموضوع آخر. لذلك ، يتم تعيين معظم "الكنيسة" للموضوع 0 ، لذلك يحتوي الموضوع 0 على العديد من الكلمات المتعلقة بـ "الكنيسة". هذا يسمح بمعالجة بعض الموضوعات لوضعها على رقم موضوع معين.
استيراد tomotopy كـ TP
MDL = tp.ldamodel (k = 20)
# أضف مستندات إلى "MDL"
# إعداد كلمة سابقة
mdl.set_word_prior ('Church' ، [1.0 if k == 0 else 0.1 for k in range (20)])
راجع Word_Prior_example في example.py لمزيد من التفاصيل.
يمكنك العثور على مثال رمز Python من tomotopy على https://github.com/bab2min/tomotopy/blob/main/examples/.
يمكنك أيضًا الحصول على ملف البيانات المستخدم في رمز المثال على https://drive.google.com/file/d/18opnijd4iwpyyz2o7pqopyetakexa71j/view.
تم ترخيص Tomotopy بموجب شروط ترخيص معهد ماساتشوستس للتكنولوجيا ، مما يعني أنه يمكنك استخدامه لأي غرض معقول والبقاء في ملكية كاملة لجميع الوثائق التي تنتجها.
software {minchul_lee_2022_6868418 ،
المؤلف = {minchul lee} ،
العنوان = {bab2min/tomotopy: 0.12.3} ،
الشهر = يوليو ،
السنة = 2022 ،
Publisher = {Zenodo} ،
الإصدار = {v0.12.3} ،
doi = {10.5281/Zenodo.6868418} ،
url = {https://doi.org/10.5281/zenodo.6868418}
}