subword-nmt bpe 分词的使用

博客介绍了使用BPE分词来减小词表大小、减少未知词量的方法。包含安装步骤,通过sudo pip install subword - nmt进行安装,还给出设置词表大小、应用BPE分词及BPE的detoken等操作的具体命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了减小词表的大小,减少未知词(unk)的量,使用bpe分词:

安装:

1.sudo pip install subword-nmt
##设置词表大小3W,输入英文单语数据 train.en
2.subword-nmt learn-bpe -s 30000 < train.en > en.model
##应用BPE分词 -c 输入的词表,test.txt测试数据,并得到分词结果out.txt
3.subword-nmt apply-bpe -c en.model < test.txt > out.txt
#bpe的detoken
4.sed -r 's/(@@ )|(@@ ?$)//g' out.txt > out_detoken.txt

import os from tqdm import tqdm import xml.etree.ElementTree as ET from sacremoses import MosesTokenizer from pathlib import Path import argparse def moses_cut(in_file, out_file, lang): mt = MosesTokenizer(lang=lang) # 初始化分词器 out_f = open(out_file, "w", encoding="utf8") with open(in_file, "r", encoding="utf8") as f: for line in f.readlines():#每读取一行,进行分词,并写入一行到新的文件中 line = line.strip() if not line: continue cut_line = mt.tokenize(line, return_str=True) # 分词 out_f.write(cut_line.lower() + "\n") #变为小写,并写入文件 out_f.close() if __name__ == "__main__": parser = argparse.ArgumentParser() # 创建解析器 parser.add_argument( "-p", "--pair_dir", default=None, type=str, help="The directory which contains language pair files.", ) parser.add_argument( "-d", "--dest_dir", default=None, type=str, help="The destination directory to save processed train, dev and test file.", ) parser.add_argument("--src_lang", default="de", type=str, help="source language") parser.add_argument("--trg_lang", default="en", type=str, help="target language") args = parser.parse_args() # 解析参数,args是一个列表,包含了传递的参数值 if not args.pair_dir:#如果不传参,就抛异常 raise ValueError("Please specify --pair_dir") #判断args.dest_dir是否存在,不存在就创建 if not os.path.exists(args.dest_dir): os.makedirs(args.dest_dir) local_data_path = Path(args.pair_dir) # 获取本地数据路径 data_dir = Path(args.dest_dir) # 获取保存路径 # 分词 for mode in ["train", "val", "test"]: moses_cut( local_data_path / f"{mode}.{args.src_lang}", # 读取源语言文件 data_dir / f"{mode}_src.cut.txt", lang=args.src_lang, ) print(f"[{mode}] 源语言文本分词完成") moses_cut( local_data_path / f"{mode}.{args.trg_lang}", # 读取目标语言文件 data_dir / f"{mode}_trg.cut.txt", lang=args.trg_lang, ) print(f"[{mode}] 目标语言文本分词完成") 这是python代码,下面还有一段sh代码,请帮我详细分析一下:python data_multi30k.py --pair_dir $1 --dest_dir $2 --src_lang $3 --trg_lang $4 # 新建train_l文件,合并两个文件到一个文件 touch $1/train_l cat $2/train_src.cut.txt >> $1/train_l cat $2/train_trg.cut.txt >> $1/train_l # 生成词表,subword方式,统一用10000个subword subword-nmt learn-joint-bpe-and-vocab \ -i $1/train_l \ -s 20000 \ -o $1/bpe.20000 \ --write-vocabulary $1/vocab # 应用分词 for mode in train val test; do subword-nmt apply-bpe -c $1/bpe.20000 -i $2/${mode}_src.cut.txt -o $1/${mode}_src.bpe subword-nmt apply-bpe -c $1/bpe.20000 -i $2/${mode}_trg.cut.txt -o $1/${mode}_trg.bpe echo "Finished applying bpe to ${mode} files." done
03-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值