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
8from sudachipy import tokenizer
9from sudachipy import dictionary
10import textspan
11
12class SudachiPreTokenizer:
13 def __init__(self, mecab_dict_path: Optional[str] = None):
14 self.sudachi = dictionary.Dictionary().create()
15
16 def tokenize(self, sequence: str) -> list[str]:
17 return [token.surface() for token in self.sudachi.tokenize(sequence)]
18
19 def custom_split(self, i: int, normalized_string: NormalizedString) -> list[NormalizedString]:
20 text = str(normalized_string)
21 tokens = self.tokenize(text)
22 tokens_spans = textspan.get_original_spans(tokens, text)
23 return [normalized_string[st:ed] for cahr_spans in tokens_spans for st,ed in cahr_spans]
24
25 def pre_tokenize(self, pretok: PreTokenizedString):
26 pretok.split(self.custom_split)
27
28# load a pre-tokenizer
29pre_tokenizer = SudachiPreTokenizer()
30
31# load a tokenizer
32dict_path = /path/to/sudachi_unigram.json
33tokenizer = Tokenizer.from_file(dict_path)
34tokenizer.post_processor = BertProcessing(
35 cls=("[CLS]", tokenizer.token_to_id('[CLS]')),
36 sep=("[SEP]", tokenizer.token_to_id('[SEP]'))
37)
38
39# convert to PreTrainedTokenizerFast
40tokenizer = PreTrainedTokenizerFast(
41 tokenizer_object=tokenizer,
42 unk_token='[UNK]',
43 cls_token='[CLS]',
44 sep_token='[SEP]',
45 pad_token='[PAD]',
46 mask_token='[MASK]'
47)
48
49# set a pre-tokenizer
50tokenizer._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_sudachi-unigram")