آموزش پردازش زبان طبیعی با اکوسیستم هاگینگ فیس ؛ ترنسفورمرها چه میکنند؟ (قسمت چهارم)
در این قسمت از دوره نگاهی خواهیم داشت به مدلهای ترنسفورمرها و کاربردهای آنها و همچنین از یکی از ابزارهای کتابخانه Transformers هاگینگ فیس به نام pipeline استفاده خواهیم کرد.
در این لینک میتوانید تمامی کدهای مربوط به بخش اول این دوره را مشاهده کنید. اگر میخواهید این کدها را در محیط خود اجرا کنید، پیشنهاد میکنیم قسمت دوم از این دوره آموزشی که در انتها لینک دسترسی به آن قرار داده شده، سری بزنید.
ترنسفورمرها همه جا هستند!
مدلهای ترنسفورمرها در حل انواع مسائل پردازش زبان طبیعی به کار گرفته میشوند. در زیر نام شماری از شرکتها که از هاگینگ فیس و مدلهای ترنسفورمرها استفاده میکنند و با به اشتراک گذاشتن مدلهای خود در انجمنها نیز فعالیت دارند را مشاهده میکنید:
کتابخانه ترنسفورمرها امکان ایجاد و استفاده از مدلهایی که این شرکتها به اشتراک میگذارند را فراهم میکند. Model Hub نیز شامل هزاران مدل آموزش دیده است که همه میتوانند آنها را بارگیری و استفاده کند. همچنین می توانید مدلهای خود را در این هاب بارگذاری کنید!
Hugging Face Hub محدود به مدلهای ترنسفورمرها نیست. همه میتواند هر نوع مدل یا دیتاستی که میخواهند را در آن به اشتراک بگذارند! با ثبت نام در huggingface.co از تمام ویژگیهای موجود بهرهمند خواهید شد!
پیش از بررسی نحوه کارکرد مدلهای ترانسفورمرها، بیایید چند مثال از روش استفاده از آنها در حل برخی از مسائل جالب در حوزه NLP ببنیم.
کار با Pipelineها
pipeline اصلیترین شی در کتابخانه ترنسفورمرها است. pipeline مدل را به مراحل پیشپردازش ها و پسپردازش های ضروری متصل میکند و به ما امکان میدهد هر متنی را به طور مستقیم وارد کنیم و پاسخی قابل قبول دریافت کنیم:
from transformers import pipeline classifier = pipeline("sentiment-analysis") classifier("I've been waiting for a HuggingFace course my whole life.")
[{'label': 'POSITIVE', 'score': 0.9598047137260437}]
میتوان بیش از یک جمله به این تابع داد:
classifier([ "I've been waiting for a HuggingFace course my whole life.", "I hate this so much!" ])
[{'label': 'POSITIVE', 'score': 0.9598047137260437}, {'label': 'NEGATIVE', 'score': 0.9994558095932007}]
pipeline به صورت پیشفرض یک مدل خاص و آموزشدیده که برای تحلیل احساسات به زبان انگلیسی تنظیم شده است را انتخاب میکند. هنگامی که شی classifier را ایجاد میکنید، مدل بارگیری و ذخیره میشود. اگر دستور را دوباره اجرا کنید، به جای آن از مدل ذخیرهشده استفاده میشود و نیازی به بارگیری مجدد مدل نیست.
وقتی متنی به تابع pipeline میدهید سه مرحله اصلی اتفاق میافتد:
- متن پیشپردازش میشود تا در قالبی که برای مدل قابل درک است، قرار گیرد.
- ورودیهای پیشپردازششده به مدل داده میشوند.
- پیشبینیهای مدل پس از پردازش انجام میشوند، بنابراین میتوانید آنها را درک کنید.
برخی از pipeline های موجود عبارتند از:
- feature-extraction (که بردار نگاشت متن را به عنوان ورودی میگیرد)
- fill-mask
- NER (named entity recognition)
- question-answering
- sentiment-analysis
- summarization
- text-generation
- translation
- zero-shot-classification
در ادامه برخی از pipeline ها را با جزییات بیشتر بررسی خواهیم کرد.
Zero-shot classification
در ادامه مسئلهای چالشبرانگیز را مطرح میکنیم که در آن باید متنهای بدون برچسب را دستهبندی کنیم. این سناریویی است که معمولاً در پروژههای واقعی نیز با آن مواجه میشویم زیرا حاشیهنویسی دادههای متنی معمولاً وقتگیر است و نیاز به تخصص در حوزه مربوطه دارد. Pipeline zero-shot-classification برای این مثال، Pipeline بسیار قدرتمندی است. با استفاده از این Pipeline میتوانید نوع برچسبها را برای دستهبندی مشخص کنید و بنابراین دیگر لازم نیست از برچسبهای مدل ازپیشآموزشدیده استفاده کنید. قبلاً دیدیم که یک مدل چطور با استفاده از دو برچسب، جملات را در دو دسته مثبت و منفی دستهبندی میکند. اما این مدل میتواند برای دستهبندی متن از برچسبهای دلخواه شما نیز استفاده کند.
from transformers import pipeline classifier = pipeline("zero-shot-classification") classifier( "This is a course about the Transformers library", candidate_labels=["education", "politics", "business"], )
{'sequence': 'This is a course about the Transformers library', 'labels': ['education', 'business', 'politics'], 'scores': [0.8445963859558105, 0.111976258456707, 0.043427448719739914]}
دلیل نامگذاری این Pipeline این است که برای استفاده از آن نیازی به تنظیم دقیق مدل روی داده ها نیست. zero-shot-classification می تواند به طور مستقیم مقادیر احتمال را برای لیست برچسبهای دلخواه شما به دست آورد!
Text generation
حال بیایید ببینیم چگونه میتوان از pipeline برای تولید متن استفاده کنیم. در این جا شما یک جمله ناقص به عنوان ورودی به مدل میدهید و مدل با تولید ادامه متن به صورت خودکار آن را کامل میکند. این کار مشابه ویژگی پیشبینی متن در گوشیهای هوشمند امروزی است. تولید متن عملی تصادفی است، بنابراین اگر با اجرای کد زیر به نتایج نمایش داده شده در خروجی ما نرسیدید، بدانید که کاملاً طبیعی است.
from transformers import pipeline generator = pipeline("text-generation") generator("In this course, we will teach you how to")
[{'generated_text': 'In this course, we will teach you how to understand and use ' 'data flow and data interchange when handling user data. We ' 'will be working with one or more of the most commonly used ' 'data flows — data flows of various types, as seen by the ' 'HTTP'}]
با اضافه کردن آرگومانی به نام num_return_sequences میتوانید تعداد جملاتی که باید تولید شوند را مشخص کنید. همچنین با استفاده از آرگومان max_length نیز میتوانید طول متن تولیدشده را تعیین نمایید.
سعی کنید با استفاده از آرگومانهای num_return_sequences و max_length کدی بنویسید که دو جمله 15 کلمهای تولید کند.
استفاده از مدلهای هاب در pipeline
در مثالهای قبلی از مدلهای پیشفرض برای حل مسئله استفاده کردیم، اما میتوان به جای این مدلهای پیشفرض، مدل خاصی را از هاب انتخاب کرد و در Pipeline یک مسئله مثل تولید متن به کار برد. به این منظور کافی است به Model Hub بروید و بر روی تگ مربوطه در سمت چپ کلیک کنید تا مدلهای مربوط به هر مسئله برای شما نمایش داده شوند.
بیایید مدل distilgpt2 را امتحان کنیم. در زیر نحوه بارگیری این مدل در همان Pipeline قبلی را مشاهده میکنید:
from transformers import pipeline generator = pipeline("text-generation", model="distilgpt2") generator( "In this course, we will teach you how to", max_length=30, num_return_sequences=2, )
[{'generated_text': 'In this course, we will teach you how to manipulate the world and ' 'move your mental and physical capabilities to your advantage.'}, {'generated_text': 'In this course, we will teach you how to become an expert and ' 'practice realtime, and with a hands on experience on both real ' 'time and real'}]
میتوانید با کلیک بر روی تگهای language ، مدلی را انتخاب کنید که متن را به زبان دلخواه شما تولید کند. Model Hub برای مدلهای چند زبانه، نقاط کنترلی دارد که از چندین زبان پشتیبانی میکنند.
پس از انتخاب مدل مدنظر خود میبینید که یک ابزارک وجود دارد که به شما امکان میدهد مدل را مستقیماً و به صورت آنلاین امتحان کنید. به این ترتیب میتوانید قبل از بارگیری مدل، قابلیتهای آن را بررسی کنید.
از فیلترهای مختلف برای یافتن مدل تولید متن به سایر زبانها استفاده کنید. با این ابزارک کار کنید و از آن در Pipeline خود استفاده کنید!
The Inference API
با استفاده از Inference API که در وبسایت هاگینگ فیس در درسترس است، میتوان همه مدلها را مستقیماً و در مرورگر آزمون کرد. در این صفحه میتوانید با وارد کردن متن دلخواه خود، نحوه پردازش دادههای ورودی توسط هر مدل را مشاهده کنید.
اگر Inference API مورد استفاده در این ابزارک را برای جریان کار خود نیاز دارید، میتوانید آن را از وبسایت هاگینگ فیس خریداری کنید.
Mask filling
Pipeline بعدی که به سراغ آن میرویم fill-mask است. مثال بعدی درباره پر کردن جاهای خالی درون متن است:
from transformers import pipeline unmasker = pipeline("fill-mask") unmasker("This course will teach you all about <mask> models.", top_k=2)
[{'sequence': 'This course will teach you all about mathematical models.', 'score': 0.19619831442832947, 'token': 30412, 'token_str': ' mathematical'}, {'sequence': 'This course will teach you all about computational models.', 'score': 0.04052725434303284, 'token': 38163, 'token_str': ' computational'}]
آرگومان top_k تعداد حدسهایی که میخواهید نمایش داده شوند را تعیین میکنید. توجه داشته باشید که در اینجا مدل جای کلمه <mask> را پر میکند که اغلب به آن mask token گفته میشود. سایر مدلهای mask-filling ممکن است توکنهای دیگری برای جای خالی متن داشته باشند، بنابراین بهتر است همیشه هنگام بررسی مدلهای دیگر، از کلمهای که برای بخش ماسک یا همان جای خالی استفاده میشود، اطمینان حاصل کنید. یکی از راههای بررسی کلمه ماسک، پیدا کردن نام مدل و کد آن در Inference API است.
مدل bert-base-cased را در هاب جستجو کرده و کلمه ماسک آن را در ابزارک Inference API پیدا کنید. این مدل چه کلمهای را در جمله موجود در مثال بالا پیشبینی میکند؟
Named entity recognition
تشخیص نام موجودیتها یا NER مسئلهای است که مدل در آن باید تشخیص دهد که هر قسمت از متن ورودی با کدامیک از موجودیتهای مختلف مانند اشخاص، مکانها یا سازمانها مطابقت دارد. بیایید یک مثال از این مسئله ببینیم:
from transformers import pipeline ner = pipeline("ner", grouped_entities=True) ner("My name is Sylvain and I work at Hugging Face in Brooklyn.")
[{'entity_group': 'PER', 'score': 0.99816, 'word': 'Sylvain', 'start': 11, 'end': 18}, {'entity_group': 'ORG', 'score': 0.97960, 'word': 'Hugging Face', 'start': 33, 'end': 45}, {'entity_group': 'LOC', 'score': 0.99321, 'word': 'Brooklyn', 'start': 49, 'end': 57} ]
در اینجا این مدل به درستی مشخص کرده است که کلمه Sylvain نام یک شخص (PER)، Hugging Face نام یک سازمان (ORG) و Brooklyn نام یک مکان (LOC) است.
ما آرگومان grouped_entities = True در تابع ایجاد Pipeline تعریف کردیم تا به Pipeline بگوییم که بخشهایی از جمله را که مربوط به یک موجودیت خاص هستند، با هم در یک گروه قرار دهد. در اینجا مدل “Hugging” و “Face” را به عنوان یک سازمان واحد به درستی گروهبندی کرده است. در حقیقت ، همانطور که در فصل بعدی خواهیم دید، در مرحله پیش پردازش بعضی از کلمات در جمله به قطعات کوچکتری نیز تقسیم میشوند. به عنوان مثال، نام Sylvain به چهار قطعه تقسیم میشود: S ، ##yl ، ##va ، و in##. اما همانطور که میبینید Pipeline در مرحله پساپردازش با موفقیت آن قطعات را دوباره گروهبندی کرده است.
در Model Hub دنبال مدلی بگردید که بتواند اجزای جمله یا نقش دستوری کلمات در جملات انگلیسی را (که به اختصار POS نامیده می شود) شناسایی و برچسبگذاری کند. این مدل برای کلمات به کار رفته در جمله بالا چه نقشهایی را پیشبینی میکند؟
پاسخ دادن به سوال
Pipeline question-answering با استفاده از اطلاعاتی که به آن داده میشود به سوالات پرسیدهشده پاسخ میدهد:
from transformers import pipeline question_answerer = pipeline("question-answering") question_answerer( question="Where do I work?", context="My name is Sylvain and I work at Hugging Face in Brooklyn" )
{'score': 0.6385916471481323, 'start': 33, 'end': 45, 'answer': 'Hugging Face'}
توجه داشته باشید که این Pipeline پاسخ را تولید نمیکند، بلکه تنها با استخراج اطلاعات از متن دادهشده به آن سوال پاسخ می دهد.
خلاصهنویسی
خلاصهنویسی در واقع عمل تبدیل متن به متنی کوتاهتر با حفظ تمام (یا اکثر) جنبههای مهم ذکر شده در آن متن است. در ادامه به بررسی یک مثال میپردازیم:
from transformers import pipeline summarizer = pipeline("summarization") summarizer(""" America has changed dramatically during recent years. Not only has the number of graduates in traditional engineering disciplines such as mechanical, civil, electrical, chemical, and aeronautical engineering declined, but in most of the premier American universities engineering curricula now concentrate on and encourage largely the study of engineering science. As a result, there are declining offerings in engineering subjects dealing with infrastructure, the environment, and related issues, and greater concentration on high technology subjects, largely supporting increasingly complex scientific developments. While the latter is important, it should not be at the expense of more traditional engineering. Rapidly developing economies such as China and India, as well as other industrial countries in Europe and Asia, continue to encourage and advance the teaching of engineering. Both China and India, respectively, graduate six and eight times as many traditional engineers as does the United States. Other industrial countries at minimum maintain their output, while America suffers an increasingly serious decline in the number of engineering graduates and a lack of well-educated engineers. """) [{'summary_text': ' America has changed dramatically during recent years . The ' 'number of engineering graduates in the U.S. has declined in ' 'traditional engineering disciplines such as mechanical, civil ' ', electrical, chemical, and aeronautical engineering . Rapidly ' 'developing economies such as China and India, as well as other ' 'industrial countries in Europe and Asia, continue to encourage ' 'and advance engineering .'}]
در این مسئله نیز همانند مسئله تولید متن، میتوانید حداکثر و حداقل طول متن خلاصهشده را به کمک آرگومانهای max_length و min_length تعیین کنید.
ترجمه
برای ترجمه یک متن میتوانید با ذکر جفت زبان مدنظر خود در نام مدل (برای مثال، “translation_en_to_fr”)، از مدل پیشفرض استفاده کنید. روش دیگر این است که از Model Hub مدل مدنظر خود را انتخاب کنید. در مثال زیر میخواهیم متنی فرانسوی را به انگلیسی ترجمه کنیم:
from transformers import pipeline translator = pipeline("translation", model="Helsinki-NLP/opus-mt-fr-en") translator("Ce cours est produit par Hugging Face.")
[{'translation_text': 'This course is produced by Hugging Face.'}]
در این مسئله نیز همچون مسائل تولید متن و خلاصهنویسی میتوانید حداکثر و حداقل طول متن خروجی را به کمک آرگومانهای max_length و min_length تعیین کنید.
مدلهای ترجمه برای زبانهای دیگر را نیز جستوجو کنید و سعی کنید جمله بالا را به چندین زبان دیگر نیز ترجمه کنید.
pipeline هایی که تا به اینجا دیدیم اغلب برای اهداف نمایشی به کار میروند. این pipeline ها تنها برای حل یک سری مسائل خاص برنامهنویسی شدهاند و نمیتوانند کار دیگری انجام دهند. این قسمت مربوط به عملکرد ترنسفورمرها بود و در قسمت بعدی، میبینیم در درون یک Pipeline چه خبر است و چطور میتوان رفتار آن را شخصیسازی کرد.
از طریق لینک زیر میتوانید به دیگر قسمتهای این دوره آموزشی دسترسی داشته باشید:
[button href=”https://hooshio.com/%D8%B1%D8%B3%D8%A7%D9%86%D9%87-%D9%87%D8%A7/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%BE%D8%B1%D8%AF%D8%A7%D8%B2%D8%B4-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B7%D8%A8%DB%8C%D8%B9%DB%8C/” type=”btn-default” size=”btn-lg”]آموزش پردازش زبان طبیعی[/button]