Гузариш ба мундариҷа
Мавзӯи 6 аз 6

Муайянкунандаи оҳанги шарҳҳо

Чаро тамоми конвейерро созем?

Як ҷавоби модел ҳанӯз хидмати тайёр нест. Барои таҳлили шарҳҳо пайванд бо сабтҳои аслӣ, омодасозии матн, коркарди тамоми маҷмӯъ ва нишон додани натиҷаҳо барои санҷиши ҳолатҳои баҳснок аз ҷониби инсон лозим аст. Хатои тартиб ҳатто бо кори дурусти шабака метавонад тамғаи манфиро ба шарҳи бегона нисбат диҳад.

Марҳилаҳоро ҷудо кунед: омодасозӣ, даъвати модел, ҷамъоварии натиҷаҳо ва ҳисобот. Он гоҳ додаҳои холиро бе боргирии вазнҳо санҷида, модели ҳақиқиро баъд пайваст мекунед. Мисолҳо усулҳои ҷудоро нишон медиҳанд; функсияҳои масъалаҳоро худатон менависед.

Блокҳо бо тартиб иҷро мешаванд. Барои намоиш BERT-и хурди наомӯхта бо вазнҳои сифрӣ истифода мешавад. Ҷавобҳои он шарҳҳои воқеиро арзёбӣ намекунанд.

1. Фосилаҳо ва сабтҳои холӣ

Меъёрӣ кардани фосилаҳо коркардро осон мекунад: split() бе аргумент фосила, tab ва гузариши сатрро мешиносад. Барои нишон додан ба корбар аслро алоҳида нигоҳ доред.

raw = '  Good\tservice!  '
parts = raw.split()
print(parts)
print(' '.join(parts))
print(bool('   '.split()))

Натиҷа:

['Good', 'service!']
Good service!
False

Натиҷаи холии split() сатри бемуҳтаворо нишон медиҳад. Аввал бинед, ки пас аз тозакунӣ чӣ монд, баъд дар бораи хориҷ кардани сабт қарор диҳед. Фишурдани фосилаҳо дарозиро тағйир медиҳад, бинобар ин тартиби тозакунӣ ва буридан муҳим аст.

Инкор ва китобатро бе зарурат нагиред: «писанд наомад» ва «писанд омад» маънои муқобил доранд. Тозакунии бештар на ҳамеша сифати беҳтар медиҳад.

2. Бастаҳо ва қисми охирини нопурра

Batch чанд матн барои коркарди якҷоя аст. Буриши рӯйхат дар канори рост бехатар аст: агар унсур камтар монда бошад, Python рӯйхати кӯтоҳ медиҳад. Ин шарҳҳои охиринро нигоҳ медорад.

texts = ['a', 'b', 'c', 'd', 'e']
print(texts[:2], texts[2:4], texts[4:6])
print(len(texts[4:6]))
print(texts[6:8])

Натиҷа:

['a', 'b'] ['c', 'd'] ['e']
1
[]

Панҷ унсур ду ҷуфти пурра ва як боқимонда медиҳад. Буриши холии баъди охирро ба модел фиристодан лозим нест. Барои маҷмӯи вурудии холӣ рафтори ҳисоботи холиро пешакӣ муайян кунед.

Андозаи баста ба хотира ва суръат таъсир мекунад. Матнҳои дарозиашон наздик padding-ро кам мекунанд. Бастаи калон метавонад ба GPU кумак кунад, вале CPU-ро суст ё хотираро пур кунад; андозаро бо ченкунӣ интихоб кунед.

3. Даъвати бастагии pipeline

Pipeline batch_size-ро дастгирӣ мекунад. Барои такрорпазирӣ гурӯҳбанди бозичавӣ месозем. Вазнҳо сифранд, ҳар ду синф 0.5 мегиранд ва ҳангоми баробарӣ аввалин интихоб мешавад.

import torch
from transformers import BertConfig, BertForSequenceClassification, BertTokenizer, pipeline

vocab = ['[PAD]', '[UNK]', '[CLS]', '[SEP]', '[MASK]', 'good', 'bad']
tok = BertTokenizer(vocab={t: i for i, t in enumerate(vocab)})
config = BertConfig(vocab_size=len(vocab), hidden_size=8, num_hidden_layers=1, num_attention_heads=2, intermediate_size=16, id2label={0: 'NEGATIVE', 1: 'POSITIVE'})
model = BertForSequenceClassification(config).eval()
with torch.no_grad():
    for parameter in model.parameters():
        parameter.zero_()
classify = pipeline('sentiment-analysis', model=model, tokenizer=tok, device=-1)
texts = ['good', 'bad', 'good good']
results = classify(texts, batch_size=2, truncation=True, max_length=8)
print([(i, r['label'], round(r['score'], 2)) for i, r in enumerate(results)])

Натиҷа:

[(0, 'NEGATIVE', 0.5), (1, 'NEGATIVE', 0.5), (2, 'NEGATIVE', 0.5)]

Рақамҳои 0, 1, 2 ба сатрҳои вурудӣ бо ҳамон тартиб мувофиқанд. Дар хидмат ID-и доимии шарҳро бо натиҷа нигоҳ доред. Агар тозакунӣ сабтҳоро хориҷ кунад, индексҳои кӯҳна дигар ҷавобро ба рӯйхати аслӣ дуруст намепайванданд.

truncation=True вурудро бо token маҳдуд мекунад. Дар масъалаҳо буридан бо аломат ҳам ҳаст: ин қоидаи дигари омодасозист. Ҳадди аломат ҷойи санҷиши шумораи token-ро намегирад.

4. Санҷиш пеш аз ҳисобот

Шумораи аломат ва token-ро бо шумули махсусҳо муқоиса мекунем. Эътимоди ҳамаи ҷавобҳои намунаро ҳам мебинем:

print([(i, len(text), len(tok(text)['input_ids'])) for i, text in enumerate(texts)])
print([round(r['score'], 2) for r in results])

Натиҷа:

[(0, 4, 3), (1, 3, 3), (2, 9, 4)]
[0.5, 0.5, 0.5]

Дарозии гуногуни аломатҳо метавонад шумораи яксони token диҳад. Баҳои 0.5 набудани афзалияти синфро нишон медиҳад, на сифати матн. Барои ҳисобот шумораи сабтҳои коркардшуда ва хориҷшуда, ҳадд ва мисолҳои санҷишӣ муфиданд.

Дар дохил чӣ мегузарад?

Конвейер сабтҳоро ба матни тоза, вуруди ададӣ, баҳо ва сатри ҳисобот табдил медиҳад. Padding дар дохили баста сохта мешавад, ниқоб attention-ро аз пуркунанда дур мекунад ва ҷавобҳо бо тартиб меоянд. Ҳар марҳила шартномаи равшани вуруд ва баромад мехоҳад, мисли иштирокчиёни эстафета.

Барои санҷиши сифат шарҳҳои тамғагузоришудаи забону мавзӯи худро гиред. Киноя, шарҳи омехта ва калимаҳои нодирро алоҳида омӯзед. Хатои боэътимод имконпазир аст: score рафтори моделро тавсиф мекунад, на ҳақиқатро кафолат медиҳад.

Хатоҳои маъмул

  • if not text пеш аз тозакунӣ сатри фосиладорро ғайрихолӣ мешуморад. Муҳтаворо баъди меъёрӣ кардан санҷед.
  • len(text) <= 512 шумораи иҷозатдодаи token-ро кафолат намедиҳад. Ҳадди tokenizer-и моделро истифода кунед.
  • results.append(classify(batch)) рӯйхати рӯйхатҳо месозад. Барои рӯйхати ҳамвор элементҳои бастаро илова кунед.
  • Ҷобаҷокунии results бе тағйири texts мувофиқатро мешиканад. Матн, ID ва ҷавобро якҷо гузаронед.
  • batch_size=1024 метавонад хотираро пур кунад. Аз хурд оғоз карда, вақт ва хотираро чен кунед.

Ёдномаи кӯтоҳ

Марҳила Чиро санҷем
Омодасозӣ фосила, сабти холӣ, нигоҳ доштани асл
Дарозӣ ҳадди гуногуни аломат ва token
Бастаҳо боқимонда, тартиб, хотира
Ҷавобҳо якто барои ҳар сабти нигоҳдошта
Ҳисобот ҳадд, набудани додаҳо, мисоли хато
Сифат забон, мавзӯъ, намунаи тамғагузоришуда

Дар бораи коркарди бастаҳо: ҳуҷҷатҳои pipeline.