وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

طبقه بندی متن با پایتون و Scikit-Learn

0 51
زمان لازم برای مطالعه: 9 دقیقه


معرفی

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

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

مجموعه داده

مجموعه داده ای که می خواهیم برای این مقاله استفاده کنیم را می توان از این قسمت دانلود کرد گروه پردازش زبان طبیعی کورنل. مجموعه داده در مجموع از 2000 سند تشکیل شده است. نیمی از اسناد شامل نقدهای مثبت در مورد یک فیلم است در حالی که نیمی دیگر حاوی نقدهای منفی است. جزئیات بیشتر در مورد مجموعه داده را می توان در اینجا یافت این لینک.

پس از دانلود مجموعه داده را از حالت فشرده خارج یا استخراج کنید. پوشه “txt_sentoken” را باز کنید. پوشه حاوی دو زیرپوشه است: “neg” و “pos”. اگر این پوشه ها را باز کنید، می توانید اسناد متنی حاوی نقد فیلم را ببینید.

تجزیه و تحلیل احساسات با Scikit-Learn

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

مراحل زیر برای ایجاد یک مدل طبقه بندی متن در پایتون وجود دارد:

  1. واردات کتابخانه ها
  2. وارد کردن مجموعه داده
  3. پیش پردازش متن
  4. تبدیل متن به اعداد
  5. مجموعه های آموزشی و تستی
  6. مدل طبقه بندی متن آموزشی و پیش بینی احساسات
  7. ارزیابی مدل
  8. ذخیره و بارگذاری مدل

واردات کتابخانه ها

اسکریپت زیر را اجرا کنید import کتابخانه های مورد نیاز:

import numpy as np
import re
import nltk
from sklearn.datasets import load_files
nltk.download('stopwords')
import pickle
from nltk.corpus import stopwords

وارد کردن مجموعه داده

ما استفاده خواهیم کرد load_files تابع از sklearn_datasets کتابخانه به import مجموعه داده در برنامه ما. این load_files تابع به طور خودکار مجموعه داده را به داده ها و مجموعه های هدف تقسیم می کند. به عنوان مثال، در مورد ما، آن را به مسیر دایرکتوری “txt_sentoken” منتقل می کنیم. این load_files هر پوشه داخل پوشه “txt_sentoken” را به عنوان یک دسته در نظر می گیرد و تمام اسناد داخل آن پوشه به دسته مربوط به آن اختصاص می یابد.

برای دیدن اسکریپت زیر را اجرا کنید load_files عملکرد در عمل:

movie_data = load_files(r"D:\txt_sentoken")
X, y = movie_data.data, movie_data.target

در اسکریپت بالا، load_files تابع داده ها را از هر دو پوشه “neg” و “pos” در پوشه بارگذاری می کند X متغیر، در حالی که دسته های هدف در آن ذخیره می شوند y. اینجا X لیستی از 2000 عنصر نوع رشته ای است که هر عنصر مربوط به بررسی تک کاربر است. به همین ترتیب، y یک آرایه numpy به اندازه 2000 است. اگر شما print y روی در صفحه نمایش، آرایه ای از 1 و 0 را مشاهده خواهید کرد. این به این دلیل است که برای هر دسته، load_files تابع یک عدد به آرایه numpy هدف اضافه می کند. ما دو دسته داریم: “neg” و “pos”، بنابراین 1s و 0s به آرایه هدف اضافه شده است.

پیش پردازش متن

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

documents = ()

from nltk.stem import WordNetLemmatizer

stemmer = WordNetLemmatizer()

for sen in range(0, len(X)):
    
    document = re.sub(r'\W', ' ', str(X(sen)))
    
    
    document = re.sub(r'\s+(a-zA-Z)\s+', ' ', document)
    
    
    document = re.sub(r'\^(a-zA-Z)\s+', ' ', document) 
    
    
    document = re.sub(r'\s+', ' ', document, flags=re.I)
    
    
    document = re.sub(r'^b\s+', '', document)
    
    
    document = document.lower()
    
    
    document = document.split()

    document = (stemmer.lemmatize(word) for word in document)
    document = ' '.join(document)
    
    documents.append(document)

در اسکریپت بالا ما از Regex Expressions از کتابخانه Python re برای انجام کارهای مختلف پیش پردازش استفاده می کنیم. با حذف تمام کاراکترهای غیرکلمه ای مانند کاراکترهای خاص، اعداد و غیره شروع می کنیم.

بعد، تمام کاراکترهای منفرد را حذف می کنیم. به عنوان مثال، وقتی علامت نگارشی را از “David’s” حذف می کنیم و آن را با یک فاصله جایگزین می کنیم، “David” و یک کاراکتر “s” را می گیریم که معنی ندارد. برای حذف چنین کاراکترهای تکی از ما استفاده می کنیم \s+(a-zA-Z)\s+ عبارت منظم که جایگزین تمام نویسه های منفرد دارای فاصله می شود روی هر طرف، با یک فضای واحد.

بعد از آن استفاده می کنیم \^(a-zA-Z)\s+ عبارت منظم برای جایگزینی یک کاراکتر از ابتدای سند، با یک فاصله. جایگزینی کاراکترهای منفرد با یک فاصله ممکن است باعث ایجاد چند فاصله شود که ایده آل نیست.

ما دوباره از عبارت منظم استفاده می کنیم \s+ برای جایگزینی یک یا چند فضا با یک فضای واحد. وقتی یک مجموعه داده در قالب بایت دارید، حرف الفبای “b” قبل از هر رشته اضافه می شود. رژکس ^b\s+ “b” را از ابتدای یک رشته حذف می کند. گام بعدی این است که داده ها را به حروف کوچک تبدیل کنید تا کلماتی که در واقع یکسان هستند اما حروف متفاوتی دارند به طور یکسان در نظر گرفته شوند.

مرحله پیش پردازش نهایی این است ریشه یابی. در واژه سازی، کلمه را به فرهنگ لغت کاهش می دهیم root فرم. به عنوان مثال “گربه” به “گربه” تبدیل می شود. Lemmatization به منظور جلوگیری از ایجاد ویژگی هایی انجام می شود که از نظر معنایی مشابه اما از نظر نحوی متفاوت هستند. به عنوان مثال، ما دو ویژگی متفاوت به نام‌های «cats» و «cat» را نمی‌خواهیم که از نظر معنایی مشابه باشند، بنابراین ما واژه‌سازی را انجام می‌دهیم.

تبدیل متن به اعداد

ماشین‌ها برخلاف انسان‌ها نمی‌توانند متن خام را بفهمند. ماشین ها فقط می توانند اعداد را ببینند. به ویژه، تکنیک های آماری مانند یادگیری ماشینی فقط می توانند با اعداد سروکار داشته باشند. بنابراین، باید متن خود را به عدد تبدیل کنیم.

رویکردهای مختلفی برای تبدیل متن به شکل عددی مربوطه وجود دارد. مدل کیسه کلمات و مدل جاسازی کلمه دو مورد از متداول ترین رویکردها هستند. در این مقاله از مدل کیف کلمات برای تبدیل متن خود به عدد استفاده می کنیم.

کیسه کلمات

اسکریپت زیر از مدل کیسه کلمات برای تبدیل اسناد متنی به ویژگی های عددی مربوطه استفاده می کند:

from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer(max_features=1500, min_df=5, max_df=0.7, stop_words=stopwords.words('english'))
X = vectorizer.fit_transform(documents).toarray()

اسکریپت بالا استفاده می کند CountVectorizer کلاس از sklearn.feature_extraction.text کتابخانه برخی از پارامترهای مهم وجود دارد که باید به سازنده کلاس منتقل شود. اولین پارامتر عبارت است از max_features پارامتر، که روی 1500 تنظیم شده است. این به این دلیل است که وقتی کلمات را با استفاده از رویکرد کیسه کلمات به اعداد تبدیل می کنید، تمام کلمات منحصر به فرد در همه اسناد به ویژگی تبدیل می شوند. همه اسناد می توانند حاوی ده ها هزار کلمه منحصر به فرد باشند. اما کلماتی که فراوانی بسیار پایینی دارند به طور غیرعادی پارامتر مناسبی برای طبقه بندی اسناد نیستند. بنابراین ما تنظیم می کنیم max_features پارامتر به 1500، به این معنی که ما می خواهیم از 1500 کلمه رایج به عنوان ویژگی برای آموزش طبقه بندی کننده خود استفاده کنیم.

پارامتر بعدی این است min_df و روی 5 تنظیم شده است. این مربوط به حداقل تعداد اسنادی است که باید حاوی این ویژگی باشد. بنابراین ما فقط آن کلماتی را که حداقل در 5 سند وجود دارد را درج می کنیم. به طور مشابه، برای max_dfمقدار مشخصه روی 0.7 تنظیم شده است. که در آن کسر مربوط به یک درصد است. در اینجا 0.7 به این معنی است که ما باید فقط کلماتی را که حداکثر در 70٪ از کل اسناد وجود دارد، درج کنیم. کلماتی که تقریباً در هر سندی وجود دارند معمولاً برای طبقه بندی مناسب نیستند زیرا هیچ اطلاعات منحصر به فردی در مورد سند ارائه نمی دهند.

در نهایت ما آن را حذف می کنیم کلمات را متوقف کنید از متن ما، زیرا، در مورد تجزیه و تحلیل احساسات، کلمات توقف ممکن است حاوی اطلاعات مفیدی نباشند. برای حذف کلمات توقف، از آن عبور می کنیم stopwords شی از nltk.corpus کتابخانه به stop_wordsپارامتر.

این fit_transform عملکرد از CountVectorizer class اسناد متنی را به ویژگی های عددی مربوطه تبدیل می کند.

پیدا کردن TFIDF

رویکرد کیسه کلمات برای تبدیل متن به اعداد خوب عمل می کند. با این حال، یک ایراد دارد. بر اساس کلمه به یک نمره امتیاز می دهد روی وقوع آن در یک سند خاص این واقعیت را در نظر نمی گیرد که ممکن است این کلمه در اسناد دیگر نیز فراوانی فراوانی داشته باشد. TFIDF این مشکل را با ضرب فرکانس عبارت یک کلمه در فرکانس معکوس سند حل می کند. TF مخفف “Term Frequency” است در حالی که IDF مخفف “Inverse Document Frequency” است.

اصطلاح فرکانس به صورت زیر محاسبه می شود:

Term frequency = (Number of Occurrences of a word)/(Total words in the document)

و فرکانس معکوس سند به صورت زیر محاسبه می شود:

IDF(word) = Log((Total number of documents)/(Number of documents containing the word))

مقدار TFIDF برای یک کلمه در یک سند خاص بیشتر است اگر دفعات وقوع آن کلمه در آن سند خاص بیشتر باشد اما در سایر اسناد کمتر باشد.

برای تبدیل مقادیر به دست آمده با استفاده از مدل کیسه کلمات به مقادیر TFIDF، اسکریپت زیر را اجرا کنید:

from sklearn.feature_extraction.text import TfidfTransformer
tfidfconverter = TfidfTransformer()
X = tfidfconverter.fit_transform(X).toarray()
توجه داشته باشید:

همچنین می‌توانید اسناد متنی را مستقیماً به مقادیر ویژگی TFIDF (بدون تبدیل اسناد به ویژگی‌های کیسه کلمات) با استفاده از اسکریپت زیر تبدیل کنید:

from sklearn.feature_extraction.text import TfidfVectorizer
tfidfconverter = TfidfVectorizer(max_features=1500, min_df=5, max_df=0.7, stop_words=stopwords.words('english'))
X = tfidfconverter.fit_transform(documents).toarray()

مجموعه های آموزشی و تستی

مانند هر مشکل یادگیری ماشینی تحت نظارت دیگری، ما باید داده های خود را به مجموعه های آموزشی و آزمایشی تقسیم کنیم. برای انجام این کار، ما از train_test_split ابزار از sklearn.model_selection کتابخانه اسکریپت زیر را اجرا کنید:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

اسکریپت بالا داده ها را به 20% مجموعه تست و 80% مجموعه آموزشی تقسیم می کند.

مدل طبقه بندی متن آموزشی و پیش بینی احساسات

ما داده های خود را به مجموعه آموزشی و آزمایشی تقسیم کرده ایم. اکنون زمان آن است که عمل واقعی را ببینیم. ما از الگوریتم جنگل تصادفی برای آموزش مدل خود استفاده خواهیم کرد. می توانید از هر مدل دیگری که انتخاب می کنید استفاده کنید.

برای آموزش مدل یادگیری ماشین خود با استفاده از الگوریتم جنگل تصادفی که استفاده خواهیم کرد RandomForestClassifier کلاس از sklearn.ensemble کتابخانه این fit از روش این کلاس برای آموزش الگوریتم استفاده می شود. ما باید داده های آموزشی و مجموعه های هدف آموزشی را به این روش منتقل کنیم. به اسکریپت زیر دقت کنید:

classifier = RandomForestClassifier(n_estimators=1000, random_state=0)
classifier.fit(X_train, y_train) 

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

y_pred = classifier.predict(X_test)

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

ارزیابی مدل

برای ارزیابی عملکرد یک مدل طبقه بندی مانند مدلی که به تازگی آموزش داده ایم، می توانیم از معیارهایی مانند ماتریس سردرگمی، اندازه گیری F1، و دقت.

برای یافتن این مقادیر می توانیم استفاده کنیم classification_report، confusion_matrix، و accuracy_score آب و برق از sklearn.metrics کتابخانه برای این کار اسکریپت زیر را اجرا کنید:

from sklearn.metrics import classification_report, confusion_matrix, accuracy_score

print(confusion_matrix(y_test,y_pred))
print(classification_report(y_test,y_pred))
print(accuracy_score(y_test, y_pred))

خروجی به شکل زیر است:

((180  28)
 ( 30 162))
             precision    recall  f1-score   support

          0       0.86      0.87      0.86       208
          1       0.85      0.84      0.85       192

avg / total       0.85      0.85      0.85       400

0.855

از خروجی، می توان دریافت که مدل ما به دقت 85.5 درصد دست یافته است که با توجه به این واقعیت که ما به صورت تصادفی تمام پارامترها را انتخاب کردیم، بسیار خوب است. CountVectorizer و همچنین برای الگوریتم جنگل تصادفی ما.

ذخیره و بارگذاری مدل

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

ما می توانیم مدل خود را به عنوان یک ذخیره کنیم pickle شی در پایتون برای انجام این کار، اسکریپت زیر را اجرا کنید:

with open('text_classifier', 'wb') as picklefile:
    pickle.dump(classifier,picklefile)

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

برای بارگذاری مدل می توانیم از کد زیر استفاده کنیم:

with open('text_classifier', 'rb') as training_model:
    model = pickle.load(training_model)

ما مدل آموزش دیده خود را بارگذاری کردیم و در آن ذخیره کردیم model متغیر. بیایید احساسات مجموعه تست را با استفاده از مدل بارگذاری شده پیش بینی کنیم و ببینیم آیا می توانیم همان نتایج را بدست آوریم. اسکریپت زیر را اجرا کنید:

y_pred2 = model.predict(X_test)

print(confusion_matrix(y_test, y_pred2))
print(classification_report(y_test, y_pred2))
print(accuracy_score(y_test, y_pred2)) 

خروجی به شکل زیر است:

((180  28)
 ( 30 162))
             precision    recall  f1-score   support

          0       0.86      0.87      0.86       208
          1       0.85      0.84      0.85       192

avg / total       0.85      0.85      0.85       400

0.855

خروجی مشابه همان چیزی است که قبلا دریافت کردیم که نشان داد ما با موفقیت مدل را ذخیره و بارگذاری کردیم.

نتیجه

طبقه بندی متن یکی از رایج ترین کارهای NLP است. در این مقاله یک مثال ساده از روش انجام طبقه بندی متن در پایتون را دیدیم. ما تحلیل احساساتی نقدهای فیلم را انجام دادیم.

من به شما توصیه می کنم که الگوریتم یادگیری ماشین دیگری را تغییر دهید تا ببینید آیا می توانید عملکرد را بهبود ببخشید یا خیر. همچنین سعی کنید پارامترهای the را تغییر دهید CountVectorizerکلاس برای دیدن اینکه آیا می توانید پیشرفتی داشته باشید.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-27 12:46:04

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید