پیاده سازی مدل های دسته بندی متن در پایتون — راهنمای کاربردی

۹۸۳ بازدید
آخرین به‌روزرسانی: ۲۱ تیر ۱۴۰۲
زمان مطالعه: ۱۸ دقیقه
پیاده سازی مدل های دسته بندی متن در پایتون — راهنمای کاربردی

«دسته بندی متن» (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). بنابراین، جدول بالا به شکل زیر دوباره نویسی خواهد شد:

محصول (کلاس یا خروجی)گفتار موجود در شکایت مشتریان (ورودی)
0MortgageNaN
1Credit reporting ...I have outdated information on my credit repor
2Consumer Loan...I purchased a new car on XXXX XXXX. The car de
3Credit cardNaN
4Debt collectionNaN

بنابراین، اگر بخواهیم «ورودی‌ها» (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)
1Credit reporting ...I have outdated information on my credit repor0
2Consumer Loan...I purchased a new car on XXXX XXXX. The car de1
7Credit reporting ...An account on my credit report has a mistaken0
12Debt collection ...This company refuses to provide me verificatio2
16Debt collection ...This complaint is in regards to Square Two Fin2

کلاس‌های نامتوازن (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)
12Debt collection...This company refuses to provide me verificatio2

از یک  نمونه دیده نشده دیگر، برای ارزیابی عملکرد مدل دسته‌‌بندی متن استفاده می‌شود:

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)
61Credit reporting...I am disputing the inaccurate information the0

بنابراین همانطور که مشاهده شد، مدل دسته‌بندی متن بیز ساده، در هر دو حالت توانست کلاس یا خروجی نمونه‌های دیده نشده را به درستی پیش‌بینی کند. در ادامه، با مدل‌های پیشرفته‌تر برای دسته‌بندی متن آشنا خواهید شد.

انتخاب مدل مناسب برای دسته‌بندی متن

در این بخش، مدل‌های یادگیری ماشین پیشرفته‌تر جهت دسته‌بندی متن پیاده‌سازی و ارزیابی خواهند شد. برای پیاده‌سازی مدل‌های پیشرفته‌تر برای دسته‌بندی متن، چهار روش زیر مورد استفاده قرار می‌گیرند:

برای پیاده‌سازی روش‌های بالا جهت دسته‌بندی متن و ارزیابی «دقت» (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, theConsumer Loan
7091...While reviewing my XXXX credit report, I noticConsumer Loan
5439...I have been recently checking my credit reportConsumer Loan
12763...We went to buy XXXX cars, and the dealership sConsumer Loan
13158...I got a 30 day late XX/XX/2017 and it 's reporConsumer Loan
4134...I took out an instalment loan in the amount XXConsumer Loan
13848...I was turned down for a loan by Honda FinacialConsumer Loan
19227...ONEMAIN # XXXX XXXX , IN XXXX ( XXXX ) XXXX DaConsumer Loan
11258...I have not been given credit for the paymentsConsumer Loan
11242...Reliable Credit falsely submitted an applicatiConsumer Loan

ده نمونه از داده‌های کلاس (Consumer Loan) که به اشتباه در کلاس (Credit reporting) دسته‌بندی شده‌اند:

شمارهمتن شکایت مالی مشتریان (Consumer_Complaint_Narrative)محصول (کلاس یا خروجی)
18410...Dear CFPB, I am asking you for assistance to iDebt collection
5262...XXXX XXXX, XXXX ( This letter describes in detDebt collection
11834...XXXX XXXX XXXX is reporting negatively on my cDebt collection
19652...I recently paid of both debts on my credit accDebt collection
15557...Never have been a XXXX XXXX customer. I was atDebt collection
4431...someone tried getting credit information and iDebt collection
15949...This debt is from account from $ XX/XX/2008 anDebt collection
12475...In XXXX XXXX, there was an account opened throDebt collection
13548...DIVERSIFIELD CONSULTANTS INC HAVE VIOLATED FCRDebt collection
6988...Also collections refuses to stop reporting toDebt 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 reporting0٫820٫820٫82288
Consumer Loan0٫830٫600٫70100
Debt collection0٫800٫910٫85359
Mortgage0٫900٫930٫92317
Credit card0٫730٫770٫75165
Other financial service0٫000٫000٫001
Bank account or service0٫740٫740٫74121
Student loan0٫920٫830٫87111
Money transfers0٫500٫230٫3213
Payday loan0٫750٫380٫5016
Prepaid card0٫670٫120٫2017
avg / total0٫820٫820٫811508

جمع‌بندی

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

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

اگر نوشته بالا برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

^^

بر اساس رای ۳ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
Towards Data Science
۲ دیدگاه برای «پیاده سازی مدل های دسته بندی متن در پایتون — راهنمای کاربردی»

ممنون از مثال طرح شده.
در صورت عدم استفاده از Oversampling میتوانید از class_weight=”balanced” در الگوریتمها استفاده کنید که وزن کلاسهای کوچک تر رو زیاد کنه.

ضمنا، جدی ترجمه فارسی الگوریتمها استفاده میشه؟
ماشین بردار پشتیبان؟

با سلام و احترام؛

صمیمانه از همراهی شما با مجله فرادرس و ارائه بازخورد سپاس‌گزاریم.

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

برای شما آرزوی سلامتی و موفقیت داریم.

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *