مقدمة للتنقيب في النصوص (الجزء الثاني)

265

في هذا المقال سوف نتعمق في طرق مختلفة لتوصيف المواضيع.

في مهام فهم اللغات الطبيعية Natural Language Understanding (NLU)، هناك تسلسل هرمي لاستخراج المعاني – من الكلمات للجمل للفقرات للوثائق. في مستوى الوثائق، إحدى أهم الوسائل لفهم النص هي تحليل المواضيع. عملية تعلم وتعرف واستخراج المواضيع عبر مجموعة من الوثائق هي عملية توصيف المواضيع Topic Modelling.

في هذا المقال نستعرض أربع أشهر طرق لتوصيف المواضيع.

مقدمة

كل توصيفات المواضيع Topic Models مبنية على نفس الفرضيات:

  • كل وثيقة مكونة من خليط من المواضيع
  • كل موضوع مكون من مجموعة من الكلمات

أي أن معنى الوثيقة محكومة بمتغيرات خفية أو “كامنة”. فالهدف من الـ Topic Modelling هو الكشف عن هذه المتغيرات لاستخراج معنى النص. باقي المقال يتعرض لطرق مختلفة للقيام بذلك.

أولًا : LSA

التحليل الدلالي الكامن هو أحد الطرق الأساسية في الـ Topic Modelling. الفكرة الأساسية تعتمد على بناء مصفوفة للوثائق-الكلمات ثم فصلها إلى تمثيل vector representation لكل من الوثائق والكلمات بدلالة المواضيع.

لبناء المصفوفة الأساسية نعتمد على Term Frequency – Inverse Document Frequency (TF-IDF) لأنه يعطي وزن أفضل لكل كلمة وأهميتها في الوثيقة بدلاً من عدّ الكمات فقط فهو أقل تعبيراً.

لحساب الـ TF-IDF:

فهذا يعطي وزن أكبر للكمات المتكررة في الوثيقة ولكن ليست منتشرة في كل الوثائق.

ثم نستخدم طرق تقليل الأبعاد لنصل إلى التمثيل vector representation بدلالة المواضيع:

A = Uk Sk VkT

باستخدام هذا التمثيل يمكننا:

  • تحديد التشابه بين الوثائق
  • تحديد التشابه بين الكلمات
  • تحديد التشابه بين كلمات (مثل في محرك بحث) والوثائق

من عيوب الـ LSA:

  • عدم وضوح التمثيل، فالمواضيع غير واضحة والمعاملات تختلف قيمها بطريقة غير سهلة التأويل.
  • تحتاج لكمية ضخمة من الوثائق والكلمات لنحصل على نتائج دقيقة
  • التمثيل قليل الكفاءة

لمعرفة المزيد عن الـ LSA وتطبيقه بـ Python انظر للمقال السابق:

مقدمة للتنقيب في النصوص (الجزء الأول)

ثانيًا: PLSA

وهو Probabilistic Latent Semantic Analysis أي أنه يستخدم نظرية الاحتمالات لتقليل الأبعاد بدلا من الـ Singular Value Decomposition (SVD). الفكرة هي إيجاد نموذج احتمالي بمواضيع كامنة يمكنه توليد الداتا التي نراها في مصفوفة الوثائق-الكلمات. أي أننا نريد P(D,W) حيث أن لكل وثيقة d ولكل كلمة w، فإن P(d,w) توافق مكانها في مصفوفة الوثائق-الكلمات.

لنذكر الفرضيتين الأساسيتين للـ Topic Models: لكل وثيقة مواضيع، ولكل موضوع كلمات. يضيف الـ pLSA إضافة احتمالية لذلك:

  • في الوثيقة d، الموضوع z موجود في تلك الوثيقة باحتمال P(z|d)
  • الموضوع z، الكلمة w جاءت منه باحتمال P(w|z)

إذا الاحتمال المشترك لظهور وثيقة وكلمة معاً:

P(D,W) = P(D)∑P(Z|D)P(W|Z)

بمعنى آخر، هذا التعبير يخبرنا كم هو محتمل رؤية وثيقة ما، وبناء على توزيع المواضيع فيها ما هو احتمال ظهور كلمة معينة فيها.

في هذه الحالة، P(D)، P(Z|D) و P(W|Z) هي معاملات النموذج الاحتمالي. يمكن حساب P(D) من الداتا. نحاول تقدير P(Z|D) و P(W|Z) على أنهما multinomial distributions باستخدام خوارزمية Expectation Maximization (EM).

يمكن تحليل P(D,W) بدلالة أخرى:

P(D,W) = ∑P(Z)P(D|Z)P(W|Z)

هذه الدلالة تعتبر توليدية generative. في الدلالة الأولى نبدأ بالوثيقة P(d) ثم نولد الموضوع P(z|d) ثم نولد الكلمات P(w|z). في الدلالة الثانية نبدأ بالموضوع P(z) ثم بصورة مستقلة نولد كلاً من الوثيقة P(d|z) والكلمات P(w|z).

الشيء الملفت في الدلالة الثانية هو التشابه مع الـ LSA:

هذا يخبرنا أنه رغم اختلاف طريقتي الـ LSA و الـ pLSA إلا أنهما متكاملان، فالـ pLSA تضيف جزء الاحتمالات على الـ LSA. يعتبر الـ pLSA أكثر مرونة ولكن من بعض عيوبه:

  • ليس لدينا نموذج لـ P(D) فلا يمكننا إضافة وثائق جديدة
  • تزداد عدد معاملات الـ pLSA خطيا مع عدد الوثائق مما يجعله عرضة للتعلم المفرط overfitting

نادراً ما يستخدم الـ pLSA وحده. في العادة عندما نريد طريقة أقوى من الـ LSA نلجأ للـ LDA وهو من أشهر طرق الـ Topic Modelling المستخدمة.

ثالثًا: LDA

وهو تخصيص ديريتشليت الكامنة، ويعتبر النسخة المبنية على نظرية بايز Bayesian من الـ pLSA. فهو يستخدم سوابق ديريتشليت Dirichlet priors في نماذج الوثائق-المواضيع والكلمات-المواضيع مما يجعله أكثر قدرة على التعميم generalization.

لمعرفة المزيد عن الشرح الرياضي يمكن قراءة:

https://www.quora.com/What-is-an-intuitive-explanation-of-the-Dirichlet-distribution

https://stats.stackexchange.com/questions/244917/what-exactly-is-the-alpha-in-the-dirichlet-distribution

باختصار الـ Dirichlet distribution هي توزيع للتوزيعات. يمكنها إجابة السؤال:

إذا كان لدينا هذا النوع من التوزيعات، ما هي التوزيعات الفعلية التي يمكن أن نراها؟

لنتطرق لمثال عن مقارنة توزيعات خليط من المواضيع. لنقل أن مجموعة الوثائق لدينا له 3 مواضيع مختلفة جداً. إذا أردنا وصف هذا، فنوع التوزيعات التي نريد ستكون تلك التي تعطي وزن كبير جداً لأحد المواضيع ولا تعطي وزن كبير لباقي المواضيع. إذا من التوزيعات الواقعية التي يمكن أن نراها:

  • خليط 1: 90% الموضوع 1، 5% الموضوع 2، 5% الموضوع 3
  • خليط 2: 5% الموضوع 1، 90% الموضوع 2، 5% الموضوع 3
  • خليط 3: 5% الموضوع 1، 5% الموضوع 2، 90% الموضوع 3

فإذا سحبنا عينة من هذه الـ Dirichlet distribution سنجد توزيعات مشابهة جداً للخليط 1 أو 2 أو 3. سيكون من الصعب جدا أن نجد مثلا خليطاً متساو التوزيع 33% في هذه الحالة.

وهذا جوهر ال Dirichlet distribution: تعطينا طريقة للحصول على توزيعات احتمالية probability distributions من نوع محدد.

في الـ pLSA نسحب عينة وثيقة، ثم موضوعاً بناء على هذه الوثيقة، ثم الكلمات بناء على الموضوع.

في الـ LDA، من Dirichlet distribution نسحب عينة توزيع الموضوع لوثيقة محددة، ومن هذا التوزيع نحدد الموضوع Z.

ثم من Dirichlet distribution أخرى نسحب عينة تمثل توزيع الكلمات، ومنها نحدد الكلمات.

عادة يعمل الـ LDA أفضل من الـ pLSA لأنه لديه القدرة على التعميم لوثائق جديدة بسهولة.

كود للتطبيق:

import re
import numpy as np
import pandas as pd
import pylab as plt
from gensim import corpora
from gensim.models import LdaModel, LdaMulticore
from nltk.corpus import stopwords
import umap

df = pd.read_csv('arabic_dataset_classifiction.csv')
df.fillna('', inplace=True)

data_processed = []
stop_words = frozenset(stopwords.words('arabic'))

for i, doc in enumerate(df.text):
    data_processed.append([wd for wd in re.split(r'\W', doc) if wd not in stop_words])

dct = corpora.Dictionary(data_processed)
corpus = [dct.doc2bow(line) for line in data_processed]

lda_model = LdaMulticore(corpus=corpus,
                         id2word=dct,
                         random_state=100,
                         num_topics=5,
                         passes=10,
                         chunksize=1000,
                         batch=False,
                         alpha='asymmetric',
                         decay=0.5,
                         offset=64,
                         eta=None,
                         eval_every=0,
                         iterations=100,
                         gamma_threshold=0.001,
                         per_word_topics=True)
                         
lda_model.print_topics(-1)

topics = np.zeros((len(corpus),5))
for i, doc in enumerate(lda_model.get_document_topics(corpus)):
    for t in doc:
        topics[i,t[0]] = t[1]
        
embedding = umap.UMAP(n_neighbors=150, min_dist=0.5, random_state=12).fit_transform(topics)
plt.figure(figsize=(7,5)) 
plt.scatter(embedding[::100, 0], embedding[::100, 1], 
c = df.targe.iloc[::100], 
s = 10, # size 
edgecolor='none' ) 
plt.show()
lda

المواضيع:

(0,
'0.014*"الفريق" + 0.010*"الرياضي" + 0.006*"" + 0.005*"الرجاء" + 0.005*"المباراة" + 0.005*"القدم" + 0.004*"مباراة" + 0.004*"قبل" + 0.004*"الموسم" + 0.004*"الجامعة"'),
(1,
'0.007*"قبل" + 0.007*"" + 0.005*"القضائية" + 0.004*"العامة" + 0.004*"أنه" + 0.004*"عناصر" + 0.004*"كان" + 0.004*"الشرطة" + 0.003*"تم" + 0.003*"المتهم"'),
(2,
'0.032*"" + 0.005*"المغربية" + 0.004*"خلال" + 0.004*"كان" + 0.003*"المغربي" + 0.003*"محمد" + 0.003*"عبد" + 0.002*"المغرب" + 0.002*"أنه" + 0.002*"كانت"'),
(3,
'0.006*"المغرب" + 0.005*"خلال" + 0.005*"المغربية" + 0.005*"الحكومة" + 0.004*"العام" + 0.004*"" + 0.003*"رئيس" + 0.003*"المائة" + 0.003*"حزب" + 0.003*"درهم"'),
(4,
'0.011*"المنتخب" + 0.007*"الوطني" + 0.005*"كأس" + 0.005*"القدم" + 0.005*"المباراة" + 0.005*"" + 0.004*"إفريقيا" + 0.004*"أمام" + 0.004*"مباراة" + 0.004*"المغربي"')

باستخدام الـ LDA يمكننا استخراج مواضيع مفهومة، حيث كل موضوع متصل بشدة مع الكلمات الأكثر تعبيراً عنه.

رابعًا: الـ LDA مع الـ Deep Learninglda2vec

تحدثنا في أول المقال عن هرمية استخراج المعاني من الكلمات للجمل للوثائق. عادة نستخدم تضمين الكلمات word2vec لاستخراج معاني الكلمات. يهدف lda2vec لربط ال word2vec مع ال LDA ليتعلمهما سوياً ويستفيد من قوة كل منهما.

يعدل ال lda2vec في الفكرة الأساسية لنموذج ال skip-gram، فبدلاً من word vector للتنبؤ بالكلمات المجاورة. نقوم بإنشاء context vector من جمع ال word vector وال document vector.

للمزيد عن ال skip-gram وال lda2vec

http://mccormickml.com/2016/04/19/word2vec-tutorial-the-skip-gram-model

https://multithreaded.stitchfix.com/blog/2016/05/27/lda2vec

خاتمة

كثيراً ما نعامل نماذج توصيف المواضيع كأنها صناديق سوداء. لكن بخلاف ال neural networks، فإن هذه النماذج يمكن فهمها وتفسيرها مما يسهل استخدامها وضبطها لتلائم احتياجاتنا.

المصدر:

https://medium.com/nanonets/topic-modeling-with-lsa-psla-lda-and-lda2vec-555ff65b0b05

تعليقات