add tokenizer code
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
import sentencepiece as spm
|
||||
|
||||
###推荐使用 utils/spm_train_tokenizer.sh,使用多核加速
|
||||
|
||||
#英文分词器
|
||||
# corpus_path = 'a.txt,b.txt'
|
||||
corpus_path_en= 'corpus/pg16457.txt'
|
||||
vocab_size_en = 1000
|
||||
model_en= 'tokenizer_file/dolly_tokenizer_spm/tokenizer_en'
|
||||
|
||||
# model_type 使用 bpe
|
||||
model_type = 'bpe'
|
||||
# byte_fallback=True,避免 out of vocabulary 问题
|
||||
spm.SentencePieceTrainer.train(input=corpus_path_en, model_prefix=model_en,
|
||||
vocab_size=vocab_size_en, model_type=model_type, byte_fallback=True,character_coverage=1)
|
||||
|
||||
#中文分词器
|
||||
corpus_path_zh= 'corpus/wikipedia.txt'
|
||||
vocab_size_zh = 32000
|
||||
model_zh= 'tokenizer_file/dolly_tokenizer_spm/tokenizer_zh'
|
||||
spm.SentencePieceTrainer.train(input=corpus_path_zh, model_prefix=model_zh,
|
||||
vocab_size=vocab_size_zh, model_type=model_type, byte_fallback=True,character_coverage=1)
|
||||
@@ -0,0 +1,33 @@
|
||||
import sentencepiece as spm
|
||||
from sentencepiece import sentencepiece_model_pb2 as sp_model_pb2
|
||||
|
||||
model_file = "tokenizer_part/dolly_tokenizer_spm/tokenizer_zh.model"
|
||||
en_model_file = "tokenizer_part/dolly_tokenizer_spm/tokenizer_en.model"
|
||||
|
||||
model_file_new = "tokenizer_part/dolly_tokenizer_spm/tokenizer.model"
|
||||
|
||||
chinese_sp = spm.SentencePieceProcessor(model_file=model_file)
|
||||
en_sp = spm.SentencePieceProcessor(model_file=en_model_file)
|
||||
|
||||
print(chinese_sp.vocab_size())#32000
|
||||
|
||||
chinese_spm = sp_model_pb2.ModelProto()
|
||||
chinese_spm.ParseFromString(chinese_sp.serialized_model_proto())
|
||||
|
||||
en_spm = sp_model_pb2.ModelProto()
|
||||
en_spm.ParseFromString(en_sp.serialized_model_proto())
|
||||
|
||||
chinese_sp_set = set(p.piece for p in chinese_spm.pieces)
|
||||
|
||||
for p in en_spm.pieces:
|
||||
piece = p.piece
|
||||
if piece not in chinese_sp_set:
|
||||
chinese_sp_set.add(piece)
|
||||
new_piece = sp_model_pb2.ModelProto().SentencePiece()
|
||||
new_piece.piece = piece
|
||||
new_piece.score = 0
|
||||
chinese_spm.pieces.append(new_piece)
|
||||
|
||||
print(f"after expand vocab={len(chinese_spm.pieces)}") # 32361,增加361个
|
||||
with open(model_file_new, 'wb') as file:
|
||||
file.write(chinese_spm.SerializeToString())
|
||||
@@ -0,0 +1,18 @@
|
||||
from transformers import AutoTokenizer,XLMRobertaTokenizer
|
||||
#由spm转为hf_tokenizer
|
||||
tokenizer = XLMRobertaTokenizer.from_pretrained("tokenizer_file/dolly_tokenizer_spm/tokenizer.model")
|
||||
text = "A Frenchman from Paris"
|
||||
encoded_input = tokenizer.encode(text)
|
||||
print(encoded_input)
|
||||
decoded_output = tokenizer.decode(encoded_input)
|
||||
print(decoded_output)
|
||||
tokenizer.save_pretrained('tokenizer_file/dolly_tokenizer_hf')
|
||||
|
||||
#转换为常见的tokenzier.json格式
|
||||
tokenizer = AutoTokenizer.from_pretrained("tokenizer_file/dolly_tokenizer_hf")
|
||||
text = "A Frenchman from Paris"
|
||||
encoded_input = tokenizer.encode(text)
|
||||
print(encoded_input)
|
||||
decoded_output = tokenizer.decode(encoded_input)
|
||||
print(decoded_output)
|
||||
tokenizer.save_pretrained('tokenizer_file/dolly_tokenizer_hf2')
|
||||
@@ -0,0 +1,21 @@
|
||||
import sentencepiece as spm
|
||||
from sentencepiece import sentencepiece_model_pb2 as sp_model_pb2
|
||||
|
||||
sp = spm.SentencePieceProcessor(model_file='tokenizer_file/dolly_tokenizer_spm/tokenizer.model')
|
||||
print(sp.vocab_size()) # 32461
|
||||
|
||||
old_model = sp_model_pb2.ModelProto()
|
||||
old_model.ParseFromString(sp.serialized_model_proto())
|
||||
pieces = ['拉布拉多', '货拉拉', '拉不拉']
|
||||
existed_pieces = set(p.piece for p in old_model.pieces)
|
||||
for piece in pieces:
|
||||
if piece not in existed_pieces:
|
||||
existed_pieces.add(piece)
|
||||
new_piece = sp_model_pb2.ModelProto().SentencePiece()
|
||||
new_piece.piece = piece
|
||||
new_piece.score = 0
|
||||
old_model.pieces.append(new_piece)
|
||||
|
||||
print(len(old_model.pieces)) # 32461
|
||||
with open('tokenizer_file/dolly_tokenizer_spm/expand_tokenizer.model', 'wb') as f:
|
||||
f.write(old_model.SerializeToString())
|
||||
@@ -0,0 +1,15 @@
|
||||
import sentencepiece as spm
|
||||
sp = spm.SentencePieceProcessor(model_file='tokenizer_part/dolly-tokenizer/tokenizer.model')
|
||||
|
||||
sp_en= spm.SentencePieceProcessor(model_file='tokenizer_part/dolly-tokenizer/tokenizer_en.model')
|
||||
sentence = 'A Frenchman from Paris'
|
||||
pieces = sp.encode_as_pieces(sentence)
|
||||
pieces_en = sp_en.encode_as_pieces(sentence)
|
||||
print(pieces) # ['▁A', '▁F', 'ren', 'ch', 'man', '▁from', '▁P', 'ar', 'is']
|
||||
print(pieces_en) #'▁A', '▁F', 'ren', 'ch', 'man', '▁from', '▁P', 'aris'
|
||||
tokens = sp.encode(sentence)
|
||||
tokens_en = sp_en.encode(sentence)
|
||||
print(tokens) # [338, 493, 587, 349, 807, 429, 373, 279, 282]
|
||||
print(tokens_en) #364, 490, 5981, 398, 2036, 32046, 386, 9020]
|
||||
# 解码后的结果应等于编码前的输入
|
||||
# assert sp.decode(tokens) == sentence
|
||||
Reference in New Issue
Block a user