توکنسازی: شکستن متن به تکهها
جواب کوتاه
توکنسازی یعنی شکستن متن به تکههایی که مدل میشناسه. برنامهای که این کار رو میکنه، توکنساز، یه قانون ثابت داره و یه واژهنامه: فهرست تکهها با شمارههاشون. مثلا یه قانون ساده اینه که از اول متن، هر بار بلندترین تکهای که توی واژهنامه هست رو برداری. فاصلهها هم با یه نشونهی مخصوص نگه داشته میشن. اگه یه کلمه توی واژهنامه نباشه، به تکههای کوچیکتر و حتی حرف به حرف شکسته میشه؛ و چون هر حرفی آخرش چند بایته، هیچ متنی غیرممکن نیست. برعکسش هم سادهست: شمارهها رو توی واژهنامه پیدا میکنی و تکهها رو پشت هم میچسبونی.
دستگاه برش
توی درس توکن دیدیم مدل متن رو تکه تکه میبینه. ولی این تکهها رو کی میبره، و از کجا میدونه کجا ببره؟ برای اینکه دقیق ببینیم، برای این درس یه توکنساز کوچیک واقعی ساختیم:
توکنساز یه برنامهی جداست که قبل از خود مدل کار میکنه. دو تا چیز داره: یه واژهنامه، یعنی فهرست تکههایی که میشناسه با شمارهی هر کدوم، و یه قانون ثابت برای بریدن. متن رو میگیره و یه ردیف شماره تحویل میده.
واژهنامهی توکنساز ما ساختگی و خیلی کوچیکه، فقط ۲۲ تکه؛ یه توکنساز واقعی دهها یا صدها هزار تکه داره و ممکنه جور دیگهای ببره. ولی ایده همینه، و چیزهایی که توی تصویرها میبینید، خروجی واقعی همین توکنساز کوچیکه که با پایتون اجراش کردیم.
سه جور برش
پیش از اینکه سراغ جزئیات بریم، یه نگاه کلی: متن رو به سه جور میشه برید، و هر کدوم یه گیر داره.
برش کلمهای سادهترینه: هر کلمه یه توکن. گیرش اینه که کلمهها بیانتهان، و هر کلمهی تازه یا هر شکل تازهی یه کلمه، مثل «کتابخونههامون»، ناشناخته میشه. برش حرفی برعکسه: هیچوقت ناشناخته نداره، ولی دنبالهها خیلی بلند میشن و مدل باید از حرفها، کلمهها رو خودش بسازه. برش زیرکلمهای (Subword) راه وسطه: کلمههای پرکاربرد یه تکهان و کلمههای کمکاربرد به چند تکهی آشنا شکسته میشن. ویکیپدیا میگه مدلهای زبانی امروز با روشهای زیرکلمهای مثل روش جفتهای پرتکرار (BPE) و WordPiece توکن میسازن.
چهار ایستگاه
توکنساز واقعی فقط یه برش نیست؛ متن از چهار ایستگاه رد میشه.
ایستگاه اول یکسان کردنه (Normalization): متن تمیز و یهدست میشه. مثلا حرفهای بزرگ انگلیسی کوچیک میشن، فاصلههای اضافه حذف میشن، و نویسههایی که شکلشون یکیه ولی کدشون فرق داره، یکی میشن؛ برای فارسی، همون «ي» عربی و «ی» فارسی که توی درس پردازش زبان طبیعی دیدیم. ایستگاه دوم پیشبرشه (Pre-tokenization): متن با فاصلهها و علامتها به «کلمه» شکسته میشه، تا هیچ توکنی از مرز دو کلمه رد نشه؛ بعضی توکنسازها عددها رو هم رقمبهرقم جدا میکنن.
ایستگاه سوم خود برشه، با واژهنامه و قانونی که توی همین درس دیدیم؛ این تنها ایستگاهیه که از متن آموزش یاد گرفته. سه روش رایجش BPE، WordPiece و Unigram هستن. ایستگاه چهارم توکنهای ویژه رو اضافه میکنه، مثل نشونهی شروع و پایان. موقع برگشت به متن هم همین مسیر برعکس طی میشه.
نشونهی فاصله
شاید توی تصویر دیدید بعضی تکهها یه خط کوچیک ▁ اولشون دارن. این نشونهی فاصله هست. توکنساز فاصلهها رو دور نمیریزه؛ چسبشون میکنه به اول کلمهی بعدی. پس «▁من» یعنی «من، با یه فاصله قبلش».
چرا؟ چون فاصله معنی داره. «می خورم» با «میخورم» فرق داره، و «من» اول یه کلمه با «من» وسط یه کلمه، مثل «دشمن»، یکی نیست. توکنسازهای واقعی هم هر کدوم یه نشونهی مخصوص برای این کار دارن. نتیجهش اینه که هیچچیز از متن گم نمیشه، و آخر کار میشه دقیقا همون متن رو برگردوند.
بلندترین تکه
قانون توکنساز ما خیلی سادهست: از اول متن، بلندترین تکهای که توی واژهنامه هست رو بردار؛ بعد از همونجا دوباره. ببینید با «من چای میخورم» چی کار میکنه:
اول «▁من» رو پیدا میکنه و برش میداره. بعد «▁چای». بعد میره سراغ «▁میخورم»؛ این کل کلمه توی واژهنامه نیست، پس کوتاهتر و کوتاهتر امتحان میکنه تا به «▁می» برسه که هست. بعد نیمفاصله، که توی واژهنامهی ما خودش یه تکهست. بعد «خورم» نیست ولی «خور» هست، و آخر «م». شش تکه.
توکنسازهای واقعی قانونهای زیرکانهتری دارن، و مهمتر از اون، واژهنامهشون رو هم خودشون از روی یه عالمه متن ساختن؛ طوری که تکههای پرکاربرد، تکههای بلندتری باشن. یکی از معروفترین روشهای ساختن این واژهنامه رو درس روش جفتهای پرتکرار نشون میده. ولی اصلش همینه: یه قانون ثابت و یه واژهنامهی ثابت. یه متن، هر بار، دقیقا همون تکهها رو میده.
کلمهی ناشناخته
حالا یه جمله که یه کلمهش توی واژهنامهی ما نیست:
«رو» توی واژهنامهی کوچیک ما نیست. توکنساز گیر نمیکنه و خطا هم نمیده؛ فقط تکهی کوچیکتر برمیداره: «ر» و بعد «و». حرفها همیشه توی واژهنامه هستن، پس هر کلمهای، حتی کلمهای که هیچوقت دیده نشده، بالاخره بریده میشه.
هزینهش اینه که اون کلمه تکههای بیشتری میشه، و مدل باید از چند تکهی کوچیک معنیش رو بسازه. برای همین کلمههایی که توکنساز کمتر دیده، مثل اسمهای نادر، یا کلمههای زبانهایی که واژهنامه کمتر براشون ساخته شده، تکههای بیشتری میشن. این یکی از دلیلهاییه که درس چرا فارسی توکن بیشتری میخواد بازش میکنه.
تا بایت
اگه یه حرف هم توی واژهنامه نباشه چی؟ مثلا یه حرف از یه زبان خیلی کمکاربرد، یا یه شکلک؟ بعضی توکنسازها یه پله پایینتر میرن:
کامپیوتر هر حرف رو با یک تا چهار بایت نگه میداره؛ یعنی هر حرف، آخرش یه ردیف کوتاه از عددهای کوچیکه. توی رایجترین روش نگه داشتن متن، حرفهای سادهی انگلیسی یه بایتان، حرفهای فارسی دو بایت، و یه شکلک چهار بایت. ما خودمون با پایتون شمردیمشون.
توکنسازهایی که تا بایت پایین میرن، همهی بایتهای ممکن رو هم توی واژهنامهشون دارن. پس هر چیزی که بشه نوشت، از هر زبانی، حتی با شکلک، بالاخره به تکههایی شکسته میشه که مدل میشناسه. هیچ متنی برای مدل «غیرممکن» نیست؛ فقط بعضی متنها تکههای خیلی بیشتری میشن.
برگشت به متن
مدل وقتی جواب میده، شماره تحویل میده، نه متن. پس یه کار برعکس هم لازمه:
کار برعکس خیلی سادهتره: هر شماره رو توی واژهنامه پیدا کن، تکهش رو بردار، و تکهها رو پشت هم بچسبون. هر جا نشونهی ▁ بود، یه فاصله بذار. همون «من چای میخورم» برمیگرده، بی یه حرف کم و زیاد.
همین کار، تکه به تکه و همزمان با ساختن جواب، انجام میشه؛ برای همین وقتی چتبات جواب میده، متن ذرهذره روی صفحه میاد. اگه توکنساز تا بایت پایین رفته باشه، ممکنه یه تکه فقط نصف یه حرف باشه؛ اون وقت باید صبر کرد تا بقیهی اون حرف هم برسه.
یه کلمه، چند برش
یه نکتهی جالب: یه کلمه معمولا بیشتر از یه برش درست داره.
«دانشگاهها» رو هم میشه «دانش، گاه، ها» برید، هم «دان، شگاه، ها»؛ هر دو از تکههای واژهنامه ساخته شدن. قانون «بلندترین تکه» همیشه یکی رو انتخاب میکنه. ولی یه پژوهش ۲۰۱۸ یه روش دیگه به اسم Unigram معرفی کرد که برای هر برش یه احتمال حساب میکنه، و پیشنهاد داد موقع آموزش، مدل یه جمله رو با برشهای مختلف ببینه؛ مثل یه جور نویز که مدل رو محکمتر میکنه. اون پژوهش گفت این کار مخصوصا وقتی داده کمه یا متن از یه حوزهی دیگهست، کمک میکنه.
یه پژوهش دیگهی ۲۰۱۸ هم ابزاری ساخت که توکنساز رو مستقیم از جملههای خام یاد میگیره، بی اینکه اول کسی کلمهها رو جدا کرده باشه، و به هیچ زبانی وابسته نیست؛ پژوهش اون رو روی ترجمهی انگلیسی و ژاپنی امتحان کرد؛ ژاپنی بین کلمههاش فاصله نمیذاره.
بی توکنساز
حالا یه سوال: اصلا لازمه متن رو برید؟
یه پژوهش ۲۰۲۱ مدلهایی ساخت که مستقیم با بایتها کار میکنن، بی هیچ توکنسازی. خوبیهاش اینه که هر زبانی رو از همون اول میخونه، جلوی غلط تایپی و متن نامرتب محکمتره، توی کارهایی که به املا و تلفظ ربط دارن بهتره، و دیگه اون چهار ایستگاه پیچیده و خطاپذیر رو لازم نداره. گیرش طول دنبالهست: «سلام دنیا» با هر حرف فارسی دو بایت، ۱۷ بایت میشه، در حالی که چند توکن بیشتر نیست؛ و مدل باید برای هر کدوم کار کنه. برای همین بیشتر مدلهای امروز هنوز توکنساز دارن.
چند نکته
- توکنساز ثابته. یه متن، هر بار، همون تکهها؛ هیچ قرعهای توش نیست.
- فاصله و نیمفاصله هم حساب میشن. «می خورم» و «میخورم» برای مدل دو چیز متفاوتن.
- کلمهی ناشناخته، تکهی بیشتر. اسمهای نادر و متنهای غیرانگلیسی معمولا گرونترن.
- هیچ متنی غیرممکن نیست. آخرش همهچیز بایته.
توی این درس واژهنامه رو دستی ساختیم. درس بعد نشون میده واژهنامهی واقعی رو چطور خودکار، از روی متن، میسازن: روش جفتهای پرتکرار.
جمعبندی. آنچه از این درس با خودتان میبرید.
- توکنساز: قانون ثابت + واژهنامه.
- فاصله با یه نشونه نگه داشته میشه.
- یه قانون ساده: بلندترین تکهی موجود.
- کلمهی ناشناخته: تکههای کوچیکتر، تا حرف و بایت.
- از شماره به متن، دقیق برمیگرده.
خودتون رو بسنجید
۱۵ پرسش، هر بار تازه از میان ۳۰ پرسش این درس. آخرش فقط کارنامه رو میبینید: چند تا درست، چند تا نادرست.