|
""" |
|
Do optional replace of bos/eos/pad/unk. |
|
|
|
Usage: |
|
python3 -m fastchat.data.optional_replace --in input.json --out output.json --model-name-or-path <your_token_path> |
|
|
|
Requirement: |
|
pip3 install transformers tqdm |
|
""" |
|
import argparse |
|
import json |
|
import traceback |
|
|
|
import transformers |
|
from tqdm import tqdm |
|
|
|
|
|
def replace_special_tokens( |
|
tokenizer: transformers.PreTrainedTokenizer, text: str |
|
) -> str: |
|
if not text: |
|
return text |
|
|
|
def _insert_vline(token: str) -> str: |
|
if len(token) < 2: |
|
return " " |
|
elif len(token) == 2: |
|
return f"{token[0]}|{token[1]}" |
|
else: |
|
return f"{token[:1]}|{token[1:-1]}|{token[-1:]}" |
|
|
|
if tokenizer.bos_token: |
|
text = text.replace(tokenizer.bos_token, _insert_vline(tokenizer.bos_token)) |
|
if tokenizer.eos_token: |
|
text = text.replace(tokenizer.eos_token, _insert_vline(tokenizer.eos_token)) |
|
if tokenizer.pad_token: |
|
text = text.replace(tokenizer.pad_token, _insert_vline(tokenizer.pad_token)) |
|
if tokenizer.unk_token: |
|
text = text.replace(tokenizer.unk_token, _insert_vline(tokenizer.unk_token)) |
|
return text |
|
|
|
|
|
def replace(conv, tokenizer): |
|
|
|
if tokenizer: |
|
try: |
|
for sentence in conv["conversations"]: |
|
sentence["value"] = replace_special_tokens(tokenizer, sentence["value"]) |
|
except Exception as e: |
|
traceback.print_exc() |
|
|
|
|
|
if __name__ == "__main__": |
|
parser = argparse.ArgumentParser() |
|
parser.add_argument("--in-file", type=str, required=True) |
|
parser.add_argument("--out-file", type=str) |
|
parser.add_argument( |
|
"--model-name-or-path", |
|
type=str, |
|
help="The directory or address where the model token is stored.", |
|
) |
|
args = parser.parse_args() |
|
|
|
in_file = args.in_file |
|
out_file = args.out_file |
|
tokenizer = None |
|
if args.model_name_or_path: |
|
tokenizer = transformers.AutoTokenizer.from_pretrained( |
|
args.model_name_or_path, |
|
trust_remote_code=True, |
|
use_fast=False, |
|
) |
|
|
|
if out_file is None: |
|
out_file = f"{in_file}_replace.json" |
|
|
|
content = json.load(open(in_file, "r")) |
|
|
|
for conv in tqdm(content): |
|
replace(conv, tokenizer) |
|
|
|
json.dump(content, open(out_file, "w"), indent=2, ensure_ascii=False) |
|
|