مدل سازی موضوع در پایتون | تاپتال


رایانه ها و پردازنده هایی که آنها را تغذیه می کنند برای کار با اعداد ساخته شده اند. در مقابل، زبان روزمره ایمیل‌ها و پست‌های رسانه‌های اجتماعی ساختار سستی دارد که خود را به محاسبات نمی‌رساند.

اینجاست که پردازش زبان طبیعی (NLP) وارد می‌شود. NLP شاخه‌ای از علوم رایانه است که با استفاده از تکنیک‌های محاسباتی (یعنی هوش مصنوعی) برای تجزیه و تحلیل زبان و گفتار طبیعی با زبان‌شناسی همپوشانی دارد. مدل‌سازی موضوع بر درک موضوعاتی که یک متن داده شده در مورد آن‌ها است تمرکز می‌کند. مدل‌سازی موضوع به توسعه‌دهندگان اجازه می‌دهد ویژگی‌های مفیدی مانند شناسایی اخبار فوری در رسانه‌های اجتماعی، توصیه پیام‌های شخصی‌سازی شده، شناسایی کاربران جعلی و مشخص کردن جریان اطلاعات را پیاده‌سازی کنند.

توسعه‌دهندگان چگونه می‌توانند رایانه‌های محاسباتی را برای درک ارتباطات انسانی در آن سطوح پیچیده ترغیب کنند؟

کیسه ای از کلمات

برای پاسخ به این سوال، باید بتوانیم یک متن را به صورت ریاضی توصیف کنیم. ما آموزش مدل‌سازی موضوع پایتون را با ساده‌ترین روش آغاز می‌کنیم: کیسه کلمات.

این روش یک متن را به عنوان مجموعه ای از کلمات نشان می دهد. مثلا جمله This is an example را می توان به عنوان مجموعه ای از کلمات با استفاده از فرکانس ظاهر شدن آن کلمات توصیف کرد:

{"an": 1, "example": 1, "is": 1, "this": 1}

توجه داشته باشید که چگونه این روش ترتیب کلمات را نادیده می گیرد. این نمونه ها را در نظر بگیرید:

  • من جنگ ستارگان را دوست دارم اما هری پاتر را دوست ندارم.
  • من هری پاتر را دوست دارم اما جنگ ستارگان را دوست ندارم.

این احساسات با کلمات مشابهی نشان داده می شوند، اما معانی متضادی دارند. اما برای تجزیه و تحلیل موضوعات متون، این تفاوت ها اهمیتی ندارد. در هر دو مورد، ما در مورد سلایق هری پاتر و جنگ ستارگان صحبت می کنیم، صرف نظر از اینکه آن سلیقه ها چیست. به این ترتیب، ترتیب کلمات بی اهمیت است.

وقتی چندین متن داریم و به دنبال درک تفاوت‌های بین آنها هستیم، به یک نمایش ریاضی برای کل مجموعه خود نیاز داریم که هر متن را جداگانه در نظر می‌گیرد. برای این ما می توانیم از یک ماتریس استفاده کنیم که در آن هر ستون یک کلمه یا اصطلاح و هر ردیف نشان دهنده یک متن است. یک نمایش ممکن از یک پیکره شامل ذکر کردن در هر سلول است که با آن یک کلمه (ستون) معین در یک متن خاص (ردیف) استفاده می شود.

در مثال ما، پیکره از دو جمله (ردیف های ماتریس ما) تشکیل شده است:

["I like Harry Potter",
"I like Star Wars"]

ما کلمات این مجموعه را به ترتیبی که با آنها روبرو می شویم فهرست می کنیم: من، پسندیدن، هری، پاتر، ستاره، جنگ ها. اینها با ستون های ماتریس ما مطابقت دارند.

مقادیر موجود در ماتریس تعداد دفعاتی را نشان می دهد که یک کلمه داده شده در هر عبارت استفاده شده است:

[[1,1,1,1,0,0],
[1,1,0,0,1,1]]

تصویر دو خط متن را در سمت چپ نشان می دهد: من هری پاتر را دوست دارم و جنگ ستارگان را دوست دارم.  سپس این متن به کیسه‌ای از کلمات در مرکز تبدیل می‌شود و پس از هر کلمه تعداد دفعاتی که آن کلمه استفاده شده است:
تبدیل متن به یک نمایش ماتریسی

توجه داشته باشید که اندازه ماتریس با ضرب تعداد متون در تعداد کلمات مختلف که حداقل در یک متن ظاهر می شود تعیین می شود. دومی معمولاً غیر ضروری بزرگ است و می توان آن را کاهش داد. به عنوان مثال، یک ماتریس ممکن است شامل دو ستون برای افعال مزدوج باشد، مانند “play” و “played”، صرف نظر از این واقعیت که معنای آنها مشابه است.

اما ستون هایی که مفاهیم جدید را توصیف می کنند ممکن است گم شوند. به عنوان مثال، “کلاسیک” و “موسیقی” هر کدام معانی جداگانه ای دارند اما وقتی با هم ترکیب شوند – “موسیقی کلاسیک” – معنای دیگری دارند.

با توجه به این مسائل، لازم است متن پیش پردازش شود تا نتایج خوبی حاصل شود.

پیش پردازش و مدل های خوشه بندی موضوعی

برای بهترین نتایج، استفاده از چندین تکنیک پیش پردازش ضروری است. در اینجا برخی از پرکاربردترین آنها آورده شده است:

  1. حروف کوچک. همه کلمات را کوچک کنید. همه کلمات را کوچک کنید. معنای یک کلمه بدون توجه به موقعیت آن در جمله تغییر نمی کند.
  2. n-گرم همه گروه ها را در نظر بگیرید n کلمات در یک ردیف به عنوان اصطلاحات جدید، نامیده می شود n-گرم. به این ترتیب مواردی مانند “خانه سفید” در نظر گرفته شده و به لیست واژگان اضافه می شود.
  3. ساقه. پیشوندها و پسوندهای کلمات را شناسایی کنید تا آنها را از ریشه آنها جدا کنید. به این ترتیب، کلماتی مانند “بازی”، “بازی” یا “بازیکن” با کلمه “بازی” نشان داده می شوند. Stemming می تواند برای کاهش تعداد کلمات در فهرست واژگان و در عین حال حفظ معنای آنها مفید باشد، اما پیش پردازش را به طور قابل توجهی کند می کند زیرا باید برای هر کلمه در مجموعه اعمال شود.
  4. کلمات را متوقف کنید. گروه هایی از کلمات را که فاقد معنا یا فایده هستند در نظر نگیرید. اینها شامل مقالات و حروف اضافه می شود، اما ممکن است شامل کلماتی باشد که برای مطالعه موردی خاص ما مفید نیستند، مانند برخی از افعال رایج.
  5. فرکانس اصطلاح-فرکانس معکوس سند (tf–idf). به جای ذکر فراوانی هر کلمه در هر خانه ماتریس از ضریب tf–idf استفاده کنید. شامل دو عدد ضرب شده است:

    • tf – فراوانی یک اصطلاح یا کلمه معین در یک متن، و
    • idf – لگاریتم تعداد کل اسناد تقسیم بر تعداد اسنادی که شامل آن عبارت هستند.

    tf–idf معیاری است که نشان می‌دهد چقدر یک کلمه در مجموعه استفاده می‌شود. برای اینکه بتوان کلمات را به گروه‌ها تقسیم کرد، مهم است که نه تنها بفهمیم چه کلماتی در هر متن وجود دارد، بلکه چه کلماتی اغلب در یک متن ظاهر می‌شوند اما در متن دیگر اصلاً دیده نمی‌شوند.

شکل زیر چند نمونه ساده از این تکنیک‌های پیش‌پردازش را نشان می‌دهد که در آن متن اصلی مجموعه اصلاح شده است تا فهرستی مرتبط و قابل مدیریت از کلمات ایجاد شود.

را
نمونه هایی از تکنیک های پیش پردازش متن

اکنون نحوه اعمال برخی از این تکنیک ها را در پایتون نشان خواهیم داد. هنگامی که مجموعه ما به صورت ریاضی نمایش داده شد، باید موضوعات مورد بحث را با استفاده از الگوریتم‌های یادگیری ماشین بدون نظارت شناسایی کنیم. در این مورد، “بدون نظارت” به این معنی است که الگوریتم هیچ برچسب موضوعی از پیش تعریف شده، مانند “علمی تخیلی” برای اعمال بر خروجی خود ندارد.

برای خوشه بندی پیکره خود، می توانیم از چندین الگوریتم، از جمله فاکتورسازی ماتریس غیرمنفی (NMF)، تجزیه و تحلیل اجزای اصلی پراکنده (PCA پراکنده)، و تخصیص دیریکله نهفته (LDA) انتخاب کنیم. ما روی LDA تمرکز خواهیم کرد زیرا به دلیل نتایج خوب آن در رسانه های اجتماعی، علوم پزشکی، علوم سیاسی و مهندسی نرم افزار به طور گسترده توسط جامعه علمی استفاده می شود.

LDA مدلی برای تجزیه موضوع بدون نظارت است: متون را بر اساس کلماتی که دارند و احتمال تعلق یک کلمه به یک موضوع خاص گروه بندی می کند. الگوریتم LDA توزیع کلمه موضوع را خروجی می دهد. با این اطلاعات می توانیم موضوعات اصلی را بر اساس کلماتی که به احتمال زیاد با آنها مرتبط است تعریف کنیم. هنگامی که موضوعات اصلی و کلمات مرتبط با آنها را شناسایی کردیم، می‌توانیم بدانیم که کدام موضوع یا موضوعات برای هر متن کاربرد دارد.

مجموعه زیر را در نظر بگیرید که از پنج جمله کوتاه تشکیل شده است (همه برگرفته از نیویورک تایمز سرفصل ها):

corpus = [ "Rafael Nadal Joins Roger Federer in Missing U.S. Open",
          "Rafael Nadal Is Out of the Australian Open",
          "Biden Announces Virus Measures",
          "Biden's Virus Plans Meet Reality",
          "Where Biden's Virus Plan Stands"]

این الگوریتم باید به وضوح یک موضوع مرتبط با سیاست و ویروس کرونا و موضوع دوم مربوط به نادال و تنیس را مشخص کند.

استفاده از استراتژی در پایتون

برای شناسایی موضوعات، باید کتابخانه های لازم را وارد کنیم. پایتون چندین کتابخانه مفید برای NLP و یادگیری ماشین دارد، از جمله NLTK و Scikit- Learn (روشن).

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.decomposition import LatentDirichletAllocation as LDA
from nltk.corpus import stopwords

استفاده كردن CountVectorizer()، ماتریسی را ایجاد می کنیم که تعداد کلمات هر متن را با استفاده از آن نشان می دهد CountVectorizer(). توجه داشته باشید که CountVectorizer امکان پیش پردازش را در صورت وارد کردن پارامترهایی مانند stop_words برای گنجاندن کلمات توقف، ngram_range شامل شدن n-گرم یا lowercase=True برای تبدیل تمام کاراکترها به حروف کوچک.

count_vect = CountVectorizer(stop_words=stopwords.words('english'), lowercase=True)
x_counts = count_vect.fit_transform(corpus)
x_counts.todense()

matrix([[0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0],
        [0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0],
        [1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
        [0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1],
        [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1]], dtype=int64)

برای تعریف واژگان مجموعه خود، به سادگی می توانیم از ویژگی استفاده کنیم .get_feature_names():

count_vect.get_feature_names()

['announces', 'australian', 'biden', 'federer', 'joins', 'measures', 'meet', 'missing', 'nadal', 'open',  'plan', 'plans', 'rafael', 'reality', 'roger', 'stands', 'virus']

سپس، محاسبات tf–idf را با تابع sklearn انجام می دهیم:

tfidf_transformer = TfidfTransformer()
x_tfidf = tfidf_transformer.fit_transform(x_counts)

برای انجام تجزیه LDA، باید تعداد موضوعات را تعریف کنیم. در این مورد ساده، ما می دانیم که دو موضوع یا “بعد” وجود دارد. اما در موارد کلی، این یک فراپارامتر است که نیاز به تنظیم، که می تواند با استفاده از الگوریتم هایی مانند جستجوی تصادفی یا جستجوی شبکه ای انجام شود:

dimension = 2
lda = LDA(n_components = dimension)
lda_array = lda.fit_transform(x_tfidf)
lda_array

array([[0.8516198 , 0.1483802 ],
       [0.82359501, 0.17640499],
       [0.18072751, 0.81927249],
       [0.1695452 , 0.8304548 ],
       [0.18072805, 0.81927195]])

LDA یک روش احتمالی است. در اینجا می توان احتمال تعلق هر یک از پنج عنوان به هر یک از دو موضوع را مشاهده کرد. می بینیم که طبق انتظار دو متن اول به مبحث اول و سه متن بعدی به مبحث دوم بیشتر تعلق دارند.

در نهایت، اگر بخواهیم بفهمیم این دو موضوع در مورد چیست، می‌توانیم مهمترین کلمات را در هر موضوع ببینیم:

components = [lda.components_[i] for i in range(len(lda.components_))]
features = count_vect.get_feature_names()
important_words = [sorted(features, key = lambda x: components[j][features.index(x)], reverse = True)[:3] for j in range(len(components))]
important_words
[['open', 'nadal', 'rafael'], 
['virus', 'biden', 'measures']]

همانطور که انتظار می رفت، LDA به درستی کلمات مربوط به مسابقات تنیس و نادال را به مبحث اول و کلمات مربوط به بایدن و ویروس را به مبحث دوم اختصاص داد.

تجزیه و تحلیل در مقیاس بزرگ و موارد استفاده در دنیای واقعی

تجزیه و تحلیل مقیاس بزرگ از مدل سازی موضوع را می توان در این مشاهده کرد کاغذ; من موضوعات اصلی اخبار را در جریان انتخابات ریاست جمهوری 2016 ایالات متحده مطالعه کردم و موضوعات برخی از رسانه های گروهی را مشاهده کردم. نیویورک تایمز و فاکس نیوز – از جمله در پوشش آنها، مانند فساد و مهاجرت. در این مقاله، من همچنین به تحلیل همبستگی و علیت بین محتوای رسانه های جمعی و نتایج انتخابات پرداختم.

مدل‌سازی موضوع به‌طور گسترده در خارج از دانشگاه برای کشف الگوهای موضوعی پنهان موجود در مجموعه‌های بزرگ متون استفاده می‌شود. برای مثال، می‌توان از آن در سیستم‌های توصیه یا برای تعیین اینکه مشتریان/کاربران در نظرسنجی‌ها، فرم‌های بازخورد یا در رسانه‌های اجتماعی درباره چه چیزی صحبت می‌کنند، استفاده کرد.

وبلاگ مهندسی Toptal از خوان مانوئل اورتیز د زاراته برای بررسی نمونه کدهای ارائه شده در این مقاله سپاسگزاری می کند.

بهبود مدل سازی موضوع در توییتر
آلبانیز، فدریکو و استبان فوئرشتاین. بهبود مدل‌سازی موضوع در توییتر از طریق ادغام جامعه. (۲۰ دسامبر ۲۰۲۱): arXiv:2201.00690 [cs.IR]

تحلیل توییتر برای سلامت عمومی
پل، مایکل و مارک دردزه. “شما همان چیزی هستید که توییت می کنید: تحلیل توییتر برای سلامت عمومی” 3 آگوست 2021.

طبقه بندی جهت گیری سیاسی در توییتر
کوهن، راویو و درک روث. “طبقه بندی جهت گیری سیاسی در توییتر: آسان نیست!” 3 آگوست 2021.

استفاده از مدل های موضوعی رابطه ای برای گرفتن جفت
گترز، مالکوم و دنیس پوشیوانیک. “استفاده از مدل‌های موضوعی رابطه‌ای برای گرفتن جفت در میان طبقات در سیستم‌های نرم‌افزاری شی‌گرا” 25 اکتبر 2010.



منبع

Matthew Newman

Matthew Newman Matthew has over 15 years of experience in database management and software development, with a strong focus on full-stack web applications. He specializes in Django and Vue.js with expertise deploying to both server and serverless environments on AWS. He also works with relational databases and large datasets
[ Back To Top ]