Views
No views yet
1!pip install transformers==4.33
2
3from transformers import AutoModelForSeq2SeqLM, NllbTokenizer
4
5def create_tokenizer_with_new_langs(model_id, new_langs):
6 tokenizer = NllbTokenizer.from_pretrained(model_id)
7 for lang in new_langs:
8 old_len = len(tokenizer) - int(new_lang in tokenizer.added_tokens_encoder)
9 new_token_id = old_len - 1
10 if new_lang in tokenizer.added_tokens_encoder:
11 new_token_id = tokenizer.added_tokens_encoder[new_lang] - 1
12 tokenizer.lang_code_to_id[new_lang] = new_token_id
13 tokenizer.id_to_lang_code[new_token_id] = new_lang
14 # always move "mask" to the last position
15 tokenizer.fairseq_tokens_to_ids["<mask>"] = len(tokenizer.sp_model) + len(tokenizer.lang_code_to_id) + tokenizer.fairseq_offset
16
17 tokenizer.fairseq_tokens_to_ids.update(tokenizer.lang_code_to_id)
18 tokenizer.fairseq_ids_to_tokens = {v: k for k, v in tokenizer.fairseq_tokens_to_ids.items()}
19 if new_lang not in tokenizer._additional_special_tokens:
20 tokenizer._additional_special_tokens.append(new_lang)
21 # clear the added token encoder; otherwise a new token may end up there by mistake
22 tokenizer.added_tokens_encoder = {}
23 tokenizer.added_tokens_decoder = {}
24
25 return tokenizer
26
27def translate(
28 text,
29 tokenizer,
30 model,
31 src_lang='moo_Latn',
32 tgt_lang='deu_Latn',
33 a=32,
34 b=3,
35 max_input_length=1024,
36 num_beams=4,
37 **kwargs
38):
39 tokenizer.src_lang = src_lang
40 tokenizer.tgt_lang = tgt_lang
41 inputs = tokenizer(text, return_tensors='pt', padding=True, truncation=True, max_length=max_input_length)
42 result = model.generate(
43 **inputs.to(model.device),
44 forced_bos_token_id=tokenizer.convert_tokens_to_ids(tgt_lang),
45 max_new_tokens=int(a + b * inputs.input_ids.shape[1]),
46 num_beams=num_beams,
47 **kwargs
48 )
49 return tokenizer.batch_decode(result, skip_special_tokens=True)
50
51path = "CmdCody/nllb-deu-frr"
52tokenizer = create_tokenizer_with_new_langs(path, ['moo_Latn', 'wir_Latn'])
53model = AutoModelForSeq2SeqLM.from_pretrained(path)
54
55translate("Momme booget önj Naibel", tokenizer=tokenizer, model=model)| Bleu | ChrF++ | |
|---|---|---|
| Moo -> Deu | 55.78 | 70.73 |
| Deu -> Moo | 50.19 | 67.76 |
| Wir -> Deu | 67.22 | 80.16 |
| Deu -> Wir | 42.35 | 61.08 |