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 MeCab import Tagger
9import textspan
10
11class MecabPreTokenizer:
12 def __init__(self, mecab_dict_path: Optional[str] = None):
13 mecab_option = (f"-Owakati -d {mecab_dict_path}" if mecab_dict_path is not None else "-Owakati")
14 self.mecab = Tagger(mecab_option)
15
16 def tokenize(self, sequence: str) -> list[str]:
17 return self.mecab.parse(sequence).strip().split(" ")
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 tokenizer
29dict_path = /path/to/mecab_bpe.json
30tokenizer = Tokenizer.from_file(dict_path)
31# load a pre-tokenizer
32pre_tokenizer = MecabPreTokenizer()
33tokenizer.post_processor = BertProcessing(
34 cls=("[CLS]", tokenizer.token_to_id('[CLS]')),
35 sep=("[SEP]", tokenizer.token_to_id('[SEP]'))
36)
37# convert to PreTrainedTokenizerFast
38tokenizer = PreTrainedTokenizerFast(
39 tokenizer_object=tokenizer,
40 unk_token='[UNK]',
41 cls_token='[CLS]',
42 sep_token='[SEP]',
43 pad_token='[PAD]',
44 mask_token='[MASK]'
45)
46# set a pre-tokenizer
47tokenizer._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_mecab-bpe")