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

Topic modelling with Latent Semantic Analysis (LSA)

640

هل زرتم يوما مكتبة منظمة؟ إنه شيء مذهل قدرة أمناء المكتبة على تنظيم الكتب بالاسم والمحتوى والمؤلف. ولكن إذا أعطيناهم آلاف الكتب الجديدة لتنظيمها حسب مواضيعها سيستغرق الأمر أيام أو أسابيع!

يمكننا استخدام قوة الـ NLP للتعامل مع هذه المشكلة.

مشكلة الـ Topic Modelling تهدف إلى تجميع النصوص المتشابهة في الموضوع Topic تحت أصناف منفصلة، بطريقة unsupervised.

مثال:

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

الموضوع الأولالموضوع الثانيالموضوع الثالث

نرى أن هناك ثلاث مواضيع. يستطيع Topic Model جيد أن يصنف المصطلحات إلى أفضل موضوع يصفها. في الفقرة السابقة أكثر المواضيع وضوحا هو الثاني لأن الفقرة تتحدث عن الفيديوهات المزيفة.

إذا شدكم فكرة الـ Topic Modelling انتباهكم، أكملوا المقال لنتعرف أكثر عنه وطرق تنفيذه، ويمكنكم الاستفادة منه في تطبيقات الـ NLP.

أنصح بقراءة هذا المقال لمعرفة بعض المصطلحات المستخدمة لبناء الـ topic models

https://www.analyticsvidhya.com/blog/2018/08/dimensionality-reduction-techniques-python/

ما هو توصيف المواضيع Topic Modelling

نعرف الـ Topic Model بأنه طريقة unsupervised لاكتشاف المواضيع في عدة نصوص. نصف هذه المواضيع بأنها مجردة بطبيعتها، أي أن كل ما يصف الموضوع هو مجموعة الكلمات التي تنتمي له.

لننظر إلى الرسم التوضيحي:

هذا الصندوق الأسود Topic Model يجمع الكلمات المتشابهة والمتعلقة ببعضها إلى مواضيع. لهذه المواضيع توزيعات احتمالية تصنيف لكل نص، وكل موضوع معرف بنسبة تواجد الكلمات المختلفة فيه.

متى نستخدم الـ Topic Modelling

لنتذكر مثال تنظيم الكتب في المكتبة. لنفرض أن لدينا بعض النصوص التي نريد تصنيفها حسب الموضوع. إذا كان عددها قليل فهذه عملية سهلة نقوم بها يدويا. لكن ماذا لو كانت آلاف أو مئات الآلاف من النصوص؟

في هذه الحالة نستخدم طرق الـ NLP، تحديدا نستخدم الـ Topic Modelling

يمكننا الـ Topic Modelling من استكشاف مجموعات كبيرة من النصوص والتنقيب عن المواضيع المختلفة فيها. إضافة إلى هذه يستخدم الـ Topic Modelling في محركات البحث لتحسين جودة النتائج وإظهار نتائج ذات صلة. لنعرف كيف يعمل الـ Topic Model

نبذة عن التحليل الدلالي الكامن Latent Semantic Analysis (LSA)

لكل لغة تعقيدات وفروق دقيقة عن اللغات الأخرى يصعب على الكمبيوتر فهمها (والإنسان أيضا في بعض الأحيان!). منها الكلمات المترادفة والكلمات المتشابهة في النطق أو الكتابة لكن بمعاني مختلفة.

مثال:

  • المدرسة مكان عام
  • عام الطفل في البحر

في الأولى “عام” تعني للجميع، وفي الثانية تعني السباحة.

لا نجد صعوبة في التمييز بينهما لأننا نعتمد على سياق الجملة. لكن كيف يمكن للكمبيوتر فهم فكرة الاعتماد على السياق؟ هنا يأتي دور التحليل الدلالي الكامن LSA الذي يسعى لاستغلال محيط الكلمات (السياق) لفهم مفاهيم غير واضحة (كامنة)، وهي المواضيع التي ننقب عنها.

لهذا فمحاولة ربط الكلمات بالنصوص المختلفة لن تنجح بهذه الصورة البسيطة. يجب أن ننقب على المواضيع كأنها مفاهيم كامنة واراء الكلمات. يعتبر LSA أشهر الطرق لتحقيق ذلك.

خطوات الـ LSA

لنفرض أن لدينا عدد m من النصوص، وعدد n كلمات فريدة في كل النصوص. نرغب في استخراج عدد k من المواضيع في هذه النصوص. عدد المواضيع k يجب أن نحدده نحن.

أولاً: نبني مصفوفة النصوص-الكلمات document-term matrix والتي سيكون حجمها n*m وتحتوي على معاملات TF-IDF

لنتعرف سريعاً على الـ TF-IDF

أبسط طريقة لتمثيل وثيقة للكمبيوتر هي حقيبة الكلمات bag-of-words، وهي عبارة عن تمثيل كل وثيقة (جملة/فقرة/نص…) بقائمة من الكلمات التي وردت بها. عادة نضيف معلومة لهذه القائمة (الحقيبة) مثل عدد كل كلمة في الوثيقة.

مثال:

وثيقة (1): ذهب المعلم إلى المدرسة

وثيقة (2): ذهب الرجل للعمل وذهب الصبي للمدرسة

يمكننا تمثيلهما كالآتي:

وثيقة (1): {ذهب: 1، المعلم: 1، إلى: 1، المدرسة: 1}

وثيقة (2): {ذهب: 2، الرجل: 1، للعمل: 1، الصبي: 1}

ويمكن تمثيلها في مصفوفة تكون عواميدها كل الكلمات التي ظهرت في كل الوثائق، والصفوف هي الوثائق. ونضع عدد صفر 0 عند الكلمة التي لم ترد في وثيقة ما.

ذهب المعلم إلى المدرسة الرجل للعمل الصبي
وثيقة 1 1 1 1 1 0 0 0
وثيقة 2 2 0 0 1 1 1 1

 

يبني الـ TF-IDF على نفس الفكرة لكن بدلا من أعداد الكلمات يستخدم معاملات أكثر تعبيراً.

  • يقوم بعملية normalization فيقسم عدد كل كلمة على عدد الكلمات في الوثيقة
  • يضرب العدد في معامل معكوس تردد الوثيقة inverse document frequency وهو يتناسب عكسياً مع انتشار الكلمة في جميع الوثائق. فيكون صغير جداً للكلمات المنتشرة مثل حروف الجر مما يعطيها وزناً أقل حتى لو انتشرت كثيراً في الوثيقة. بينما يعطي وزنا أكبر للكلمات المميزة للوثيقة لأنها لم تنتشر في الوثائق الأخرى

idf = log(N/|{d ϵ D: t ϵ  d}|)

أي أنه عدد الوثائق N مقسوماً على عدد الوثائق التي ظهر بها الكلمة t، ونأخذ اللوغاريتم.

إذاً معادلة ال TF-IDF:

تصير المصفوفة:

ذهب المعلم إلى المدرسة الرجل للعمل الصبي
وثيقة 1 0.409 0.57 0.57 0.409 0 0 0
وثيقة 2 0.605 0 0 0.302 0.42 0.42 0.42

 

ثانياً: نقوم بتقليل أبعاد المصفوفة إلى k (وهو عدد المواضيع) باستخدام تفريق القيم المنفردة Singular Value Decomposition (SVD)

ثالثاً: ينتج عن الـ SVD ثلاث مصفوفات، أول مصفوفة Uk تمثل النصوص في vectors بطول k أي تمثل النصوص بدلالة المواضيع. والمصفوفة الثالثة Vk تمثل الكلمات في vectors بطول k أي تمثل الكلمات بدلالة المواضيع.

يعطينا الـ SVD تمثيل vector لكل من النصوص والكلمات بدلالة المواضيع k مما يمكننا من مقارنة المتشابه منها.

تطبيق باستخدام Python

سنستخدم بيانات تحتوي على حوالي 100 ألف نص يصنف إلى مواضيع أساسية مأخوذة من صحف أخبار.

يمكن تحميل البيانات من هنا:

https://data.mendeley.com/datasets/v524p5dhpj/2

سنقوم باستخدام Python للقيام بتنقيب عن هذه المواضيع

import numpy as np
import pandas as pd
import pylab as plt
from sklearn.feature_extraction.text import TfidfVectorizer
from nltk.corpus import stopwords
from sklearn.decomposition import TruncatedSVD
import umap

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

vectorizer = TfidfVectorizer(stop_words=stopwords.words('arabic'), min_df=0.05, max_df = 0.95)
X = vectorizer.fit_transform(df.text) 

svd_model = TruncatedSVD(n_components=5, algorithm='randomized', n_iter=20, random_state=122) 
svd_model.fit(X) 
terms = vectorizer.get_feature_names() 
for i, comp in enumerate(svd_model.components_): 
    terms_comp = zip(terms, comp) 
    sorted_terms = sorted(terms_comp, key= lambda x:x[1],        
    reverse=True)[:7] 
    print("Topic "+str(i)+": ", ','.join([t[0] for t in sorted_terms])) 
    
X_topics = svd_model.transform(X) 
embedding = umap.UMAP(n_neighbors=150, min_dist=0.5, random_state=12).fit_transform(X_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()
LSA

المواضيع:

Topic 0: الفريق,المغرب,قبل,خلال,المغربية,أنه,الوطني
Topic 1: الفريق,المباراة,الرياضي,المنتخب,مباراة,القدم,اللاعبين
Topic 2: القضائية,عناصر,الشرطة,النيابة,العامة,قبل,الأمنية
Topic 3: الحكومة,الفريق,حزب,بنكيران,العدالة,والتنمية,رئيس
Topic 4: المنتخب,الوطني,حزب,كأس,الحكومة,بنكيران,إفريقيا

نتيجة رسم المواضيع حيث كل نقطة تعبر عن مقال وكل لون يعبر عن موضوع

نستخدم مكتبة umap للرسم التي يمكن الحصول عليها عن طريق:

pip install umap-learn

مميزات وعيوب الـ LSA

يمكن للـ LSA أن يستخدم بطريقة مفيدة جدا في التنقيب عن المواضيع، لكنه ليس بدون عيوب. من المهم فهم هذه المميزات والعيوب لمعرفة متى نستخدمه ومتى نلجأ لطريقة أخرى.

مميزات:

  • سهل وسريع في استخدامه وتطبيقه
  • تعطي نتائج مقبولة، أفضل من الـ TF-IDF الأبسط منه

عيوب:

  • بما أنه نموذج خطي، سيعاني مع الداتا الغير خطية
  • يفترض الـ LSA توزيع Gaussian للكلمات في النصوص، وهو فرض ليس دائما صحيح
  • يعتمد الـ LSA على الـ SVD وهو مكلف في حسابه ويصعب تحديثه إذا جئنا بداتا جديدة

طرق أخرى للتنقيب عن المواضيع

هناك العديد من الطرق للتنقيب عن المواضيع، كثير منها أكثر تعقيدا وكفاءة من الـ LSA. منها الـ Latent Dirichlet Allocation (LDA) ويمكن القراءة عنه هنا:

https://www.analyticsvidhya.com/blog/2016/08/beginners-guide-to-topic-modeling-in-python/

هناك أيضاً lda2vec وهو أكثر تعقيداً ويعتمد على تضمين الكلمات word embeddings.

 

المصدر:

https://medium.com/analytics-vidhya/text-mining-101-a-stepwise-introduction-to-topic-modeling-using-latent-semantic-analysis-using-add9c905efd9

 

تعليقات