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

سرور مجازی NVMe

پایتون برای NLP: کار با کتابخانه FastText فیس بوک

0 35
زمان لازم برای مطالعه: 12 دقیقه


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

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

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

FastText برای تشابه معنایی

FastText از هر دو پشتیبانی می کند کیسه کلمات پیوسته و مدل های Skip-Gram. در این مقاله مدل skip-gram را برای یادگیری نمایش برداری کلمات از مقالات ویکی پدیا پیاده سازی می کنیم. روی هوش مصنوعی، فراگیری ماشین، یادگیری عمیق، و شبکه های عصبی. از آنجایی که این موضوعات کاملا مشابه هستند، ما این موضوعات را برای داشتن حجم قابل توجهی از داده ها برای ایجاد یک مجموعه انتخاب کردیم. در صورت تمایل می توانید موضوعات بیشتری با ماهیت مشابه اضافه کنید.

به عنوان اولین قدم، ما نیاز داریم import کتابخانه های مورد نیاز ما از کتابخانه ویکی‌پدیا برای پایتون استفاده خواهیم کرد که از طریق دستور زیر قابل دانلود است:

$ pip install wikipedia

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

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

from keras.preprocessing.text import Tokenizer
from gensim.models.fasttext import FastText
import numpy as np
import matplotlib.pyplot as plt
import nltk
from string import punctuation
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from nltk.stem import WordNetLemmatizer
from nltk.tokenize import sent_tokenize
from nltk import WordPunctTokenizer

import wikipedia
import nltk
nltk.download('punkt')
nltk.download('wordnet')
nltk.download('stopwords')
en_stop = set(nltk.corpus.stopwords.words('english'))

%matplotlib inline

می بینید که ما از آن استفاده می کنیم FastText ماژول از gensim.models.fasttext کتابخانه برای بازنمایی کلمه و شباهت معنایی، می‌توان از مدل Gensim برای FastText استفاده کرد. این مدل می تواند اجرا شود روی ویندوز، با این حال، برای طبقه بندی متن، ما باید از پلت فرم لینوکس استفاده کنیم. آن را در بخش بعدی خواهیم دید.

خراش دادن مقالات ویکی پدیا

در این مرحله، مقالات مورد نیاز ویکی‌پدیا را پاک می‌کنیم. به اسکریپت زیر نگاه کنید:

artificial_intelligence = wikipedia.page("Artificial Intelligence").content
machine_learning = wikipedia.page("Machine Learning").content
deep_learning = wikipedia.page("Deep Learning").content
neural_network = wikipedia.page("Neural Network").content

artificial_intelligence = sent_tokenize(artificial_intelligence)
machine_learning = sent_tokenize(machine_learning)
deep_learning = sent_tokenize(deep_learning)
neural_network = sent_tokenize(neural_network)

artificial_intelligence.extend(machine_learning)
artificial_intelligence.extend(deep_learning)
artificial_intelligence.extend(neural_network)

برای خراشیدن ویکی پدیا page، می توانیم استفاده کنیم page روش از wikipedia مدول. نام page که می خواهید ضایع کنید به عنوان پارامتر به آن ارسال می شود page روش. روش برمی گردد WikipediaPage شی، که سپس می توانید از آن برای بازیابی استفاده کنید page مطالب از طریق content ویژگی، همانطور که در اسکریپت بالا نشان داده شده است.

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

پیش پردازش داده ها

گام بعدی این است که داده های متنی خود را با حذف علائم نگارشی و اعداد پاک کنیم. همچنین داده ها را به حروف کوچک تبدیل می کنیم. کلمات موجود در داده‌های ما به آنها تبدیل خواهند شد root فرم. همچنین کلمات توقف و کلمات با طول کمتر از 4 از مجموعه حذف می شوند.

را preprocess_text تابع، همانطور که در زیر تعریف شده است، وظایف پیش پردازش را انجام می دهد.

import re
from nltk.stem import WordNetLemmatizer

stemmer = WordNetLemmatizer()

def preprocess_text(document):
        
        document = re.sub(r'\W', ' ', str(document))

        
        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()

        
        tokens = document.split()
        tokens = (stemmer.lemmatize(word) for word in tokens)
        tokens = (word for word in tokens if word not in en_stop)
        tokens = (word for word in tokens if len(word) > 3)

        preprocessed_text = ' '.join(tokens)

        return preprocessed_text

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


sent = preprocess_text("Artificial intelligence, is the most advanced technology of the present era")
print(sent)


final_corpus = (preprocess_text(sentence) for sentence in artificial_intelligence if sentence.strip() !='')

word_punctuation_tokenizer = nltk.WordPunctTokenizer()
word_tokenized_corpus = (word_punctuation_tokenizer.tokenize(sent) for sent in final_corpus)

جمله از پیش پردازش شده به این صورت است:

artificial intelligence advanced technology present

می‌توانید ببینید که علائم نگارشی و توقف کلمات حذف شده‌اند و جملات به صورت کلمه‌نویسی شده‌اند. همچنین کلمات با طول کمتر از 4 مانند “عصر” نیز حذف شده است. این انتخاب‌ها به‌طور تصادفی برای این آزمون انتخاب شده‌اند، بنابراین می‌توانید کلماتی با طول‌های کوچک‌تر یا بزرگ‌تر را در مجموعه مجاز کنید.

ایجاد بازنمایی کلمات

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

embedding_size = 60
window_size = 40
min_word = 5
down_sampling = 1e-2

اینجا embedding_size اندازه بردار جاسازی است. به عبارت دیگر، هر کلمه در پیکره ما به عنوان یک بردار 60 بعدی نشان داده می شود. را window_size اندازه تعداد کلماتی است که قبل و بعد از کلمه بر اساس وجود دارد روی که بازنمودهای کلمه برای کلمه یاد خواهد گرفت. این ممکن است مشکل به نظر برسد، با این حال در مدل skip-gram یک کلمه را به الگوریتم وارد می‌کنیم و خروجی کلمات متن است. اگر اندازه پنجره 40 باشد، برای هر ورودی 80 خروجی وجود دارد: 40 کلمه قبل از کلمه ورودی و 40 کلمه بعد از کلمه ورودی. واژه embeddings برای کلمه ورودی با استفاده از این 80 کلمه خروجی آموخته می شود.

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

بیایید اکنون خود را ایجاد کنیم FastText مدلی برای بازنمایی کلمات

%%time
ft_model = FastText(word_tokenized_corpus,
                      size=embedding_size,
                      window=window_size,
                      min_count=min_word,
                      sample=down_sampling,
                      sg=1,
                      iter=100)

تمام پارامترهای موجود در اسکریپت بالا به جز sg. را sg پارامتر نوع مدلی را که می خواهیم ایجاد کنیم را مشخص می کند. مقدار 1 مشخص می کند که می خواهیم مدل skip-gram ایجاد کنیم. در حالی که صفر مدل کیسه کلمات را مشخص می کند که مقدار پیش فرض نیز می باشد.

اسکریپت بالا را اجرا کنید ممکن است مدتی طول بکشد تا اجرا شود. در دستگاه من آمار زمان اجرای کد بالا به شرح زیر است:

CPU times: user 1min 45s, sys: 434 ms, total: 1min 45s
Wall time: 57.2 s

بیایید اکنون کلمه نمایندگی برای کلمه “مصنوعی” را ببینیم. برای این کار می توانید از wv روش از FastText شیء کنید و نام کلمه را در یک لیست ارسال کنید.

print(ft_model.wv('artificial'))

در اینجا خروجی است:

(-3.7653010e-02 -4.5558015e-01  3.2035065e-01 -1.5289043e-01
  4.0645871e-02 -1.8946664e-01  7.0426887e-01  2.8806925e-01
 -1.8166199e-01  1.7566417e-01  1.1522485e-01 -3.6525184e-01
 -6.4378887e-01 -1.6650060e-01  7.4625671e-01 -4.8166099e-01
  2.0884991e-01  1.8067230e-01 -6.2647951e-01  2.7614883e-01
 -3.6478557e-02  1.4782918e-02 -3.3124462e-01  1.9372456e-01
  4.3028224e-02 -8.2326338e-02  1.0356739e-01  4.0792203e-01
 -2.0596240e-02 -3.5974573e-02  9.9928051e-02  1.7191900e-01
 -2.1196717e-01  6.4424530e-02 -4.4705093e-02  9.7391091e-02
 -2.8846195e-01  8.8607501e-03  1.6514034e-01 -3.6626378e-01
 -6.2017748e-04 -1.5083785e-01 -1.7499258e-01  7.1994811e-02
 -1.9868813e-01 -3.1733567e-01  1.9832127e-01  1.2799081e-01
 -7.6522082e-01  5.2335665e-02 -4.5766738e-01 -2.7947658e-01
  3.7890410e-03 -3.8761377e-01 -9.3001537e-02 -1.7128626e-01
 -1.2923178e-01  3.9627206e-01 -3.6673656e-01  2.2755004e-01)

در خروجی بالا می توانید یک وکتور 60 بعدی برای کلمه “مصنوعی” مشاهده کنید.

بیایید اکنون 5 کلمه مشابه را برای کلمات “مصنوعی”، “هوش”، “ماشین”، “شبکه”، “تکرار کننده”، “عمیق” پیدا کنیم. شما می توانید هر تعداد کلمه را انتخاب کنید. اسکریپت زیر کلمات مشخص شده را به همراه 5 کلمه مشابه چاپ می کند.

semantically_similar_words = {words: (item(0) for item in ft_model.wv.most_similar((words), topn=5))
                  for words in ('artificial', 'intelligence', 'machine', 'network', 'recurrent', 'deep')}

for k,v in semantically_similar_words.items():
    print(k+":"+str(v))

خروجی به صورت زیر است:

artificial:('intelligence', 'inspired', 'book', 'academic', 'biological')
intelligence:('artificial', 'human', 'people', 'intelligent', 'general')
machine:('ethic', 'learning', 'concerned', 'argument', 'intelligence')
network:('neural', 'forward', 'deep', 'backpropagation', 'hidden')
recurrent:('rnns', 'short', 'schmidhuber', 'shown', 'feedforward')
deep:('convolutional', 'speech', 'network', 'generative', 'neural')

ما همچنین می توانیم شباهت کسینوس بین بردارها را برای هر دو کلمه پیدا کنیم، همانطور که در زیر نشان داده شده است:

print(ft_model.wv.similarity(w1='artificial', w2='intelligence'))

خروجی مقدار “0.7481” را نشان می دهد. مقدار می تواند بین 0 و 1 باشد. مقدار بالاتر به معنای شباهت بیشتر است.

تجسم شباهت های کلمه

اگرچه هر کلمه در مدل ما به عنوان بردار 60 بعدی نشان داده می شود، می توانیم از تکنیک تحلیل مولفه اصلی برای یافتن دو جزء اصلی استفاده کنیم. سپس می توان از دو جزء اصلی برای ترسیم کلمات در یک فضای دو بعدی استفاده کرد. با این حال، ابتدا باید لیستی از تمام کلمات موجود در آن ایجاد کنیم semantically_similar_words فرهنگ لغت. اسکریپت زیر این کار را انجام می دهد:

from sklearn.decomposition import PCA

all_similar_words = sum(((k) + v for k, v in semantically_similar_words.items()), ())

print(all_similar_words)
print(type(all_similar_words))
print(len(all_similar_words))

در اسکریپت بالا، تمام جفت‌های کلید-مقدار در را تکرار می‌کنیم semantically_similar_words فرهنگ لغت. هر کلید در فرهنگ لغت یک کلمه است. مقدار مربوطه فهرستی از تمام کلمات مشابه معنایی است. از آنجایی که ما 5 کلمه مشابه را برای لیستی از 6 کلمه پیدا کردیم، یعنی «مصنوعی»، «هوش»، «ماشین»، «شبکه»، «تکرارکننده»، «عمیق»، خواهید دید که 30 مورد در این فهرست وجود خواهد داشت. را all_similar_words فهرست

در مرحله بعد، ما باید کلمه بردار را برای تمام این 30 کلمه پیدا کنیم و سپس از PCA برای کاهش ابعاد بردارهای کلمه از 60 به 2 استفاده کنیم. سپس می توانیم از plt متد، که نام مستعار the matplotlib.pyplot روش رسم کلمات روی یک فضای برداری دو بعدی

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

word_vectors = ft_model.wv(all_similar_words)

pca = PCA(n_components=2)

p_comps = pca.fit_transform(word_vectors)
word_names = all_similar_words

plt.figure(figsize=(18, 10))
plt.scatter(p_comps(:, 0), p_comps(:, 1), c='red')

for word_names, x, y in zip(word_names, p_comps(:, 0), p_comps(:, 1)):
    plt.annotate(word_names, xy=(x+0.06, y+0.03), xytext=(0, 0), textcoords='offset points')

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

پایتون برای NLP: کار با کتابخانه FastText فیس بوک

در صفحه دوبعدی نیز می‌توانید کلماتی را که اغلب با هم در متن اتفاق می‌افتند، نزدیک به هم ببینید. به عنوان مثال، کلمات “عمیق” و “شبکه” تقریباً همپوشانی دارند. به همین ترتیب، کلمات “فید فوروارد” و “پس انتشار” نیز بسیار نزدیک هستند.

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

FastText برای طبقه بندی متن

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

ماژول طبقه بندی متن FastText فقط از طریق لینوکس یا OSX قابل اجرا است. اگر کاربر ویندوز هستید، می توانید استفاده کنید Google Collaboratory برای اجرای ماژول طبقه بندی متن FastText. تمام اسکریپت های این بخش با استفاده از Google Colaboratory اجرا شده اند.

مجموعه داده

مجموعه داده های این مقاله را می توانید از اینجا دانلود کنید لینک کاگل. مجموعه داده شامل چندین فایل است، اما ما فقط به آن علاقه داریم yelp_review.csv فایل. این فایل حاوی بیش از 5.2 میلیون بررسی در مورد مشاغل مختلف از جمله رستوران ها، کافه ها، دندانپزشکان، پزشکان، سالن های زیبایی و غیره است. با این حال، به دلیل محدودیت های حافظه، ما فقط از 50000 رکورد اول برای آموزش مدل خود استفاده خواهیم کرد. در صورت تمایل می توانید با رکوردهای بیشتری امتحان کنید.

اجازه دهید import کتابخانه های مورد نیاز و بارگذاری مجموعه داده:

import pandas as pd
import numpy as np

yelp_reviews = pd.read_csv("/content/drive/My Drive/Colab Datasets/yelp_review_short.csv")

bins = (0,2,5)
review_names = ('negative', 'positive')

yelp_reviews('reviews_score') = pd.cut(yelp_reviews('stars'), bins, labels=review_names)

yelp_reviews.head()

در اسکریپت بالا ما بارگذاری می کنیم yelp_review_short.csv فایلی که شامل 50000 بررسی با pd.read_csv تابع.

ما مشکل خود را با تبدیل مقادیر عددی بررسی ها به مقوله ای ساده می کنیم. این کار با اضافه کردن یک ستون جدید انجام می شود،reviews_score، به مجموعه داده ما. اگر نظر کاربر دارای مقداری بین 1-2 باشد Stars ستون (که کسب و کار را رتبه بندی می کند روی مقیاس 1-5)، reviews_score ستون یک مقدار رشته ای خواهد داشت negative. اگر امتیاز بین 3-5 در Stars ستون، reviews_score ستون حاوی یک مقدار خواهد بود positive. این باعث می شود مشکل ما یک مشکل طبقه بندی باینری باشد.

در نهایت هدر دیتافریم مطابق شکل زیر چاپ می شود:

پایتون برای NLP: کار با کتابخانه FastText فیس بوک

نصب FastText

مرحله بعدی این است که import مدل های FastText، که می توانند با استفاده از wget دستور از مخزن GitHub، همانطور که در اسکریپت زیر نشان داده شده است:

!wget https://github.com/facebookresearch/fastText/archive/v0.1.0.zip

توجه داشته باشید: اگر دستور بالا را از لینوکس اجرا می کنید terminal، لازم نیست پیشوند بزنید ! قبل از دستور بالا در Google Colaboratory notebook، هر دستوری بعد از ! به عنوان یک فرمان پوسته و نه در مفسر پایتون اجرا می شود. بنابراین تمام دستورات غیر پایتون در اینجا با پیشوند هستند !.

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

--2019-08-16 15:05:05--  https://github.com/facebookresearch/fastText/archive/v0.1.0.zip
Resolving github.com (github.com)... 140.82.113.4
Connecting to github.com (github.com)|140.82.113.4|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://codeload.github.com/facebookresearch/fastText/zip/v0.1.0 (following)
--2019-08-16 15:05:05--  https://codeload.github.com/facebookresearch/fastText/zip/v0.1.0
Resolving codeload.github.com (codeload.github.com)... 192.30.255.121
Connecting to codeload.github.com (codeload.github.com)|192.30.255.121|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified (application/zip)
Saving to: ‘v0.1.0.zip’

v0.1.0.zip              ( <=>                )  92.06K  --.-KB/s    in 0.03s

2019-08-16 15:05:05 (3.26 MB/s) - ‘v0.1.0.zip’ saved (94267)

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

!unzip v0.1.0.zip

در مرحله بعد، باید به دایرکتوری که در آن FastText را دانلود کرده اید بروید و سپس آن را اجرا کنید !make دستور اجرای باینری های ++C. مراحل زیر را اجرا کنید:

cd fastText-0.1.0
!make

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

c++ -pthread -std=c++0x -O3 -funroll-loops -c src/args.cc
c++ -pthread -std=c++0x -O3 -funroll-loops -c src/dictionary.cc
c++ -pthread -std=c++0x -O3 -funroll-loops -c src/productquantizer.cc
c++ -pthread -std=c++0x -O3 -funroll-loops -c src/matrix.cc
c++ -pthread -std=c++0x -O3 -funroll-loops -c src/qmatrix.cc
c++ -pthread -std=c++0x -O3 -funroll-loops -c src/vector.cc
c++ -pthread -std=c++0x -O3 -funroll-loops -c src/model.cc
c++ -pthread -std=c++0x -O3 -funroll-loops -c src/utils.cc
c++ -pthread -std=c++0x -O3 -funroll-loops -c src/fasttext.cc
c++ -pthread -std=c++0x -O3 -funroll-loops args.o dictionary.o productquantizer.o matrix.o qmatrix.o vector.o model.o utils.o fasttext.o src/main.cc -o fasttext

برای تایید نصب، دستور زیر را اجرا کنید:

!./fasttext

باید ببینید که این دستورات توسط FastText پشتیبانی می شوند:

usage: fasttext <command> <args>

The commands supported by FastText are:

  supervised              train a supervised classifier
  quantize                quantize a model to reduce the memory usage
  test                    evaluate a supervised classifier
  predict                 predict most likely labels
  predict-prob            predict most likely labels with probabilities
  skipgram                train a skipgram model
  cbow                    train a cbow model
  print-word-vectors      print word vectors given a trained model
  print-sentence-vectors  print sentence vectors given a trained model
  nn                      query for nearest neighbors
  analogies               query for analogies

طبقه بندی متن

قبل از آموزش مدل های FastText برای انجام طبقه بندی متن، لازم به ذکر است که FastText داده ها را در قالب خاصی می پذیرد که به شرح زیر است:

_label_tag This is sentence 1
_label_tag2 This is sentence 2.

اگر به مجموعه داده خود نگاه کنیم، در قالب مورد نظر نیست. متن با احساسات مثبت باید به این صورت باشد:

__label__positive burgers are very big portions here.

به طور مشابه، نظرات منفی باید به این صورت باشد:

__label__negative They do not use organic ingredients, but I thi...

اسکریپت زیر را فیلتر می کند reviews_score و text ستون هایی از مجموعه داده و سپس پیشوندها __label__ قبل از تمام مقادیر موجود در reviews_score ستون به طور مشابه، \n و \t با یک فاصله در جایگزین می شوند text ستون در نهایت دیتافریم به روز شده به شکل روی دیسک نوشته می شود yelp_reviews_updated.txt.

import pandas as pd
from io import StringIO
import csv

col = ('reviews_score', 'text')

yelp_reviews = yelp_reviews(col)
yelp_reviews('reviews_score')=('__label__'+ s for s in yelp_reviews('reviews_score'))
yelp_reviews('text')= yelp_reviews('text').replace('\n',' ', regex=True).replace('\t',' ', regex=True)
yelp_reviews.to_csv(r'/content/drive/My Drive/Colab Datasets/yelp_reviews_updated.txt', index=False, sep=' ', header=False, quoting=csv.QUOTE_NONE, quotechar="", escapechar=" ")

حالا بیایید print رئیس به روز شده yelp_reviews چارچوب داده

yelp_reviews.head()

شما باید نتایج زیر را ببینید:

reviews_score   text
0   __label__positive   Super simple place but amazing nonetheless. It...
1   __label__positive   Small unassuming place that changes their menu...
2   __label__positive   Lester's is located in a beautiful neighborhoo...
3   __label__positive   Love coming here. Yes the place always needs t...
4   __label__positive   Had their chocolate almond croissant and it wa...

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

    reviews_score   text
49995   __label__positive   This is an awesome consignment store! They hav...
49996   __label__positive   Awesome laid back atmosphere with made-to-orde...
49997   __label__positive   Today was my first appointment and I can hones...
49998   __label__positive   I love this chic salon. They use the best prod...
49999   __label__positive   This place is delicious. All their meats and s...

ما مجموعه داده خود را به شکل مورد نیاز تبدیل کرده ایم. مرحله بعدی این است که داده های خود را به مجموعه های قطار و آزمایش تقسیم کنیم. 80% داده یعنی 40000 رکورد اول از 50000 رکورد برای آموزش داده ها استفاده خواهد شد، در حالی که 20% داده (10000 رکورد آخر) برای ارزیابی عملکرد الگوریتم استفاده خواهد شد.

اسکریپت زیر داده ها را به مجموعه های آموزشی و آزمایشی تقسیم می کند:

!head -n 40000 "/content/drive/My Drive/Colab Datasets/yelp_reviews_updated.txt" > "/content/drive/My Drive/Colab Datasets/yelp_reviews_train.txt"
!tail -n 10000 "/content/drive/My Drive/Colab Datasets/yelp_reviews_updated.txt" > "/content/drive/My Drive/Colab Datasets/yelp_reviews_test.txt"

پس از اجرای اسکریپت بالا، yelp_reviews_train.txt فایلی تولید خواهد شد که حاوی داده های آموزشی است. به طور مشابه، به تازگی تولید شده است yelp_reviews_test.txt فایل حاوی داده های آزمایشی خواهد بود.

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

%%time
!./fasttext supervised -input "/content/drive/My Drive/Colab Datasets/yelp_reviews_train.txt" -output model_yelp_reviews

برای آموزش الگوریتم باید از آن استفاده کنیم supervised دستور داده و فایل ورودی را ارسال کنید. نام مدل بعد از آن مشخص می شود -output کلمه کلیدی. اسکریپت بالا منجر به یک مدل طبقه بندی متن آموزش دیده به نام می شود model_yelp_reviews.bin. در اینجا خروجی اسکریپت بالا آمده است:

Read 4M words
Number of words:  177864
Number of labels: 2
Progress: 100.0%  words/sec/thread: 2548017  lr: 0.000000  loss: 0.246120  eta: 0h0m
CPU times: user 212 ms, sys: 48.6 ms, total: 261 ms
Wall time: 15.6 s

می توانید از طریق این مدل نگاهی بیندازید !ls دستور مطابق شکل زیر:

!ls

در اینجا خروجی است:

args.o             Makefile         quantization-results.sh
classification-example.sh  matrix.o         README.md
classification-results.sh  model.o          src
CONTRIBUTING.md        model_yelp_reviews.bin   tutorials
dictionary.o           model_yelp_reviews.vec   utils.o
eval.py            PATENTS          vector.o
fasttext           pretrained-vectors.md    wikifil.pl
fasttext.o         productquantizer.o       word-vector-example.sh
get-wikimedia.sh       qmatrix.o            yelp_reviews_train.txt
LICENSE            quantization-example.sh

می توانی ببینی model_yelp_reviews.bin در لیست اسناد بالا

در نهایت برای تست مدل می توانید از test فرمان شما باید نام مدل و فایل تست را بعد از آن مشخص کنید test دستور، مطابق شکل زیر:

!./fasttext test model_yelp_reviews.bin "/content/drive/My Drive/Colab Datasets/yelp_reviews_test.txt"

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

N   10000
P@1 0.909
R@1 0.909
Number of examples: 10000

اینجا P@1 اشاره به دقت و R@1به یادآوری اشاره دارد. می توانید ببینید که مدل ما به دقت و فراخوانی 0.909 می رسد که بسیار خوب است.

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

!cat "/content/drive/My Drive/Colab Datasets/yelp_reviews_train.txt" | sed -e "s/\((.\!?,’/())\)/ \1 /g" | tr "(:upper:)" "(:lower:)" > "/content/drive/My Drive/Colab Datasets/yelp_reviews_train_clean.txt"

و اسکریپت زیر مجموعه تست را پاک می کند:

"/content/drive/My Drive/Colab Datasets/yelp_reviews_test.txt" | sed -e "s/\((.\!?,’/())\)/ \1 /g" | tr "(:upper:)" "(:lower:)" > "/content/drive/My Drive/Colab Datasets/yelp_reviews_test_clean.txt"

اکنون به آموزش مدل می پردازیم روی مجموعه آموزشی تمیز شده:

%%time
!./fasttext supervised -input "/content/drive/My Drive/Colab Datasets/yelp_reviews_train_clean.txt" -output model_yelp_reviews

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

!./fasttext test model_yelp_reviews.bin "/content/drive/My Drive/Colab Datasets/yelp_reviews_test_clean.txt"

خروجی اسکریپت فوق به صورت زیر است:

N   10000
P@1 0.915
R@1 0.915
Number of examples: 10000

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

%%time
!./fasttext supervised -input "/content/drive/My Drive/Colab Datasets/yelp_reviews_train_clean.txt" -output model_yelp_reviews -epoch 30 -lr 0.5

می توانید اعداد مختلف را امتحان کنید و ببینید آیا می توانید نتایج بهتری بگیرید. فراموش نکنید که نتایج خود را در نظرات به اشتراک بگذارید!

نتیجه

مدل FastText اخیراً در زمینه تعبیه کلمات و وظایف طبقه‌بندی متن به بهترین شکل به اثبات رسیده است روی بسیاری از مجموعه داده ها استفاده از آن در مقایسه با سایر مدل های جاسازی کلمه بسیار آسان و سریع است.

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

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



منتشر شده در 1403-01-20 16:33:09

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

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

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