Токенизатсия
Чаро токенизатсия лозим аст?
Шабакаи нейронӣ бо ададҳо ҳисоб мекунад ва сатри Python-ро мустақим намегирад. Токенизатсия матнро ба пайдарпайии унсурҳои луғат ва рақамҳои онҳо табдил медиҳад. Аз ин вобаста аст, ки модел кадом калимаҳоро фарқ мекунад ва дархост чӣ қадар ҷой мегирад.
Token ҳатман як калима нест: он калима, пораи калима ё аломати китобат буда метавонад. Калимаи нав аз қисмҳои шинос бе сабти алоҳида дар луғат сохта мешавад. Ин ҷо WordPiece истифода мешавад, вале моделҳои дигар метавонанд алгоритму аломатҳои дигар дошта бошанд.
Блокҳоро бо тартиб дар як раванд иҷро кунед. Луғат қасдан хурд ва англисӣ аст: рақамҳоро дастӣ санҷидан мумкин аст ва боргирии файл лозим нест.
1. Луғат ва пораҳои калима
Луғат token-ро ба рақами бутун мепайвандад. Дар WordPiece пешванди ## идомаи калимаро нишон медиҳад. [UNK] ҷойи калимаеро мегирад, ки tokenizer онро аз қисмҳои маълум сохта натавонист.
from transformers import BertTokenizer
vocab = ['[PAD]', '[UNK]', '[CLS]', '[SEP]', '[MASK]', 'a', 'book', 'read', '##ing', '!']
tok = BertTokenizer(vocab={t: i for i, t in enumerate(vocab)})
print(tok.tokenize('Reading!'))
print(tok.tokenize('robot'))
Натиҷа:
['read', '##ing', '!']
['[UNK]']
Reading ба ҳарфҳои хурд табдил ёфта, ба read ва ##ing ҷудо мешавад; аломати хитоб алоҳида аст. Барои robot қисмҳои мувофиқ нестанд. Иловаи token ба луғат худ аз худ маънои онро ба модел намеомӯзонад: модел ва tokenizer бояд мувофиқ бошанд.
2. Рақамҳо ва token-ҳои махсус
tokenize пораҳои матнро нишон медиҳад, tok(...) вуруди моделро месозад. Барои як матн BERT ба оғоз [CLS] ва ба анҷом [SEP] илова мекунад. Рақамҳо аз луғати мо вобастаанд ва умумӣ нестанд.
enc = tok('a book')
print(enc['input_ids'])
print(tok.convert_ids_to_tokens(enc['input_ids']))
Натиҷа:
[2, 5, 6, 3]
['[CLS]', 'a', 'book', '[SEP]']
[CLS] мавқеи оғозии намояндагии пайдарпайӣ аст ва [SEP] сарҳадро нишон медиҳад. Дар лоиҳаи воқеӣ AutoTokenizer.from_pretrained-ро аз ҳамон модели вазнҳо гиред. Рақами яксон дар луғати дигар метавонад калимаи дигар бошад.
3. Бастаи росткунҷа ва ниқоб
Tensor массиви бисёрченака аст. Ҳар сатри вуруди баста бояд дарозии яксон дошта бошад. padding=True сатрҳои кӯтоҳро то дарозтарини баста пур мекунад. attention_mask мавқеъҳои ҳақиқиро, аз ҷумла token-ҳои махсусро, бо як ва пуркунандаҳои [PAD]-ро бо сифр нишон медиҳад.
enc = tok(['a book', 'book'], padding=True, return_tensors='pt')
print(enc['input_ids'].tolist())
print(enc['attention_mask'].tolist())
print(list(enc['input_ids'].shape))
Натиҷа:
[[2, 5, 6, 3], [2, 6, 3, 0]]
[[1, 1, 1, 1], [1, 1, 1, 0]]
[2, 4]
Шакли [2, 4] ду матни ҳар кадом чормавқеиро ифода мекунад. Ниқобро якҷо бо input_ids диҳед: танҳо рақами [PAD] ҷойи онро намегирад. return_tensors="pt" tensor-ҳои PyTorch месозад; бе он одатан рӯйхатҳо бармегарданд.
4. Маҳдуд кардани дарозӣ
Truncation token-ҳои зиёдатиро мебурад. max_length тамоми вурудро бо мавқеъҳои махсус мешуморад. Ин шумораи token аст, на аломат. Барои матни дароз пешакӣ муайян кунед, ки кадом иттилоотро гум кардан мумкин аст.
enc = tok('a book a book', truncation=True, max_length=4)
print(tok.convert_ids_to_tokens(enc['input_ids']))
print(tok.decode(enc['input_ids'], skip_special_tokens=True))
Натиҷа:
['[CLS]', 'a', 'book', '[SEP]']
a book
Ду ҷой аз чор ҷойро [CLS] ва [SEP] гирифтанд. padding=True танҳо ҳеҷ чизро намебурад. Барои паҳнои собит padding="max_length" истифода мешавад; ҳадди контекстро аз модели мушаххас фаҳмед, на ин ки барои ҳама 512 ҳисоб кунед.
5. Бозгашт ба матни хонданӣ
Decode сатрро аз рақамҳо барқарор ва пораҳои калимаро пайваст мекунад. Дар матни барои корбар token-ҳои махсусро одатан пинҳон мекунанд.
ids = tok('Reading!')['input_ids']
print(tok.decode(ids))
print(tok.decode(ids, skip_special_tokens=True))
Натиҷа:
[CLS] reading! [SEP]
reading!
decode мувофиқати байт ба байтро бо асл кафолат намедиҳад: ин ҷо андозаи ҳарфҳо ва баъзе фосилаҳо дигар шуданд. skip_special_tokens=True инчунин [UNK]-ро хориҷ мекунад, зеро он token-и махсус аст; калимаи гумшуда барқарор намешавад.
Дар дохил чӣ мегузарад?
Ин tokenizer-и BERT аввал матнро меъёрӣ карда, китобатро ҷудо мекунад. Сипас WordPiece пораҳои маълумро ёфта, рақамҳоро мегузорад ва мавқеъҳои махсусро илова мекунад. Баъд ниқоб, буридан ва пуркунӣ меоянд. Ин ба гузоштани бастаҳо дар қуттиҳои яксон монанд аст: padding ҷойи холӣ ва ниқоб муҳтаворо нишон медиҳад.
Хатоҳои маъмул
text.split()калимаиReading!-ро пурра мемонад. Барои token-ҳои модел tokenizer-ро истифода кунед.tok(texts, padding=True)матни дарозро маҳдуд намекунад.truncation=Trueваmax_lengthилова кунед.model(input_ids=enc["input_ids"])ниқоби бастаро гум мекунад. Вурудҳои мувофиқро боmodel(**enc)диҳед." ".join(tok.convert_ids_to_tokens(ids))пораҳои##ва аломатҳои махсусро мемонад. Барои матни хонданӣdecodeлозим аст.- Луғати бегона бо вазнҳои модел метавонад бе хатои Python натиҷаи бемаънӣ диҳад. Ҳардуро аз як checkpoint гиред.
Ёдномаи кӯтоҳ
| Амал | Натиҷа |
|---|---|
tokenize(text) |
пораҳои матн |
tok(text) |
рақамҳо, ниқобҳо ва вурудҳои дигар |
padding=True |
баробаркунӣ дар баста |
truncation=True |
иҷозати буридан |
return_tensors="pt" |
tensor-ҳои PyTorch |
decode(ids, skip_special_tokens=True) |
сатр бе token-ҳои махсус |