پیاده سازی مدل های دسته بندی متن در پایتون — راهنمای کاربردی
«دسته بندی متن» (Text Classification) که به آن «برچسبگذاری متن» (Text Tagging) یا «طبقهبندی متن» (Text Categorization) نیز گفته میشود، یکی از مسائل «میان رشتهای» (Intradisciplinary) در حوزه «علوم کتابداری» (Library Science)، «علوم کامپیوتر» (Computer Science) و «علم اطلاعات» (Information Science) محسوب میشود. در دسته بندی متن، هدف اصلی طبقهبندی یا دستهبندی منظم دادههای متنی به گروههای مشخص و از پیش تعیین شده است. روشهای دسته بندی متن، از طریق بهکارگیری الگوریتمهای «پردازش زبان طبیعی» (Natural Language processing)، قادر هستند تا به طور خودکار دادههای متنی را تحلیل کنند و بر مبنای محتوای این دادهها، مجموعهای از برچسبها، کلاسها یا طبقهبندیهای از پیش تعیین شدهای را به آنها اختصاص دهند.
«دادههای متنی غیر ساخت یافته» (Unstructured Text Data) در تمامی جنبههای تعامل انسانها با دنیای دیجیتال حضور دارند؛ از ایمیل، چت و مطالب وبسایتها تا محتویات موجود در «شبکههای اجتماعی» (Social Networks). با این حال، استخراج اطلاعات مفید و با معنی از آنها، فرایندی بسیار سخت و پیچیده محسوب میشود. تنها در صورتی که اطلاعات غیر ساخت یافته موجود در دادههای متنی به «دادههای ساخت یافته» (Structured Data) تبدیل شوند، این امکان برای محققان این حوزه وجود خواهد داشت که بتوانند اطلاعات با معنی و مفید از دادههای متنی استخراج کنند.
در گذشته، ساخت یافته کردن دادههای متنی، فرایندی بسیار مشکل و هزینهبر محسوب میشد؛ زیرا نیازمند صرف هزینه و وقت بسیار زیادی بود تا دادههای متنی به طور دستی مرتبسازی شوند. از همه مهمتر، بعضا برای پردازش دستی این دادهها، «قواعد اختیاری» (Arbitrary Rules) تعریف میشد که نیازمند تغییر و به روز رسانی مداوم بودند. با مرور زمان، این قواعد کارایی خود را از دست میدادند و مدیریت آنها، به فرایندی بسیار سخت و پیچیده تبدیل میشد.
ترکیب روشهای دسته بندی متن (که به آنها «دستهبند متن» (text Classifier) گفته میشود) با روشهای پردازش زبان طبیعی، منجر به ایجاد روشهای خودکار جهت ساختیافته کردن دادههای متنی شده است. این دسته از روشهای خودکار «تحلیل متن» (Text Analysis)، سریع، مقرون به صرفه و مقیاسپذیر هستند.
مهمترین کاربردهای دسته بندی متن
در طی چند سال اخیر، روشهای دسته بندی متن به یکی از مهمترین ابزارهای استخراج و تولید دانش در صنایع و شرکتهای تجاری تبدیل شدهاند. روشهای دسته بندی متن به صاحبان صنایع و شرکتهای تجاری اجازه میدهند تا به راحتی «بینش» (Insight) و «دانش» (Knowledge) موجود در دادههای متنی را استخراج و از آنها، جهت خودکارسازی فرایندهای تجاری استفاده کنند؛ فرایندهایی که در شرکتها و سازمانها، با اصطلاح «هوش تجاری» (Business Intelligence) شناخته میشوند.
مهمترین وشایعترین کاربردهای روشهای دسته بندی متن عبارتند از:
- «تحلیل احساسات» (Sentiment Analysis): تحلیل احساسات به فرایندی اطلاق میشود که در آن «قطبیت» (Polarity) یک متن داده شده نسبت به یک موضوع خاص سنجیده میشود. به عبارت دیگر، یک داده متنی داده شده بر اساس قطبیت محتوای آن، به دو دسته مثبت یا منفی (و در برخی از موارد، خنثی) تقسیمبندی میشود. از چنین کاربردی، جهت ارزیابی برندهای تجاری و درصد رضایت مشتریان از محصولات یا خدمات استفاده میشود.
- «تشخیص موضوع» (Topic Detection): روشهای دسته بندی متن و تحلیل محتوای متنی، جهت تشخیص موضوع یا «زمینه محتوایی» (Context) دادههای متنی استفاده میشوند. به عنوان نمونه، روشهای دسته بندی متن به واحدهای ارتباط با مشتریان این امکان را میدهند تا نظرات مشتریان در رابطه با یک محصول خاص را در کلاسهایی نظیر (Ease of Use)، (Customer Support) یا (Pricing) دستهبندی کنند.
- «تشخیص زبان» (Language Detection): به فرایند خودکار دسته بندی متن بر حسب زبان نوشتاری محتویات موجود در آن، تشخیص زبان گفته میشود. روشهای تشخیص زبان به صنایع یا شرکتهای تجاری اجازه میدهند تا نظرات، انتقادات و شکایات مطرح شده نسبت به یک محصول یا سرویس خاص را بر حسب زبان دستهبندی و به واحدهای پشتیبانی محصول در کشورهای مربوطه منتقل کنند.
دستهبندی چندکلاسه دادههای متنی
در دنیای تجارت، کاربردهای بسیاری برای دسته بندی متن وجود دارد. به عنوان نمونه، اخبار معمولا بر اساس موضوع در وبسایتها دستهبندی میشوند؛ محتویات یا محصولات، به وسیله طبقهبندیهای از پیش تعیین شده برچسبگذاری میشوند؛ کاربران یا مشتریان یک سرویس یا محصول خاص، بر اساس اینکه نظر آنها در مورد این محصول یا سرویس چیست، به گروههای مشخصی دستهبندی میشوند و سایر موارد.
با این حال، اکثریت قریب به اتفاق مطالب آموزشی منتشر شده در مورد دسته بندی متن در سطح اینترنت، تنها «دستهبندی باینری متن» (Binary Text Classification) را پوشش میدهند؛ مطالبی نظیر «فیلتر ایمیلهای اسپم» (Email Spam Filtering) که ایمیلها را به دو دسته (spam) یا (ham) دستهبندی میکنند. در اکثر موارد، مسائل جهان واقعی بسیار پیچیدهتر از دستهبندی باینری هستند.
هدف این مطلب، معرفی و پیادهسازی یک سیستم دسته بندی (چندکلاسه) متن برای دستهبندی «شکایات مالی مشتریان» (Consumer Finance Complaints) به 12 کلاس از پیش تعیین شده است. به عبارت دیگر، یک سیستم «دستهبندی چند کلاسه متن» (Multi-Class Text Classification) برای دستهبندی شکایت ثبت شده توسط مشتریان ارائه خواهد شد. امروزه، چنین سیستمهایی به عنوان سیستمهای استاندارد پاسخگویی به مشتریان و خدمات پس از فروش، در سازمانها و شرکتهای تجاری مورد استفاده قرار میگیرند. دادههای مرتبط با شکایات مالی مشتریان، از طریق لینک [+] قابل بارگیری هستند.
در این مطلب، برای پیادهسازی سیستم دسته بندی متن از «زبان برنامهنویسی پایتون» (Python Programming Language) استفاده میشود. همچنین، کتابخانه نرمافزاری شناخته شده (Scikit-Learn) برای پیادهسازی مؤلفههای «یادگیری ماشین» (Machine Learning) روش دسته بندی متن استفاده میشود.
تعریف مسأله و فرموله کردن آن
همانطور که پیش از این نیز اشاره شد، هدف این مطلب، پیادهسازی یک سیستم دستهبندی (چندکلاسه) متن برای دستهبندی شکایات مالی مشتریان به 12 کلاس از پیش تعیین شده است. مسأله پیش رو، یک مسأله دستهبندی «نظارت شده» (Supervised) دادههای متنی محسوب میشود. در این مطلب، از چهار مدل یادگیری ماشین برای پیادهسازی روشهای دسته بندی متن استفاده میشود. همچنین، عملکرد هر کدام از این روشها سنجیده میشود تا بهترین مدل برای دستهبندی متن مشخص و برای پیشبینی کلاس یا دسته نمونههای متنی استفاده شود.
با داشتن یک داده مرتبط با شکایات مالی مشتریان به عنوان ورودی، سیستم باید قادر باشد تا داده ورودی را در یکی از 12 کلاس از پیش تعیین شده دستهبندی کند. فرض اصلی سیستم پیادهسازی شده این است که شکایات مالی مشتریان (ورودی مسئله)، تنها در یکی از دوازده کلاس از پیش تعیین شده دستهبندی خواهد شد. به این مسأله، دستهبندی چندکلاسه دادههای متنی گفته میشود.
دادههای استفاده شده برای آموزش سیستم دسته بندی متن
پیش از اینکه به مبحث مدلسازی روشهای یادگیری ماشین برای دستهبندی متن پرداخته شود، با دادههای مرتبط با شکایات مالی مشتریان و تعداد دادههای موجود در هر کدام از کلاسها آشنا خواهید شد. ابتدا با استفاده از قطعه کد زیر، برخی از نمونههای موجود در مجموعه داده مرتبط با شکایات مالی مشتریان در سیستم بارگیری میشوند:
1import pandas as pd
2df = pd.read_csv('Consumer_Complaints.csv')
3df.head()
جهت پیادهسازی و آموزش سیستم دستهبندی متن، تنها دو ستون از دادههای مرتبط با شکایات مالی مشتریان مورد نیاز است؛ دادههای موجود در ستون (Product) و ستون (Consumer Complaint Narrative). بنابراین، جدول بالا به شکل زیر دوباره نویسی خواهد شد:
محصول (کلاس یا خروجی) | گفتار موجود در شکایت مشتریان (ورودی) | |
0 | Mortgage | NaN |
1 | Credit reporting | ...I have outdated information on my credit repor |
2 | Consumer Loan | ...I purchased a new car on XXXX XXXX. The car de |
3 | Credit card | NaN |
4 | Debt collection | NaN |
بنابراین، اگر بخواهیم «ورودیها» (Inputs) و کلاسها (Classes) یا «خروجیهای مورد انتظار» (Expected Outputs) متناظر با هر کدام از ورودیها را برای سیستم مشخص کنیم، به شکل زیر عمل میکنیم:
- ورودی مسأله: دادههای موجود در ستون (Consumer Complaint Narrative)، ورودیهای سیستم دستهبندی متن را تشکیل خواهند داد. به عنوان نمونه:
Input #1 I have outdated information on my credit report that I have previously disputed that has yet to be removed this information is more then seven years old and does not meet credit reporting requirements
- خروجی مسأله: دادههای موجود در ستون (Product)، خروجیهای مورد انتظار متناظر با هر کدام از ورودیهای سیستم دستهبندی متن را مشخص خواهند کرد. مقادیر موجود در ستون (Product) از نوع «متغیرهای دستهای» (Categorical) هستند. به عنوان نمونه:
Expected Output for Input #1 Credit reporting
همانطور که در جداول بالا مشهود است، برخی از عناصر ستون (Consumer Complaint Narrative) با «مقادیر ناموجود» (Missing Values) یا (NaN) مقداردهی شدهاند. برای جلوگیری از بروز خطا در سیستم دستهبندی متن، تمامی نمونههایی که مقدار (Consumer Complaint Narrative) آنها برابر با (NaN) است، از مجموعه داده حذف خواهند شد. همچنین، یک ستون جدید در مجموعه داده ایجاد میشود و مقادیر خروجیهای مورد انتظار لیست شده در ستون (Product)، بهوسیله مقادیر صحیح «کدبندی» (Encode) میشوند؛ به عبارت دیگر، در ستون جدید، هر کدام از مقادیر موجود در ستون (Product) به یک مقدار صحیح نگاشت میشود. دلیل نگاشت مقادیر خروجیهای مورد انتظار این است که در مدلهای یادگیری ماشین، بهتر است که متغیرهای دستهای توسط مقادیر صحیح نمایش داده شوند.
پس از انجام عملیات پردازشی بالا توسط قطعه کد زیر، دادههای مرتبط با شکایات مالی مشتریان به شکل زیر نمایش داده خواهد شد.
1from io import StringIO
2col = ['Product', 'Consumer complaint narrative']
3df = df[col]
4df = df[pd.notnull(df['Consumer complaint narrative'])]
5df.columns = ['Product', 'Consumer_complaint_narrative']
6df['category_id'] = df['Product'].factorize()[0]
7category_id_df = df[['Product', 'category_id']].drop_duplicates().sort_values('category_id')
8category_to_id = dict(category_id_df.values)
9id_to_category = dict(category_id_df[['category_id', 'Product']].values)
10df.head()
شماره | محصول (Product) یا خروجی مورد انتظار | متن شکایت مالی مشتریان (Consumer_Complaint_Narrative) | شناسه کلاس (Category_ID) |
1 | Credit reporting | ...I have outdated information on my credit repor | 0 |
2 | Consumer Loan | ...I purchased a new car on XXXX XXXX. The car de | 1 |
7 | Credit reporting | ...An account on my credit report has a mistaken | 0 |
12 | Debt collection | ...This company refuses to provide me verificatio | 2 |
16 | Debt collection | ...This complaint is in regards to Square Two Fin | 2 |
کلاسهای نامتوازن (Imbalanced Classes)
با بررسی دقیق دادههای موجود در مجموعه داده شکایت مالی مشتریان، مشخص میشود که تعداد شکایات (نمونهها) موجود در طبقهبندی محصولات (کلاس) نامتوازن است. بیشترین نمونهها در کلاسهای (Debt collection)، (Credit reporting) و (Mortgage) قرار دارند؛ به عبارت دیگر، در هنگام مدلسازی دادهها، رفتار دادههای این کلاسها به شکل بهتری مدلسازی میشوند. در نتیجه، مدلهای تولید شده (نظیر مدلهای یادگیری ماشین) نسبت به این کلاسها بایاس پیدا خواهند کرد.
1import matplotlib.pyplot as plt
2fig = plt.figure(figsize=(8,6))
3df.groupby('Product').Consumer_complaint_narrative.count().plot.bar(ylim=0)
4plt.show()
در هنگام مدلسازی دادههای مسأله، در صورتی که با مشکل کلاسهای نامتوازن مواجهه شوید، بدون شک، حل مسأله مورد نظر توسط الگوریتمهای استاندارد (نظیر مدل های یادگیری ماشین و مبتنی بر قاعده (Rule-based)) قطعا مشکل خواهد بود. الگوریتمهای مرسوم مدلسازی داده (بدون در نظر گرفتن توزیع دادهها)، معمولا نسبت به «کلاسهای اکثریت» (Majority Classes) بایاس دارند. در بدترین حالت، مدل پیادهسازی شده با دادههای موجود در «کلاسهای اقلیت» (Minority Classes)، به عنوان «داده پرت» (outlier) برخورد میکند و آنها را نادیده میگیرد.
در برخی از موارد نظیر پیادهسازی سیستمهای «پیشبینی سرطان» (Cancer Prediction) و «تشخیص تقلب» (Fraud Detection)، مدلهای تولید شده باید به گونهای تنظیم شوند که بتوانند رفتار دادههای اقلیت را به خوبی دادههای اکثریت مدلسازی کنند. راه حل دیگر، ایجاد «توازن مصنوعی» (Artificial Imbalance) در مجموعه داده استفاده شده برای مدلسازی سیستم است. برای چنین کاری میتوان از تکنیکهای «بیشنمونهگیری» (Oversampling) یا «کمنمونهگیری» (Undersampling) کلاسهای اقلیت یا اکثریت استفاده کرد.
با این حال، در این مطلب هدف، «یادگیری دادههای نامتوازن» (Learning Imbalanced Data) است. در چنین حالتی، یادگیری رفتار دادههای اکثریت از اهمیت بسیار زیادی برخوردار است. در یادگیری دادههای نامتوازن (نظیر دستهبندی متن)، توسعه دهندۀ سیستم علاقه زیادی به توسعۀ دستهبندهایی دارد که بتوانند رفتار دادههای کلاسهای اکثریت را بهتر یاد بگیرند و دقت زیادی در دستهبندی دادههای این کلاسها از خود نشان دهند. البته، چنین سیستمهایی باید عملکرد معقولی نیز در دستهبندی کلاسهای اقلیت داشته باشند.
نمایش دادههای متنی
مدلهای دستهبندی متن و الگوریتمهای یادگیری، قادر به پردازش مستقیم دادههای متنی در شکل غیر ساخت یافته نخواهند بود. زیرا، مدلهای یادگیری دستهبندی متن روی دادههایی آموزش میبینند که بردارهای ویژگی عددی دارند؛ نه دادههای خام متنی که ابعاد بردار ویژگی هر کدام از آنها، متغیر است. بنابراین، در سیستمهای دستهبندی متن، مرحلهای به نام «پیشپردازش» (Pre-Processing) دادههای متنی تعریف میشود که هدف آن، تولید نمایش عددی از دادههای متنی خواهد شد.
یکی از متداولترین روشهای «استخراج ویژگی» (Feature Extraction) از دادههای متنی، مدل Bag-of-Words یا BoW است. در مدل BoW، برای مدلسازی و نمایش هر سند (در این حالت، هر سند متناظر با متن شکایت مالی یک مشتری است)، «تناوب» (Frequency) یا رخداد کلمات در نظر گرفته میشود ولی ترتیب رخداد آنها مهم نخواهد بود.
در مدل دسته بندی متن پیادهسازی شده در این مطلب، به ازاء هر کدام از کلمات موجود در مجموعه داده، معیاری به نام Term Frequency-Inverse Document Frequency یا به اختصار TF-IDF محاسبه خواهد شد. در این مطلب، از تابع (sklearn.feature_extraction.text.TfidfVectorizer) در کتابخانه (SciKit-Learn) برای محاسبه بردار (tf-idf) متناظر با هر سند (متن شکایت مالی یک مشتری) استفاده میشود. مقادیر پارامترهای مدل TF-IDF در کتابخانه (SciKit-Learn) عبارتست از:
- مقدار پارامتر (sublinear_df) برابر با (True) در نظر گرفته میشود تا از فرم لگاریتمی برای محاسبه تناوب استفاده شود.
- پارامتر (min_df) برابر با حداقل تعداد اسنادی است که یک کلمه باید در آنها حضور داشته باشد تا در تولید نمایش TF-IDF از اسناد (متون شکایت مالی مشتریان) مورد استفاده قرار بگیرد.
- مقدار پارامتر (norm) برابر با 12 در نظر گرفته میشود تا اطمینان حاصل شود تمامی بردارهای ویژگی، نرم اقلیدسی برابر با 1 دارند.
- مقدار پارامتر (ngram_range) برابر با (1, 2) در نظر گرفته میشود؛ بدین معنی که تنها عبارات یک کلمهای (Unigram) و دو کلمهای (Bigram) در نظر گرفته خواهند شد.
- مقدار پارامتر (stop_words) برابر با ("english") در نظر گرفته میشود تا تمامی ضمایر نظیر (the) ،(a) و سایر موارد از متن حذف شود و تعداد «ویژگیهای نویزی» (Noisy Features) در دادههای متنی کاهش پیدا کند.
1from sklearn.feature_extraction.text import TfidfVectorizer
2
3tfidf = TfidfVectorizer(sublinear_tf=True, min_df=5, norm='l2', encoding='latin-1', ngram_range=(1, 2), stop_words='english')
4
5features = tfidf.fit_transform(df.Consumer_complaint_narrative).toarray()
6labels = df.category_id
7features.shape
خروجی:
(4569, 12633)
در نتیجه مدلسازی دادهها توسط مدل TF-IDF، هر کدام از 4569 سند (متن شکایت مالی مشتریان) موجود در مجموعه داده، 12633 ویژگی خواهند داشت؛ ویژگیهایی که بیانگر امتیاز tf-idf یک کلمهایها (Unigrams) و دو کلمهایهای (Bigrams) مختلف خواهند بود.
در ادامه، با استفاده از تابع (sklearn.feature_selection.chi2) در کتابخانه (SciKit-Learn) میتوان کلماتی (یک کلمهای و دو کلمهای) که بیشترین «همبستگی» (Correlation) را با کلاسها یا خروجیهای مورد انتظار دارند، شناسایی کرد و در خروجی نمایش داد:
1from sklearn.feature_selection import chi2
2import numpy as np
3N = 2
4for Product, category_id in sorted(category_to_id.items()):
5 features_chi2 = chi2(features, labels == category_id)
6 indices = np.argsort(features_chi2[0])
7 feature_names = np.array(tfidf.get_feature_names())[indices]
8 unigrams = [v for v in feature_names if len(v.split(' ')) == 1]
9 bigrams = [v for v in feature_names if len(v.split(' ')) == 2]
10 print("# '{}':".format(Product))
11 print(" . Most correlated unigrams:\n. {}".format('\n. '.join(unigrams[-N:])))
12 print(" . Most correlated bigrams:\n. {}".format('\n. '.join(bigrams[-N:])))
کلاسها یا خروجیهای مورد انتظار | همبستهترین تک کلمهایها | همبستهترین دو کلمهایها |
Bank account or service |
bank overdraft |
overdraft fees checking account |
Consumer Loan |
car vehicle |
vehicle xxxx toyota financial |
Credit card |
citi card |
annual fee credit card |
Credit reporting |
experian equifax |
trans union credit report |
Debt collection |
collection debt |
collect debt collection agency |
Money transfers |
wu paypal |
western union money transfer |
Mortgage |
modification mortgage |
mortgage company loan modification |
Other financial service |
dental passport |
help pay stated pay |
Payday loan |
borrowed payday |
big picture payday loan |
Prepaid card |
serve prepaid |
access money prepaid card |
Student loan |
student navient |
student loan student loans |
Virtual currency |
handles https |
xxxx provider money want |
با بررسی شهودی خروجیهای چاپ شده میتوان دریافت که کلمات نمایش داده شده، همبستگی بالایی با کلاسها یا خروجیهای مورد انتظار دارند.
دستهبند چندکلاسه: ویژگیها و طراحی
مرحله طراحی مدل دستهبندی متن، مهمترین مرحله پیادهسازی یک سیستم دستهبندی چندکلاسه دادههای متنی است.
- برای آموزش یک مدل «یادگیری نظارت شده» (Supervised Learning)، ابتدا مجموعه داده و ستون (Consumer Complaint Narrative) به برداری از اعداد تبدیل میشوند. در این مرحله و برای نمایش برداری دادهها، از روشهایی بردارهای وزندار TF-IDF استفاده شده است.
- در مرحله بعد و پس از تولید نمایش برداری از اسناد متنی، نوبت به «آموزش» (Training) مدل یادگیری میرسد. از مدل آموزش دیده، برای ارزیابی سیستم دستهبندی متن روی نمونههای (متن شکایت مالی مشتریان) دیده نشده و پیشبینی کلاس یا خروجی (Product) آنها استفاده میشود.
پس از تبدیل دادههای خام متنی به بردارهای عددی با استفاده از نمایش TF-IDF، تمامی ویژگیها و برچسب کلاسی (خروجی مورد انتظار) دادهها مشخص میشوند. در مرحله بعد، باید مدلهای دستهبندی متن آموزش داده شوند. برای چنین کاری، میتوان از مدلهای دستهبندی نظیر «دستهبند بیز ساده» (Naive Bayes Classifier) استفاده کرد. با استفاده از قطعه کد زیر، یک مدل دستهبند بیز ساده (از نوع «چندجملهای» (Multinomial)) روی دادههای برداری تولید شده آموزش داده میشود:
1from sklearn.model_selection import train_test_split
2from sklearn.feature_extraction.text import CountVectorizer
3from sklearn.feature_extraction.text import TfidfTransformer
4from sklearn.naive_bayes import MultinomialNB
5X_train, X_test, y_train, y_test = train_test_split(df['Consumer_complaint_narrative'], df['Product'], random_state = 0)
6count_vect = CountVectorizer()
7X_train_counts = count_vect.fit_transform(X_train)
8tfidf_transformer = TfidfTransformer()
9X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)
10clf = MultinomialNB().fit(X_train_tfidf, y_train)
پس از آموزش مدل دستهبندی متن و برازش مدل روی دادههای آموزشی، از مدل آموزش دیده برای پیشبینی کلاس یا خروجی نمونههای دیده نشده استفاده میشود:
1print(clf.predict(count_vect.transform(["This company refuses to provide me verification and validation of debt per my right under the FDCPA. I do not believe this debt is mine."])))
خروجی:
[‘Debt collection’]
برای اطمینان از صحت خروجی نمایش داده شده، بردار متناظر با این نمونه در خروجی نمایش و کلاس (Product) آن با پیشبینی تولید شده توسط مدل دستهبندی متن مقایسه میشود:
1df[df['Consumer_complaint_narrative'] == "This company refuses to provide me verification and validation of debt per my right under the FDCPA. I do not believe this debt is mine."]
خروجی:
شماره | محصول (Product) یا خروجی مورد انتظار | متن شکایت مالی مشتریان (Consumer_Complaint_Narrative) | شناسه کلاس (Category_ID) |
12 | Debt collection | ...This company refuses to provide me verificatio | 2 |
از یک نمونه دیده نشده دیگر، برای ارزیابی عملکرد مدل دستهبندی متن استفاده میشود:
1print(clf.predict(count_vect.transform(["I am disputing the inaccurate information the Chex-Systems has on my credit report. I initially submitted a police report on XXXX/XXXX/16 and Chex Systems only deleted the items that I mentioned in the letter and not all the items that were actually listed on the police report. In other words they wanted me to say word for word to them what items were fraudulent. The total disregard of the police report and what accounts that it states that are fraudulent. If they just had paid a little closer attention to the police report I would not been in this position now and they would n't have to research once again. I would like the reported information to be removed : XXXX XXXX XXXX"])))
خروجی:
[‘Credit reporting’]
برای اطمینان از صحت خروجی نمایش داده شده، بردار متناظر با این نمونه در خروجی نمایش و کلاس (Product) آن با پیشبینی تولید شده توسط مدل دستهبندی متن مقایسه میشود:
1df[df['Consumer_complaint_narrative'] == "I am disputing the inaccurate information the Chex-Systems has on my credit report. I initially submitted a police report on XXXX/XXXX/16 and Chex Systems only deleted the items that I mentioned in the letter and not all the items that were actually listed on the police report. In other words they wanted me to say word for word to them what items were fraudulent. The total disregard of the police report and what accounts that it states that are fraudulent. If they just had paid a little closer attention to the police report I would not been in this position now and they would n't have to research once again. I would like the reported information to be removed : XXXX XXXX XXXX"]
خروجی:
شماره | محصول (Product) یا خروجی مورد انتظار | متن شکایت مالی مشتریان (Consumer_Complaint_Narrative) | شناسه کلاس (Category_ID) |
61 | Credit reporting | ...I am disputing the inaccurate information the | 0 |
بنابراین همانطور که مشاهده شد، مدل دستهبندی متن بیز ساده، در هر دو حالت توانست کلاس یا خروجی نمونههای دیده نشده را به درستی پیشبینی کند. در ادامه، با مدلهای پیشرفتهتر برای دستهبندی متن آشنا خواهید شد.
انتخاب مدل مناسب برای دستهبندی متن
در این بخش، مدلهای یادگیری ماشین پیشرفتهتر جهت دستهبندی متن پیادهسازی و ارزیابی خواهند شد. برای پیادهسازی مدلهای پیشرفتهتر برای دستهبندی متن، چهار روش زیر مورد استفاده قرار میگیرند:
- روش «رگرسیون لجستیکی» (Logistic Regression).
- روش دستهبند بیز ساده (چندجملهای).
- روش «ماشین بردار پشتیبان خطی» (Linear Support Vector Machine).
- روش «جنگل تصادفی» (Random Forest).
برای پیادهسازی روشهای بالا جهت دستهبندی متن و ارزیابی «دقت» (Accuracy) آنها در پیشبینی کلاس یا خروجی نمونههای دیده نشده، از قطعه کد زیر استفاده میشود:
1from sklearn.linear_model import LogisticRegression
2from sklearn.ensemble import RandomForestClassifier
3from sklearn.svm import LinearSVC
4from sklearn.model_selection import cross_val_score
5models = [
6 RandomForestClassifier(n_estimators=200, max_depth=3, random_state=0),
7 LinearSVC(),
8 MultinomialNB(),
9 LogisticRegression(random_state=0),
10]
11CV = 5
12cv_df = pd.DataFrame(index=range(CV * len(models)))
13entries = []
14for model in models:
15 model_name = model.__class__.__name__
16 accuracies = cross_val_score(model, features, labels, scoring='accuracy', cv=CV)
17 for fold_idx, accuracy in enumerate(accuracies):
18 entries.append((model_name, fold_idx, accuracy))
19cv_df = pd.DataFrame(entries, columns=['model_name', 'fold_idx', 'accuracy'])
20import seaborn as sns
21sns.boxplot(x='model_name', y='accuracy', data=cv_df)
22sns.stripplot(x='model_name', y='accuracy', data=cv_df,
23 size=8, jitter=True, edgecolor="gray", linewidth=2)
24plt.show()
1cv_df.groupby('model_name').accuracy.mean()
خروجی:
model_name LinearSVC 0.822890 LogisticRegression 0.792927 MultinomialNB 0.688519 RandomForestClassifier 0.443826
با توجه به نتایج نمایش داده شده، مدلهای ماشین بردار پشتیبان خطی و رگرسیون لجستیکی بهتر از دیگر مدلهای دستهبندی متن عمل میکنند. البته، دقت ماشین بردار پشتیبان خطی، با دقت میانه نزدیک به 82 درصد، اندکی بهتر از روش رگرسیون لجستیکی است.
ارزیابی مدلهای دستهبندی متن
پس از اینکه مشخص شد روش ماشین بردار پشتیبان خطی، بهتر از دیگر مدلهای دستهبندی متن عمل میکند، در مرحله بعد، از «ماتریس درهمریختگی» (Confusion Matrix) برای مقایسه خروجی مورد انتظار و خروجی پیشبینی شده برای نمونههای دیده نشده (نمونههای مرحله تست) استفاده میشود.
1model = LinearSVC()
2X_train, X_test, y_train, y_test, indices_train, indices_test = train_test_split(features, labels, df.index, test_size=0.33, random_state=0)
3model.fit(X_train, y_train)
4y_pred = model.predict(X_test)
5from sklearn.metrics import confusion_matrix
6conf_mat = confusion_matrix(y_test, y_pred)
7fig, ax = plt.subplots(figsize=(10,10))
8sns.heatmap(conf_mat, annot=True, fmt='d',
9 xticklabels=category_id_df.Product.values, yticklabels=category_id_df.Product.values)
10plt.ylabel('Actual')
11plt.xlabel('Predicted')
12plt.show()
خروجی:
همانطور که در شکل بالا مشهود است، اکثریت قریب به اتفاق پیشبینیهای انجام شده در «قطر» (Diagonal) قرار میگیرند (در قطر ماتریس درهمریختگی، تمامی نمونههایی قرار میگیرند که خروجی یا کلاس پیشبینی شده توسط مدل دستهبندی متن، با کلاس یا خروجی مورد انتظار برای آنها برابر هستند).با این حال، تعدادی نمونه نیز وجود دارند که به اشتباه دستهبندی شدهاند (Misclassification). از دیدگاه تحلیلی، فهمیدن دلیل به اشتباه دستهبندی شدن این نمونهها، ممکن است اطلاعات مفیدی در رابطه با مدلهای دستهبندی متن در اختیار توسعهدهندگان قرار دهد.
1from IPython.display import display
2for predicted in category_id_df.category_id:
3 for actual in category_id_df.category_id:
4 if predicted != actual and conf_mat[actual, predicted] >= 10:
5 print("'{}' predicted as '{}' : {} examples.".format(id_to_category[actual], id_to_category[predicted], conf_mat[actual, predicted]))
6 display(df.loc[indices_test[(y_test == actual) & (y_pred == predicted)]][['Product', 'Consumer_complaint_narrative']])
7 print('')
ده نمونه از دادههای کلاس (Debt collection) که به اشتباه در کلاس (Credit reporting) دستهبندی شدهاند:
شماره | متن شکایت مالی مشتریان (Consumer_Complaint_Narrative) | محصول (کلاس یا خروجی) |
2720 | ...Quoting them, your first loan application, the | Consumer Loan |
7091 | ...While reviewing my XXXX credit report, I notic | Consumer Loan |
5439 | ...I have been recently checking my credit report | Consumer Loan |
12763 | ...We went to buy XXXX cars, and the dealership s | Consumer Loan |
13158 | ...I got a 30 day late XX/XX/2017 and it 's repor | Consumer Loan |
4134 | ...I took out an instalment loan in the amount XX | Consumer Loan |
13848 | ...I was turned down for a loan by Honda Finacial | Consumer Loan |
19227 | ...ONEMAIN # XXXX XXXX , IN XXXX ( XXXX ) XXXX Da | Consumer Loan |
11258 | ...I have not been given credit for the payments | Consumer Loan |
11242 | ...Reliable Credit falsely submitted an applicati | Consumer Loan |
ده نمونه از دادههای کلاس (Consumer Loan) که به اشتباه در کلاس (Credit reporting) دستهبندی شدهاند:
شماره | متن شکایت مالی مشتریان (Consumer_Complaint_Narrative) | محصول (کلاس یا خروجی) |
18410 | ...Dear CFPB, I am asking you for assistance to i | Debt collection |
5262 | ...XXXX XXXX, XXXX ( This letter describes in det | Debt collection |
11834 | ...XXXX XXXX XXXX is reporting negatively on my c | Debt collection |
19652 | ...I recently paid of both debts on my credit acc | Debt collection |
15557 | ...Never have been a XXXX XXXX customer. I was at | Debt collection |
4431 | ...someone tried getting credit information and i | Debt collection |
15949 | ...This debt is from account from $ XX/XX/2008 an | Debt collection |
12475 | ...In XXXX XXXX, there was an account opened thro | Debt collection |
13548 | ...DIVERSIFIELD CONSULTANTS INC HAVE VIOLATED FCR | Debt collection |
6988 | ...Also collections refuses to stop reporting to | Debt collection |
همانطور که در جداول بالا مشاهده میشود، برخی از نمونههای (شکایت مالی مشتریان) به اشتباه دستهبندی شده، نمونههایی هستند که زمینه محتوایی آنها به بیش از یک کلاس مرتبط است. به عنوان نمونه، برخی از شکایات مطرح شده، هم در مورد (credit card) هستند و هم در مورد (credit report). در چنین حالتی، این نمونهها ممکن است به اشتباه در یکی از این دو کلاس دستهبندی شوند. نکته مهم در مورد نتایج نمایش داده شده این است که وقوع خطاهایی از این دست، در یک مدل دستهبندی متن بسیار محتمل است.
در ادامه، باز هم با استفاده از تابع (sklearn.feature_selection.chi2) در کتابخانه (SciKit-Learn)، عبارات یک کلمهای و دو کلمهای که بیشترین «همبستگی» (Correlation) را با کلاسها یا خروجیهای مورد انتظار دارند، شناسایی و در خروجی نمایش داده میشوند:
1model.fit(features, labels)
2N = 2
3for Product, category_id in sorted(category_to_id.items()):
4 indices = np.argsort(model.coef_[category_id])
5 feature_names = np.array(tfidf.get_feature_names())[indices]
6 unigrams = [v for v in reversed(feature_names) if len(v.split(' ')) == 1][:N]
7 bigrams = [v for v in reversed(feature_names) if len(v.split(' ')) == 2][:N]
8 print("# '{}':".format(Product))
9 print(" . Top unigrams:\n . {}".format('\n . '.join(unigrams)))
10 print(" . Top bigrams:\n . {}".format('\n . '.join(bigrams)))
خروجی:
کلاسها یا خروجیهای مورد انتظار | همبستهترین تک کلمهایها | همبستهترین دو کلمهایها |
Bank account or service |
bank account |
debit card overdraft fees |
Consumer Loan |
vehicle car |
personal loan history xxxx |
Credit card |
card discover |
credit card discover card |
Credit reporting |
equifax transunion |
xxxx account trans union |
Debt collection |
debt collection |
account credit time provided |
Money transfers |
paypal transfer |
money transfer send money |
Mortgage |
mortgage escrow |
loan modification mortgage company |
Other financial service |
passport dental |
stated pay help pay |
Payday loan |
payday loan |
payday loan pay day |
Prepaid card |
prepaid serve |
prepaid card use card |
Student loan |
navient loans |
student loan sallie mae |
Virtual currency |
https tx |
money want xxxx provider |
با بررسی شهودی خروجیهای چاپ شده میتوان دریافت که عبارات تک کلمهای و دو کلمهای نمایش داده شده، همبستگی بسیار بالایی با کلاسها یا خروجیهای مورد انتظار از سیستم دسته بندی متن دارند. همچنین از نظر شهودی، همبستهترین کلمات شناسایی توسط مدل بردار ماشین پشتیبان خطی، نسبت به مدل برداری TF-IDF، همبستگی بهتری با کلاسهای موجود در سیستم دارند. در ادامه، برخی از پیشبینیهای انجام شده توسط مدل دستهبندی متن، جهت دستهبندی جملات نمونه در یکی از 12 کلاس از پیش تعریف شده نشان داده میشود. از قطعه کد زیر، برای دستهبندی دادههای متنی نمونه با استفاده از مدل دستهبندی آموزش دیده (توسط مدل بردار ماشین پشتیبان خطی) استفاده میشود.
1texts = ["I requested a home loan modification through Bank of America. Bank of America never got back to me.",
2 "It has been difficult for me to find my past due balance. I missed a regular monthly payment",
3 "I can't get the money out of the country.",
4 "I have no money to pay my tuition",
5 "Coinbase closed my account for no reason and furthermore refused to give me a reason despite dozens of request"]
6text_features = tfidf.transform(texts)
7predictions = model.predict(text_features)
8for text, predicted in zip(texts, predictions):
9 print('"{}"'.format(text))
10 print(" - Predicted as: '{}'".format(id_to_category[predicted]))
11 print("")
خروجی:
"I requested a home loan modification through Bank of America. Bank of America never got back to me." - Predicted as: 'Mortgage' "It has been difficult for me to find my past due balance. I missed a regular monthly payment" - Predicted as: 'Credit reporting' "I can't get the money out of the country." - Predicted as: 'Bank account or service' "I have no money to pay my tuition" - Predicted as: 'Debt collection' "Coinbase closed my account for no reason and furthermore refused to give me a reason despite dozens of request" - Predicted as: 'Bank account or service'
در مرحله آخر، نتایج ارزیابی عملکرد سیستم دستهبندی متن با توجه به معیارهایی نظیر «دقت» (Precision)، «صحت» (Recall) و سایر موارد نمایش داده میشود.
1from sklearn import metrics
2print(metrics.classification_report(y_test, y_pred, target_names=df['Product'].unique()))
کلاسها (خروجی) | دقت (Precision) | صحت (Recall) | امتیاز F1 | تعداد کل نمونهها در کلاسها |
Credit reporting | 0٫82 | 0٫82 | 0٫82 | 288 |
Consumer Loan | 0٫83 | 0٫60 | 0٫70 | 100 |
Debt collection | 0٫80 | 0٫91 | 0٫85 | 359 |
Mortgage | 0٫90 | 0٫93 | 0٫92 | 317 |
Credit card | 0٫73 | 0٫77 | 0٫75 | 165 |
Other financial service | 0٫00 | 0٫00 | 0٫00 | 1 |
Bank account or service | 0٫74 | 0٫74 | 0٫74 | 121 |
Student loan | 0٫92 | 0٫83 | 0٫87 | 111 |
Money transfers | 0٫50 | 0٫23 | 0٫32 | 13 |
Payday loan | 0٫75 | 0٫38 | 0٫50 | 16 |
Prepaid card | 0٫67 | 0٫12 | 0٫20 | 17 |
avg / total | 0٫82 | 0٫82 | 0٫81 | 1508 |
جمعبندی
در این مطلب، با سیستمهای دستهبندی متن و پیادهسازی آنها در زبان برنامهنویسی پایتون آشنا شدید. در طی چند سال اخیر، روشهای دسته بندی متن به یکی از مهمترین ابزارهای استخراج و تولید دانش در صنایع و شرکتهای تجاری تبدیل شدهاند.
از این دسته از روشها، جهت ارزیابی برندهای تجاری و درصد رضایت مشتریان از محصولات یا خدمات، دستهبندی نظرات مشتریان در رابطه با یک محصول خاص و ارجاع نظرات، انتقادات و شکایات مطرح شده نسبت به یک محصول یا سرویس خاص به نمایندگان شرکتها در مناطق مختلف دنیا استفاده میشود.
اگر نوشته بالا برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای داده کاوی و یادگیری ماشین
- آموزش اصول و روش های دادهکاوی (Data Mining)
- مجموعه آموزشهای هوش مصنوعی
- متنکاوی (Text Mining) — به زبان ساده
- روشهای تحلیل احساسات در پایتون — راهنمای کاربردی
- روشهای متنکاوی — راهنمای کاربردی
^^
ممنون از مثال طرح شده.
در صورت عدم استفاده از Oversampling میتوانید از class_weight=”balanced” در الگوریتمها استفاده کنید که وزن کلاسهای کوچک تر رو زیاد کنه.
ضمنا، جدی ترجمه فارسی الگوریتمها استفاده میشه؟
ماشین بردار پشتیبان؟
با سلام و احترام؛
صمیمانه از همراهی شما با مجله فرادرس و ارائه بازخورد سپاسگزاریم.
همانطور که بسیاری از اصطلاحات تخصصی کامپیوتر و ریاضیات نیز مدت زیادی است که معادل فارسی دارند، اکثر اصطلاحات هوش مصنوعی و یادگیری ماشین نیز دارای معادل فارسی هستند و در دانشگاهها و مقالات علمی نیز از معادلهای فارسی آنها استفاده میشود،
برای شما آرزوی سلامتی و موفقیت داریم.