نمذجة الموضوع هي تقنية لاستخراج المواضيع المخفية من مجلدات كبيرة من النص. يعد تخصيص Latent Dirichlet (LDA) خوارزمية شائعة لنمذجة الموضوعات بتطبيقات ممتازة في حزمة Python s Gensim. غير أن التحدي يكمن في كيفية استخلاص نوعية جيدة من المواضيع الواضحة والمعزولة وذات المغزى. يعتمد هذا بشكل كبير على جودة المعالجة المسبقة للنص واستراتيجية إيجاد العدد الأمثل من الموضوعات. يحاول هذا البرنامج التعليمي معالجة كل من هذه المشاكل. مقدمة من التطبيقات الأساسية للمعالجة الطبيعية للغة هي استخراج المواضيع التي يناقشها الأشخاص تلقائيًا من مجلدات نصية كبيرة. بعض الأمثلة على النص الكبير يمكن أن تكون مواجز من وسائل التواصل الاجتماعي ، ومراجعات العملاء للفنادق ، والأفلام ، وما إلى ذلك ، وردود فعل المستخدمين ، والأخبار الإخبارية ، ورسائل البريد الإلكتروني لشكاوى العملاء ، إلخ.. إن معرفة ما يتحدث عنه الناس وفهم مشكلاتهم وآرائهم أمر ذو قيمة عالية للشركات والمشرفين والحملات السياسية. ومن الصعب حقا أن تقرأ يدويا من خلال مثل هذه المجلدات الكبيرة وتجميع المواضيع. وبالتالي ، هناك حاجة إلى خوارزمية آلية يمكن من خلالها قراءة المستندات النصية وإخراج الموضوعات التي تمت مناقشتها تلقائيًا. في هذا البرنامج التعليمي ، سنأخذ مثالًا حقيقيًا على مجموعة البيانات 20 Newsgroups ونستخدم LDA لاستخراج المواضيع التي تمت مناقشتها بشكل طبيعي. سوف أستخدم تطبيق Latent Dirichlet Allocation (LDA) من باقة Gensim مع تطبيق Mallet s (عن طريق Gensim). ومن المعروف أن تعمل بشكل أسرع ويعطي أفضل المواضيع الفصل. سنقوم أيضًا باستخراج حجم ونسبة المساهمة لكل موضوع للحصول على فكرة عن مدى أهمية الموضوع. المتطلبات الأساسية تنزيل nltk stopwords ونموذج spacy سنحتاج إلى كلمات الإيقاف من NLTK ونموذج spacy s en للمعالجة المسبقة للنص. في وقت لاحق ، سنستخدم نموذج spacy من أجل lemmatization. على سبيل المثال: lemma من آلات الكلمة هو الجهاز . وبالمثل ، المشي> المشي ، الفئران> الماوس وهلم جرا. # تشغيل في وحدة التحكم بيثون استيراد nltk. NLTK. download (& apos؛ stopwords & apos؛) # Run in terminal or command prompt python3 -m spacy تنزيل ar 3. حزم الاستيرادالحزم الأساسية المستخدمة في هذا البرنامج التعليمي هي إعادة ، gensim ، spacy و pyLDAvis. إلى جانب ذلك ، سوف نستخدم أيضا matplotlib ، numpy و pandas لمعالجة البيانات والتصور. استيراد إعادة استيراد numpy كما np استيراد الباندا و pd من pprint import pprint # Gensim استيراد الجنسيم استيراد الجنسيم. utils استيراد simple_preprocess من الجنسيم. تستورد نماذج CoherenceModel # spacy للمفهوم استيراد spacy # أدوات الرسم استيراد pyLDAvis استيراد pyLDAvis. gensim # don & apos؛ t skip this استيراد matplotlib. pyplot كما PLT ٪ مضمنة matplotlib # تمكين تسجيل الدخول إلى gensim - اختياري تسجيل الاستيراد تسجيل. basicConfig (format = & apos؛٪ (asctime) s:٪ (levelname) s:٪ (message) s & apos ؛، level = logging. filterwarnings ( 'تجاهل' فئة = DeprecationWarning) 4. ما هو نهج LDA do؟ LDA لنمذجة الموضوع هو أنه يعتبر كل وثيقة كمجموعة من الموضوعات في نسبة معينة. وكل موضوع كمجموعة من الكلمات الرئيسية ، مرة أخرى ، في نسبة معينة. بمجرد تقديم الخوارزمية مع عدد المواضيع ، كل ذلك يفعل ذلك لإعادة ترتيب توزيع الموضوعات ضمن توزيع المستندات والكلمات الرئيسية ضمن الموضوعات للحصول على تركيبة جيدة لتوزيع الكلمات الرئيسية.. عندما أقول الموضوع ، ما هو في الواقع وكيف يتم تمثيله؟ الموضوع ليس سوى مجموعة من الكلمات الرئيسية المهيمنة التي تمثل الممثلين النموذجيين. فقط من خلال النظر في الكلمات الرئيسية ، يمكنك تحديد ما هو الموضوع كله. فيما يلي العوامل الرئيسية للحصول على موضوعات الفصل الجيدة: جودة معالجة النصوص. مجموعة متنوعة من الموضوعات التي يتحدث عنها النص. عدد الموضوعات التي تم تغذيتها إلى الخوارزمية. تحضير Stopwords لقد قمنا بالفعل بتنزيل كلمات الإيقاف. دعونا استيرادها وجعلها متاحة في stop_words. corpus استيراد stopwords stop_words = stopwords. كلمة (أحرزنا الانجليزية وأبوس]؛) كلمات التوقف. expand ([& apos؛ from & apos؛، & apos؛ subject & apos؛، & apos؛ re & apos؛، & apos؛ edu & apos ؛، & apos؛ use & apos؛]) 6. استيراد بيانات مجموعات الأخبار سوف نستخدم مجموعة البيانات 20-Newsgroups لهذا التمرين. يحتوي هذا الإصدار من مجموعة البيانات على نشرات 11k newsgroups من 20 موضوعًا مختلفًا. read_json و dataset الناتج يحتوي على 3 أعمدة كما هو موضح. كوم / selva86 / قواعد البيانات / الماجستير / الأخبار. الدراجات النارية وأبوس]؛ وأبوس]؛ متفرقات. الالكترونيات وأبوس]؛ وأبوس]؛ الخيال العلمي. الشرق الأوسط وأبوس]؛ وأبوس]؛ شركة نفط الجنوب. إزالة رسائل البريد الإلكتروني وأحرف السطر الجديد يمكنك أن ترى أن هناك العديد من رسائل البريد الإلكتروني ، والخط الجديد والمساحات الإضافية التي تشتت تماما. دعونا نتخلص منهم باستخدام التعبيرات العادية. tolist () # إزالة رسائل البريد الإلكتروني البيانات = [إعادة. sub (& apos؛ S * @ S * s؟ & a ؛، & apos؛ & apos ؛، sent) لإرسالها في البيانات] # إزالة أحرف الخط الجديد البيانات = [إعادة. sub (& apos؛ s + & apos؛، & apos؛ & apos ؛، sent) لإرسالها في البيانات] # إزالة علامات الاقتباس المفردة البيانات = [إعادة. sub (' & apos؛'، ''، sent) لإرسالها في البيانات] pprint (البيانات) [& apos؛ From: (where is my thing) الموضوع: ما هي هذه السيارة؟ Nntp-Posting-Host: & apos؛ وأبوس]؛ rac3. edu Organization: University of Maryland، College Park Lines: & apos؛ كنت أتسائل إذا كان أي شخص هناك يمكن أن ينيرني على هذه السيارة التي رأيتها & apos؛ و apos ، في اليوم الآخر. كانت سيارة رياضية ذات بابين ، بدا أنها من أواخر الستينيات. & apos؛ early 70s. في & أمبير ؛ وبالإضافة إلى ذلك ، كان المصد الأمامي منفصلًا عن باقي الجسم. )] بعد إزالة رسائل البريد الإلكتروني والمساحات الإضافية ، لا يزال النص يبدو مضطربًا. تحتاج إلى تقسيم كل جملة إلى قائمة كلمات من خلال tokenization ، في حين مسح كل النص الفوضوي في هذه العملية. كلمات Tokenize و text-up textLet s tokenize كل جملة في قائمة الكلمات ، وإزالة علامات الترقيم والحروف غير الضرورية تماما. Gensim s simple_preprocess () شيء عظيم لهذا. بالإضافة إلى ذلك ، لقد قمت بتعيين deacc = True لإزالة علامات الترقيم. def sent_to_words (الجمل): للجملة في الجمل: العائد (gensim. simple_preprocess (str (sentence)، deacc = True)) # deacc = True يزيل علامات الترقيم data_words = list (sent_to_words (data)) print (data_words) [[وأبوس]؛ من & أبوس]؛، & أبوس]؛ هرس وأبوس]؛، & أبوس]؛ بلدي وأبوس]؛، & أبوس]؛ شيء وأبوس]؛، & أبوس]؛ موضوع وأبوس]؛، & أبوس]؛ ما أحرزنا ؛، & أبوس]؛ [أبوس سيارة و؛، & أبوس]؛ هو و [أبوس ؛، & أبوس]؛ هذا وأبوس]؛، & أبوس]؛ NNTP وأبوس] ؛، & أبوس]؛ نشر وأبوس]؛، & أبوس]؛ المضيف وأبوس]؛، & أبوس]؛ راك وأبوس]؛، & أبوس]؛ وام & أبوس]؛، & أبوس]؛ الخفة وأبوس]؛، & أبوس]؛ ايدو وأبوس]؛، & أبوس]؛ وتنظيم وأبوس]؛، & أبوس]؛ الجامعة & أبوس]؛، & أبوس]؛ من & أبوس]؛، & أبوس]؛ ميريلاند وأبوس] ،، & apos؛ college & apos ؛، & apos؛ park & apos؛ & apos؛ lines & apos ؛، & apos؛ was was apos ؛، & apos؛ wonderling & apos ؛، & apos؛ & apos؛ & apos؛ & apos؛ & apos؛ & any؛ & apos؛ & apos؛ out & apos؛ & apos؛ there & apos؛ & apos؛ could & apos؛ '، & apos؛ تنوير & apos ؛، & apos؛ me & apos ؛، & apos؛ on & apos ؛، & apos؛ هذه & apos ؛، & apos؛ car & apos ؛، & apos؛ saw & apos ؛، & apos؛ & apos ؛، & apos؛ & apos ؛، & apos؛ day & apos ؛، (. إن إنشاء Bigram و Trigram ModelsBigrams هما كلمتان تحدثان كثيرًا في المستند. Trigrams هي 3 كلمات تحدث في كثير من الأحيان. بعض الأمثلة في مثالنا هي: front_bumper ، oil_leak ، maryland_college_park إلخ. يمكن لعنصر Gensim s أن يبني وينفذ البيرامس ، trigrams ، quadgrams وأكثر. الوسيطتان الهامتان إلى العبارات هما min_count و threshold. كلما ارتفعت قيم هذه المعلمات ، كلما ازدادت صعوبة الجمع بين الكلمات إلى البيراما. # بناء النماذج bigram و trigram بيغرام = جينسيم. عبارات (data_words ، min_count = 5 ، عتبة = 100) # عبارات أقل عتبة أعلى. عبارات (bigram، threshold = 100) # طريقة أسرع للحصول على جمل جملة مثل trigram / bigram bigram_mod = gensim. Phraser (trigram) # انظر المثال trigram طباعة (trigram_mod [bigram_mod [data_words) [& apos؛ from & apos؛، & apos؛ where & apos؛، & apos؛ My & apos ؛، & apos؛ thing & apos ؛، & apos؛ subject & apos؛، & apos؛ what & apos؛، & apos؛ car & apos ؛، & apos؛ is & apos ؛، & apos؛ this & apos ؛، & apos؛ nntp_posting_host & apos؛ ، & apos؛ rac_wam_umd_edu & apos ؛، & apos؛ organization & apos ؛، & apos ؛، & quot؛ الجامعة & apos؛ & & apos؛ of & apos ؛، & apos؛ maryland_college_park & apos ؛، & apos؛ lines & apos؛ & & apos؛ was & apos ؛، & apos؛ wonderling & apos؛ & & apos؛ if & apos؛ & apos؛ & any؛ & apos؛ ، & apos؛ out & apos؛، & apos؛ there & apos ؛، & apos؛ could & apos ؛، & apos؛ enlighten & apos ؛، & apos؛ me & apos ؛، & apos؛ on & apos؛ & & apos؛ & apos؛ & apos؛ car & apos؛ & & apos؛ saw & apos؛ & apos؛ & apos؛ ، & apos؛ & apos ؛، & apos؛ day & apos؛، & apos؛ it & apos ؛، & apos؛ was & apos ؛، & apos؛ door & apos ؛، & apos؛ sports & apos ؛، & apos؛ car & apos ؛، & apos؛ look & apos؛، & apos؛ to & apos؛ & & apos؛ be & apos؛ ، وأبوس]؛ من & أبوس]؛، & أبوس]، وأحرزنا ؛، & أبوس]؛ في وقت متأخر وأبوس]؛، & أبوس]؛ في وقت مبكر وأبوس]؛، & أبوس]، بل وأبوس]؛، & أبوس]؛ كان وأبوس]؛، & أبوس]؛ دعا وأبوس]؛، & أبوس]؛ إن Bricklin وأبوس]؛، & أبوس]، وأحرزنا ؛، & أبوس]؛ الأبواب وأبوس]؛ ، & apos؛ were & apos ؛، & apos؛ really & apos؛ & & apo s؛ الصغيرة & apos ؛، & apos؛ in & apos ؛، & apos؛ add & apos ؛، & apos؛ & & apos؛ & & apos؛ front_bumper & apos؛ (. إزالة Stopwords ، جعل Bigrams و Lemmatize نموذج bigrams جاهز. دع s حدد الوظائف لإزالة كلمات الإيقاف ، وقم بعمل bigrams و lemmatization واسمها بشكل تسلسلي. # تحديد وظائف ل stopwords ، bigrams ، trigrams و lemmatization def remove_stopwords (النصوص): return [[كلمة للكلمة في simple_preprocess (str (doc)) if word not in stop_words] for doc in texts] def make_bigrams (النصوص): return [bigram_mod for doc in texts] def make_trigrams (نصوص) : return [trigram_mod [bigram_mod for doc in texts] def lemmatization (text، allowed_postags = [& apos؛ NOUN & apos؛، & apos؛ ADJ & apos؛، & apos؛ VERB & apos؛، & apos؛ ADV & apos؛]): '' 'https: // spacy. io / api / annotation '' 'texts_out = [] لإرسالها في النصوص: doc = nlp (' '. pos_ in allowed_postags]) return texts_out دعونا ندعو وظائف بالترتيب. # إزالة كلمات التوقف data_words_nostops = remove_stopwords (data_words) # نموذج Bigrams data_words_bigrams = make_bigrams (data_words_nostops) # # # تهيئة spacy & apos؛ en & apos؛ نموذج ، مع الاحتفاظ فقط بمكون tagger (للكفاءة) # python3 -m spacy تنزيل ar nlp = spacy. load (& apos؛ en & apos ؛، disable = [& apos؛ parser & apos ؛، & apos؛ ner & apos؛]) # Do lemmatization keep only noun، adj، vb، adv data_lemmatized = lemmatization (data_words_bigrams، allowed_postags = [& apos؛ NOUN & apos؛، & apos؛ ADJ & apos؛، & apos؛ VERB & apos؛، & apos؛ ADV & apos؛]) print (data_lemmatized) [[& apos؛ where & apos؛، & apos؛ s & apos؛، & apos؛ thing & apos؛، & apos؛ car & apos؛، & apos؛ nntp_post & apos؛، & apos؛ host & apos ؛، & apos؛ rac_wam & apos؛ & & apos؛ umd & apos؛ & apos؛ organization & apos؛، & apos؛ university & apos؛ ؛، & أبوس]؛ maryland_college وأبوس]؛، & أبوس]؛ حديقة وأبوس]؛، & أبوس]؛ خط وأبوس]؛، & أبوس]؛ عجب وأبوس]؛، & أبوس]؛ أي شخص وأبوس]؛، & أبوس]؛ يمكن وأبوس]؛، & أبوس]؛ تنوير وأبوس]؛، & أبوس]؛ سيارة وأبوس]؛، & أبوس]، وانظر وأبوس]؛، & أبوس]؛ يوم وأبوس] ؛، & أبوس]؛ باب وأبوس]؛، & أبوس]؛ الرياضة وأبوس]؛، & أبوس]؛ [أبوس سيارة و؛، & أبوس]؛ تبدو وأبوس]؛، & أبوس]؛ في وقت متأخر وأبوس]؛، & أبوس]؛ في وقت مبكر وأبوس]؛، & أبوس]؛ استدعاء وأبوس]؛، & أبوس]؛ إن Bricklin وأبوس]؛، & أبوس]؛ باب وأبوس]؛، & أبوس]؛ حقا وأبوس] ؛، & أبوس]؛ صغيرة وأبوس]؛، & أبوس]؛ بالإضافة أحرزنا ؛، & أبوس]؛ front_bumper وأبوس]؛، & أبوس]؛ منفصلة وأبوس]؛، & أبوس]؛ بقية وأبوس]؛، & أبوس]؛ الجسم وأبوس]؛، & أبوس]؛ المعرفة وأبوس]؛، & أبوس]؛ أي شخص وأبوس]؛، & أبوس]؛ تيلمي وأبوس]؛، & أبوس]؛ نموذج وأبوس] ؛، & apos؛ name & apos ؛، & apos؛ engine & apos ؛، & apos؛ & quot ؛، & apos ؛، & year & apos ؛، & apos؛ & quot ؛، & apos ؛، & apos ؛، & quot ؛، & quot ؛، & quot ؛، & apos ؛، & apos ؛، & apos؛ ؛، & apos؛ funky & apos ؛، & apos؛ look & apos ؛، & apos؛ car & apos ؛، & apos؛ mail & apos ؛، & apos؛ thank & apos ؛، & apos؛ bring & apos ؛، & apos؛ neighborhood & apos ؛، & apos؛ lerxst & apos؛]] 11. إنشاء المعجم والكورب اللازمين لنمذجة الموضوع. المدخلان الرئيسيان لنموذج موضوع LDA هما القاموس (id2word) والجسم. القاموس (data_lemmatized) # إنشاء كوربوس texts = data_lemmatized # Term Document Frequency corpus = [id2word. doc2bow (النص) للنص في النصوص] # View طباعة (جسم) [[(0، 1)، (1، 2)، (2، 1)، (3، 1)، (4، 1)، (5، 1)، (6، 5)، (7، 1)، (8 ، 1) ، (9 ، 2) ، (10 ، 1) ، (11 ، 1) ، (12 ، 1) ، (13 ، 1) ، (14 ، 1) ، (15 ، 1) ، (16 ، 1) ، (17 ، 1) ، (18 ، 1) ، (19 ، 1) ، (20 ، 1) ، (21 ، 1) ، (22 ، 2) ، (23 ، 1) ، (24 ، 1 ) ، (25 ، 1) ، (26 ، 1) ، (27 ، 1) ، (28 ، 1) ، (29 ، 1) ، (30 ، 1) ، (31 ، 1) ، (32 ، 1) ، (33 ، 1) ، (34 ، 1) ، (35 ، 1) ، (36 ، 1) ، (37 ، 1) ، (38 ، 1) ، (39 ، 1) ، (40 ، 1) ، (41 ، 1) ، (42 ، 1) ، (43 ، 1) ، (44 ، 1) ، (45 ، 1) ، (46 ، 1) ، (47 ، 1) ، (48 ، 1) ، (49 ، 1 )، (50، 1)]] يقوم Gensim بإنشاء معرف فريد لكل كلمة في المستند. يمثل الجسم الذي تم عرضه أعلاه تخطيطًا لـ (word_id ، word_frequency). على سبيل المثال ، (0 ، 1) أعلاه تشير إلى أن كلمة id 0 تحدث مرة واحدة في المستند الأول. إذا كنت ترغب في معرفة الكلمة التي يطابقها معرف معين ، فمرر المعرّف كمفتاح إلى القاموس. id2word وأبوس]؛ بالإضافة أحرزنا أو ، يمكنك أن ترى شكلاً يمكن قراءته عن جسم الشخص نفسه. # نسق مقروء للقراءة من الجسم (المدة-التردد) [[(id2word، freq) for id، freq in cp] for cp in corpus [[(& apos؛ addition & apos؛، 1)، (& apos؛ anypos & apos ؛، 2)، (& apos؛ body & apos ؛، 1)، (& apos؛ bricklin & apos ؛، 1)، (& apos؛ bring & apos ؛، 1)، (& apos؛ call & apos ؛، 1)، (& apos؛ car & apos ؛، 5)، (& apos؛ could & apos ؛، 1)، (& apos؛ day & apos ؛، 1)، (& apos؛ door & apos ؛، 2)، (& apos؛ early & apos؛، 1) ، (& apos؛ engine & apos ؛، 1)، (& apos؛ enlighten & apos ؛، 1)، (& apos؛ front_bumper & apos ؛، 1)، (& apos؛ maryland_college & apos ؛، 1)، (. )]] حسنًا ، بدون الاستطراد ، دعنا نرجع إلى المسار الصحيح مع الخطوة التالية: بناء نموذج الموضوع. بناء نموذج الموضوع لدينا كل ما هو مطلوب لتدريب نموذج LDA. بالإضافة إلى مجموعة النصوص والقاموس ، تحتاج إلى توفير عدد المواضيع أيضًا. بصرف النظر عن ذلك ، alpha و eta هما hyperparameters التي تؤثر على تباين الموضوعات. ووفقًا لمستندات Gensim ، فإن كلا التعيينات الافتراضية تصل إلى 1. chunksize هو عدد الوثائق التي سيتم استخدامها في كل مقطع تدريب. يحدد update_every عدد المرات التي يجب فيها تحديث معلمات النموذج وتمثل المرات العدد الإجمالي لتمريرات التدريب. LdaModel (corpus = corpus، id2word = id2word، num_topics = 20، random_state = 100، update_every = 1، chunksize = 100، passes = 10، alpha = & apos؛ auto & apos ؛، per_word_topics = True) 13. عرض المواضيع في نموذج LDA تم بناء نموذج LDA أعلاه مع 20 موضوعًا مختلفًا حيث يكون كل موضوع عبارة عن مجموعة من الكلمات الرئيسية وتساهم كل كلمة رئيسية في إحالة معينة إلى الموضوع. يمكنك رؤية الكلمات الرئيسية لكل موضوع والوزن (الأهمية) لكل كلمة رئيسية باستخدام lda_model. print_topics () كما هو موضح في المرة التالية. # اطبع الكلمة الرئيسية في الموضوعات العشرة pprint (lda_model. print_topics ()) doc_lda = lda_model [(0 ، & apos؛ 0. 007 * 'syndrome' & apos؛)، (3، & apos؛ 0. 007 * 'american' & apos؛)، (9، & apos؛ 0. 008 * 'الكتاب المقدس' + & apos؛ وأبوس]؛ 0. 007 * 'التنبؤ' & apos؛) ، (13 ، & apos؛ 0. 010 * 'available' & apos؛)، (17، & apos؛ 0. 006 * 'البحث' وأبوس]؛)] كيفية تفسير هذا؟ الموضوع 0 هو تمثيل كـ _0. هذا يعني أن أهم 10 كلمات رئيسية تساهم في هذا الموضوع هي: السيارة ، الطاقة ، الضوء . وهكذا فإن وزن السيارة في الموضوع 0 هو 0. تعكس الأوزان مدى أهمية الكلمة الرئيسية لهذا الموضوع. بالنظر إلى هذه الكلمات الرئيسية ، هل يمكنك تخمين ما يمكن أن يكون هذا الموضوع؟ يمكنك تلخيص ذلك إما السيارات أو السيارات . وبالمثل ، هل يمكنك الذهاب من خلال الكلمات الرئيسية للموضوع الباقي وحكم ما هو الموضوع؟ استنتاج الموضوع من Keywords14. احتمالية نموذج الحيرة والاتساق نقاط الحيرة والترابط الموضوعي يوفران مقياسًا مناسبًا للحكم على مدى جودة نموذج موضوع معين. في تجربتي ، كانت درجة الاتساق الموضوع ، على وجه الخصوص ، أكثر فائدة. # حساب الحيرة print (& apos؛ nPerplexity: & apos؛، lda_model. log_perplexity (corpus)) # مقياس لمدى جودة النموذج. # حساب تماسك النقاط coherence_model_lda = CoherenceModel (model = lda_model، texts = data_lemmatized، dictionary = id2word، coherence = & apos؛ c_v & apos؛) coherence_lda = coherence_model_lda. get_coherence () print (& apos؛ nCoherence Score: & apos؛، coherence_lda) الحيرة: -8. 532947587081 هناك لديك درجة التماسك من 0. تصور الموضوعات-الكلمات الرئيسية الآن ، وباعتماد نموذج LDA ، فإن الخطوة التالية هي فحص الموضوعات التي تم إنتاجها والكلمات الرئيسية المرتبطة بها. لا توجد أداة أفضل من الرسم البياني التفاعلي لحزمة pyLDAvis وهو مصمم للعمل بشكل جيد مع أجهزة الكمبيوتر المحمولة jupyter. التحضير (lda_model ، corpus ، id2word) فيما الناتج pyLDAvis فكيف لاستنتاج الناتج s pyLDAvis؟ كل فقاعة على الجانب الأيسر مؤامرة يمثل موضوعا. كلما كانت الفقاعة أكبر ، كلما كان هذا الموضوع أكثر شيوعًا. سيكون هناك نموذج جيد للموضوع يحتوي على فقاعات كبيرة غير متداخلة بشكل كبير ومتفرقة في جميع أنحاء المخطط بدلاً من تجميعها في ربع واحد. عادةً ما يكون هناك نموذج يحتوي على عدد كبير جدًا من الموضوعات ، ويتداخل مع العديد من التداخلات ، وتتجمع فقاعات صغيرة الحجم في منطقة واحدة من المخطط. حسنًا ، إذا حركت المؤشر فوق أحد الفقاعات ، فسيتم تحديث الكلمات والأشرطة على الجانب الأيسر. هذه الكلمات هي الكلمات الرئيسية البارزة التي تشكل الموضوع المحدد. نظرًا لمعرفتنا السابقة بعدد المواضيع الطبيعية في المستند ، كان العثور على أفضل نموذج واضحًا إلى حد ما. Upnext ، سنقوم بتحسين هذا النموذج من خلال استخدام نسخة Mallet s من خوارزمية LDA ثم سنركز على كيفية الوصول إلى العدد الأمثل من الموضوعات في ضوء أي مجموعة كبيرة من النصوص. بناء LDA Mallet ModelSo حتى الآن كنت قد رأيت Gensim s يحمل في ثناياه عوامل نسخة من خوارزمية LDA. ومع ذلك ، غالبًا ما يعطي إصدار ماليت جودة أفضل للمواضيع. يوفر Gensim المجمع لتطبيق Mallet s LDA من داخل Gensim نفسه. ما عليك سوى تنزيل ملف zipfile وفك ضغطه وتوفير المسار إلى مطرقة في الدليل الذي تم فك ضغطه إلى gensim. الرمز البريدي mallet_path = & apos؛ path / to / mallet-2. 8 / بن / مطرقة وأبوس]؛ # تحديث هذا المسار ldamallet = gensim. LdaMallet (mallet_path، corpus = corpus، num_topics = 20، id2word = id2word) # اعرض المواضيع pprint (ldamallet. show_topics (formatted = False)) # Compute Consherence Score coherence_model_ldamallet = CoherenceModel (model = ldamallet، texts = data_lemmatized، dictionary = id2word، coherence = & apos؛ c_v & apos؛) coherence_ldamallet = coherence_model_ldamallet. get_coherence () print (& apos؛ nCoherence Score: & apos؛، coherence_ldamallet) [(13، [(& apos؛ god & apos ؛، 0. 022175351915726671)، (& apos؛ christian & apos ؛، 0. 017560827817656381) ، (& apos؛ people & apos ؛، 0. 0088794630371958616)، (& apos؛ bible & apos ؛، 0. 008215251235200895) ، (& apos؛ word & apos ؛، 0. 0077491376899412696)، (& apos؛ church & apos ؛، 0. 0074112053696280414)، (& apos؛ religion & apos ؛، 0. 0071198844038407759) ، (& apos؛ man & apos ؛، 0. 0067936049221590383)، (& apos؛ faith & apos ؛، 0. 0067469935676330757)، (& apos؛ love & apos ؛، 0. 0064556726018458093)])، (1، [(& apos؛ organization & apos ؛، 0. 10977647987951586)، (& apos؛ line & apos ؛، 0. 10182379194445974)، (& apos؛ write & apos ؛، 0. 097397469098389255) ، (& apos؛ article & apos ؛، 0. 082483883409554246) ، (& apos؛ nntp_post & apos ؛، 0. 079894209047330425) ، (& apos؛ host & apos ؛، 0. 069737542931658306) ، (& apos؛ university & apos ؛، 0. 066303010266865026)، (& apos؛ reply & apos ؛، 0. 02255404338163719)، (& apos؛ distribution_world & apos ؛، 0. 014362591143681011)، (& apos؛ usa & apos ؛، 0. 010928058478887726)])، (8، [(& apos؛ file & apos ؛، 0. 02816690014008405) ، (& apos؛ line & apos ؛، 0. 021396171035954908) ، (& apos؛ problem & apos ؛، 0. 013508104862917751) ، (& apos؛ program & apos ؛، 0. 013157894736842105) ، (& apos؛ read & apos ؛، 0. 012607564538723234) ، (& apos؛ follow & apos ؛، 0. 01110666399839904) ، (& apos؛ number & apos ؛، 0. 011056633980388232)، (& apos؛ set & apos ؛، 0. 010522980454939631)، (& apos؛ error & apos ؛، 0. 010172770328863986)، (& apos؛ write & apos ؛، 0. 010039356947501835)])، (7، [(& apos؛ include & apos ؛، 0. تحميل برنامج hotspot shield هوت سبوت شيلد الجديد 2019 ثانوي. 0091670556506405262) ، (& apos؛ information & apos ؛، 0. 0088169700741662776)، (& apos؛ national & apos ؛، 0. 0085576474249260924) ، (& apos؛ year & apos ؛، 0. 0077667133447435295) ، (& apos؛ report & apos ؛، 0. 0070406099268710129) ، (& apos؛ university & apos ؛، 0. 0070406099268710129) ، (& apos؛ book & apos ؛، 0. 0068979824697889113)، (& apos؛ program & apos ؛، 0. 0065219646283906432) ، (& apos؛ group & apos ؛، 0. 0058866241377521916) ، (& apos؛ service & apos ؛، 0. 632431683088 فقط عن طريق تغيير خوارزمية LDA ، قمنا بزيادة درجة التماسك من . كيفية العثور على العدد الأمثل من الموضوعات لـ LDA - الطريقة التي أتبعها للعثور على العدد الأمثل من الموضوعات هي إنشاء العديد من نماذج LDA بقيم مختلفة من عدد الموضوعات (k) واختيار القيمة التي تعطي أعلى قيمة تماسك. اختيار k الذي يمثل نهاية النمو السريع لاتساق الموضوع عادة ما يقدم مواضيع ذات معنى وتفسير. يمكن أن يوفر اختيار قيمة أعلى في بعض الأحيان مزيدًا من الموضوعات الفرعية الدقيقة. إذا كنت ترى الكلمات الرئيسية نفسها تتكرر في مواضيع متعددة ، فمن المحتمل أن تكون علامة على أن k كبير جدًا. تقوم compute_coherence_values () (انظر أدناه) بتدريب نماذج LDA متعددة وتوفر النماذج ودرجات التماسك المقابلة لها. def comput_coherence_values (القاموس ، corpus ، النصوص ، الحد ، start = 2 ، step = 3): '' 'حساب تماسك c_v للعديد من المواضيع المعلمات: ---------- القاموس: قاموس Gensim corpus: Gensim نصوص النصوص: قائمة نصوص الإدخال الحد الأقصى: عدد الصفحات التي تم إرجاعها: ------- model_list: قائمة نماذج نماذج LDA coherence_values: قيم التماسك المقابلة لنموذج LDA مع عدد المواضيع '' 'coherence_values = [] model_list = [] لـ num_topics في النطاق (start، limit، step): model = gensim. LdaMallet (mallet_path، corpus = corpus، num_topics = num_topics، id2word = id2word) model_list. إلحاق (نموذج) coherencemodel = CoherenceModel (نموذج = نموذج ، نصوص = نصوص ، قاموس = قاموس ، تماسك = & apos؛ c_v & apos؛) coherence_values. get_coherence ()) return model_list ، coherence_values # يمكن أن يستغرق وقتا طويلا للتشغيل. model_list ، coherence_values = compute_coherence_values (القاموس = id2word ، corpus = corpus ، النصوص = data_lemmatized ، start = 2 ، limit = 40 ، step = 6) # عرض الرسم البياني الحد = 40؛ بدء = 2؛ خطوة = 6؛ س = النطاق (بداية ، حد ، خطوة) معاهدة قانون البراءات. مؤامرة (س ، coherence_values) معاهدة قانون البراءات. xlabel ('Num Topics') معاهدة قانون البراءات. ylabel ('درجة التماسك') معاهدة قانون البراءات. legend (('coherence_values')، loc = & apos؛ best & apos؛) معاهدة قانون البراءات. تبين() اختيار العدد الأمثل لموضوعات LDA # اطبع نقاط التماسك لـ m، cv in zip (x، coherence_values): print ('Num Topics ='، m، 'has Coherence Value of'، round (cv، 4)) Num Topics = 2 له قيمة التماسك 0. 5943 Num Topics = 14 has a Consher Value of 0. 6208 Num Topics = 20 has a Consher Value of 0. 6438 Num Topics = 26 has a Consher Value of 0. 643 Num Topics = 32 لديه قيمة التماسك من 0. 6525 إذا بدت درجة التماسك في ازدياد ، فقد يكون من الأفضل اختيار النموذج الذي أعطى أعلى سيرتك الذاتية قبل تسطيح. لذلك ، بالنسبة إلى الخطوات الإضافية ، سأختار النموذج مع 20 موضوعًا بحد ذاتها. # حدد النموذج وطباعة المواضيع optimal_model = model_list model_topics = optimal_model. show_topics (منسق = خطأ) pprint (optimal_model. print_topics (NUM_WORDS = 10)) [(0 ، & apos؛ 0. 008 * 'application' & apos؛)، (2، & apos؛ 0. 006 * 'سلاح ناري' و 'apos؛)، (3، & apos؛ 0. 008 * 'الكتاب المقدس' + & apos؛ وأبوس]؛ 0. )] كانت تلك الموضوعات لنموذج LDA المختار. العثور على الموضوع المهيمن في كل جملة واحد من التطبيق العملي لنمذجة الموضوع هو تحديد الموضوع الذي تتناوله وثيقة معينة. للعثور على ذلك ، نجد رقم الموضوع الذي يحتوي على أعلى نسبة مساهمة في هذا المستند. تعمل الدالة format_topics_sentences () أدناه بشكل رائع على تجميع هذه المعلومات في جدول قابل للتطبيق. def format_topics_sentences (ldamodel = lda_model، corpus = corpus، texts = data): # Init output sent_topics_df = pd. DataFrame () # احصل على الموضوع الرئيسي في كل وثيقة من أجل ، الصف في التعداد (ldamodel): row = sorted (row، key = lambda x: (x)، reverse = True) # احصل على الموضوع المسيطر ومساهمة Perc والكلمات الرئيسية لـ كل مستند لـ j ، (topic_num ، prop_topic) في التعداد (الصف): if j == 0: # => dominant topic wp = ldamodel. show_topic (topic_num) topic_keywords = '،'. انضمام ([كلمة للكلمة ، دعامة في الفسفور]) sent_topics_df = sent_topics_df. السلسلة ([int (topic_num) ، الجولة (prop_topic ، 4) ، topic_keywords]) ، ignore_index = True) آخر: break sent_topics_df. الأعمدة = [& apos؛ Dominant_Topic & apos ؛، & apos؛ Perc_Contribution & apos ؛، & apos؛ Topic_Keywords & apos؛] # إضافة نص أصلي إلى نهاية محتويات المخرجات = pd. concat ([sent_topics_df، contents]، axis = 1) return (sent_topics_df) df_topic_sents_keywords = format_topics_sentences (ldamodel = optimal_model، corpus = corpus، text = data) # Format df_dominant_topic = df_topic_sents_keywords. columns = [& apos؛ Document_No & apos ؛، & apos؛ Dominant_Topic & apos ؛، & apos؛ Topic_Perc_Contrib & apos؛، & apos؛ Keywords & apos ؛، & apos؛ Text & apos؛] # Show df_dominant_topic. العثور على المستند الأكثر تمثيلاً لكل موضوع أحيانًا قد لا تكون الكلمات الرئيسية للموضوع كافية لإدراك معنى الموضوع. لذلك ، للمساعدة في فهم الموضوع ، يمكنك العثور على المستندات التي ساهم فيها موضوع معين في أكثر المواضيع واستنتاجها بقراءة هذه الوثيقة. # مجموعة أعلى 5 جمل تحت كل موضوع sent_topics_sorteddf_mallet = pd. DataFrame () sent_topics_outdf_grpd = df_topic_sents_keywords. groupby (& apos؛ Dominant_Topic & apos؛) for i، grp in sent_topics_outdf_grpd: sent_topics_sorteddf_mallet = pd. concat ([sent_topics_sorteddf_mallet، grp. sort_values ([& apos؛ Perc_Contribution & apos؛]، تصاعدي =). head (1)]، axis = 0) # Reset Index sent_topics_sorteddf_mallet. reset_index (drop = True، inplace = True) # Format sent_topics_sorteddf_mallet. الأعمدة = [& apos؛ Topic_Num & apos؛ و 'Topic_Perc_Contrib' و 'Keywords' و 'Text'] # Show sent_topics_sorteddf_mallet. رئيس() معظم ممثل الممثل لكل وثيقة يحتوي على الجدول الجدول أعلاه في الواقع 20 صفوف ، واحد لكل موضوع. يحتوي على رقم الموضوع والكلمات الرئيسية والمستند الأكثر تمثيلاً.
0 Comments
Leave a Reply. |
AuthorWrite something about yourself. No need to be fancy, just an overview. Archives
March 2019
Categories |