Views
No views yet
dict_path.1from typing import Optional
2
3from tokenizers import Tokenizer, NormalizedString, PreTokenizedString
4from tokenizers.processors import BertProcessing
5from tokenizers.pre_tokenizers import PreTokenizer
6from transformers import PreTrainedTokenizerFast
7
8import vaporetto
9import textspan
10
11class VaporettoPreTokenizer:
12 def __init__(self, unidic_path: str):
13 with open(unidic_path, 'rb') as fp:
14 model = fp.read()
15 self.tokenizer = vaporetto.Vaporetto(model, predict_tags=False)
16
17 def tokenize(self, sequence: str) -> list[str]:
18 tokens = self.tokenizer.tokenize(sequence)
19 return [token.surface() for token in tokens]
20
21 def custom_split(self, i: int, normalized_string: NormalizedString) -> list[NormalizedString]:
22 text = str(normalized_string)
23 tokens = self.tokenize(text)
24 tokens_spans = textspan.get_original_spans(tokens, text)
25 return [normalized_string[st:ed] for cahr_spans in tokens_spans for st,ed in cahr_spans]
26
27 def pre_tokenize(self, pretok: PreTokenizedString):
28 pretok.split(self.custom_split)
29
30# load a pre-tokenizer
31pre_tokenizer = VaporettoPreTokenizer("/path/to/bccwj-suw+unidic+tag.model.zst")
32
33# load a tokenizer
34dict_path = /path/to/vaporetto_bpe.json
35tokenizer = Tokenizer.from_file(dict_path)
36tokenizer.post_processor = BertProcessing(
37 cls=("[CLS]", tokenizer.token_to_id('[CLS]')),
38 sep=("[SEP]", tokenizer.token_to_id('[SEP]'))
39)
40
41# convert to PreTrainedTokenizerFast
42tokenizer = PreTrainedTokenizerFast(
43 tokenizer_object=tokenizer,
44 unk_token='[UNK]',
45 cls_token='[CLS]',
46 sep_token='[SEP]',
47 pad_token='[PAD]',
48 mask_token='[MASK]'
49)
50
51# set a pre-tokenizer
52tokenizer._tokenizer.pre_tokenizer = PreTokenizer.custom(pre_tokenizer)1# Test
2test_str = "こんにちは。私は形態素解析器について研究をしています。"
3tokenizer.convert_ids_to_tokens(tokenizer(test_str).input_ids)
4# -> ['[CLS]','こん','にち','は','。','私','は','形態','素','解析','器','に','つい','て','研究','を','し','て','い','ます','。','[SEP]']1from transformers import AutoModelForMaskedLM
2model = AutoModelForMaskedLM.from_pretrained("hitachi-nlp/bert-base_vaporetto-bpe")