Knaph

توکن‌ها5 از 37

بریدنِ متن به توکن

اختیاری، برای کسانی که کمی پایتون بلدند.

در درس «متن، تکه‌تکه» دیدید که یک توکن‌ساز متن را با یک واژگانِ ثابت به تکه‌ها می‌بُرد. اینجا یک توکن‌سازِ کوچک می‌نویسید.

توکن‌سازهای واقعی روشِ هوشمندانه‌تری دارند، ولی ساده‌ترین روشی که کار می‌کند بلندترین تطبیقِ حریصانه (greedy longest match) است: از اولِ متن شروع کنید، بلندترین تکه‌ای از واژگان را بردارید که متن با آن شروع می‌شود، و از درست بعد از آن ادامه دهید. اگر هیچ تکه‌ای از واژگان جور نشد، یک حرف را به‌تنهایی بردارید، تا هر متنی همیشه قابلِ بریدن باشد.

برای نمونه، با واژگانِ st، straw، raw و berry، کلمه‌ی strawberry می‌شود straw|berry: در اولِ کلمه هم st جور است و هم straw، و straw بلندتر است.

ورودی

اول واژگان می‌آید، هر تکه در یک خط، بعد خطی با ---، و بعد متن‌ها، هر کدام در یک خط. در واژگان، خطِ زیرین _ به جای فاصله است، پس _cat یعنی تکه‌ی « cat» با فاصله‌ی پیش از آن، همان‌طور که توکن‌سازهای واقعی فاصله را نگه می‌دارند.

The
_cat
_sat
---
The cat sat

خروجی

کدِ آغازین خودش ورودی را می‌خواند و برای هر متن، تکه‌هایش را با | به هم وصل می‌کند (فاصله‌ها به شکلِ _) و تعدادِ توکن‌ها را چاپ می‌کند:

The|_cat|_sat (3 tokens)

کارِ شما نوشتنِ تابعِ tokenize(text, vocab) است، که در آن vocab مجموعه‌ای از رشته‌هاست (با فاصله‌های واقعی). فهرستِ تکه‌ها را برگردانید.

راهنمایی. یک جایگاه i نگه دارید. در هر گام، طول‌ها را از بلندترینِ ممکن تا ۱ امتحان کنید و ببینید text[i:i + n] در vocab هست یا نه. حواستان باشد با واژگانِ خالی چه می‌شود: هر حرف یک توکنِ جداست.

ورود برای امتحان این تمرین.