多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

PaddleNLP 词法分析(Lexical Analysis)实践指南:从 LAC 原理到训练、预测与部署

PaddleNLP 词法分析(Lexical Analysis)实践指南:从 LAC 原理到训练、预测与部署 人工智能大模型NLP深度学习预训练微调RLHF模型量化【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载导读词法分析Lexical Analysis是自然语言处理NLP的基石任务之一它把连续的中文文本切分为词语序列并标注每个词的词性与专名类别是分词、词性标注、命名实体识别等下游应用的基础能力。本文以 PaddleNLP 开源仓库中的 Lexical Analysis 教程 为骨架结合仓库内 词法分析示例工程、Taskflow 一键预测实现 与 BiGruCrf 模型源码系统讲解词法分析的任务定义、GRUCRF 序列标注原理、数据格式与标签体系、从单卡/多卡训练到评估、模型导出、部署预测再到 Taskflow 一键调用的完整实战链路帮助读者掌握一套可复现、可定制的中文词法分析方案。词法分析任务概述在编译原理中词法分析Lexical Analysis是将字符序列转换为词法单元token序列的过程是编译的第一阶段在自然语言处理中它同样是基础中的基础——中文没有天然的空格分词必须由词法分析器完成切词 打标两项工作。文档将词法分析的主要任务归纳为四类Tokenization分词将连续字符序列切分为有意义的词Removing whitespace/comments去除空白与注释过滤无信息量的噪音字符Tracking line numbers追踪行号在代码分析场景记录 token 的原始位置Generating symbol tables生成符号表为编译器/解释器维护标识符等符号信息。其抽象数学表示为$$ T Lex(S) $$其中 $S$ 是输入字符串$T$ 是输出的 token 序列。在 PaddleNLP 的中文 NLP 场景下这条从字符串到 token 序列的映射具体落地为输入一句中文输出该句的切分结果segs与每个词的词性/专名标签tags。中文词法分析的建模方式GRU CRF 序列标注在 NLP 中词法分析通常被建模为**序列标注Sequence Labeling**问题为输入句子的每个字打上一个标签标签的-BBegin/-IInside后缀组合即可还原词边界与词类别。PaddleNLP 仓库中 词法分析示例工程 采用经典做法——两层双向 GRU 学习特征 一层 CRF 解码完成序列标注。从 模型实现源码 可以看出完整的数据流def forward(self, inputs, lengths, labelsNone): word_embed self.word_embedding(inputs) # 1. 字 id - 字向量 bigru_output, _ self.gru(word_embed, sequence_lengthlengths) # 2. 双向 GRU 特征 emission self.fc(bigru_output) # 3. 线性层得到发射分数 if labels is not None: loss self.crf_loss(emission, lengths, labels) # 训练CRF 损失 return loss else: _, prediction self.viterbi_decoder(emission, lengths) # 推理Viterbi 解码 return prediction对应文档中描述的四步建模流程输入 one-hot 化每个字以词典中的一个 id 表示字向量映射one-hot 序列通过字表nn.Embedding词向量维度emb_dim128转换为实向量表示的字向量序列双向 GRU 特征学习字向量序列作为输入送入nn.GRUnum_layers2directionbidirectional堆叠两层以增强学习能力得到融合上下文的新特征序列CRF 序列标注CRF 以 GRU 输出经线性层fc输入维度hidden_size*2得到的发射分数为输入以标记序列为监督信号完成序列标注推理时使用ViterbiDecoder全局搜索最优标签路径而不是逐位置独立取最大值从而显式建模标签间的转移约束如-B后面必须跟同类型的-I。模型关键超参数及源码默认值如下表参数默认值含义emb_dim128字向量word embedding维度hidden_size128单层 GRU 隐层节点数双向输出维度为 2×emb_lr2.0Embedding 层学习率缩放系数crf_lr0.2CRF 层学习率缩放系数init_bound0.1参数 Uniform 初始化的上下界with_start_stop_tagTrue是否启用 CRF 起止标签CRF 部分复用了 PaddleNLP 的 LinearChainCrf 与 LinearChainCrfLoss训练时计算 CRF 负对数似然损失推理时通过ViterbiDecoder求最优路径训练脚本中还使用 ChunkEvaluator见 train.py 中的chunk_evaluator ChunkEvaluator(label_listlabel_vocab.keys(), suffixTrue)按块统计 Precision / Recall / F1。数据准备下载示例数据与数据格式说明进入 slm/examples/lexical_analysis 目录执行以下命令即可下载并解压示例数据集对应 download.py其数据源为lexical_analysis_dataset_tiny.tar.gz小样本数据集python download.py --data_dir ./训练数据格式训练数据train.tsv/test.tsv除首行为固定的text_a\tlabel开头外其余每行由两列组成、以制表符分隔第一列utf-8 编码的中文文本字符之间以\002分割第二列每个字对应的标注同样以\002分隔。采用IOB2 标注体系X-B表示类型为 X 的词的开始X-I表示该词的持续O表示不关注的字在词性、专名联合标注中实际上不存在O。示例数据摘自 示例工程 README除\002了\002他\002续\002任\002十\002二\002届\002政\002协\002委\002员\002,\002马\002化\002腾\002,\002雷\002军\002,\002李\002彦\002宏\002也\002被\002推\002选\002为\002新\002一\002届\002全\002国\002人\002大\002代\002表\002或\002全\002国\002政\002协\002委\002员 p-B\002p-I\002r-B\002v-B\002v-I\002m-B\002m-I\002m-I\002ORG-B\002ORG-I\002n-B\002n-I\002w-B\002PER-B\002PER-I\002PER-I\002w-B\002PER-B\002PER-I\002w-B\002PER-B\002PER-I\002PER-I\002d-B\002p-B\002v-B\002v-I\002v-B\002a-B\002m-B\002m-I\002ORG-B\002ORG-I\002ORG-I\002ORG-I\002n-B\002n-I\002c-B\002n-B\002n-I\002ORG-B\002ORG-I\002n-B\002n-I从 数据读取源码 可以确认load_dataset按\t切分字序列与标签序列再用CHAR_DELIMITER \002拆分并断言二者长度一致convert_example通过word.dic/tag.dic/q2b.dic三个词典完成 token→id 转换超过max_seq_len默认 64的部分截断未登录字用OOV替换。词性 / 专名标签体系文档与示例 README 给出了完整的标签集合包含24 个词性标签小写字母和4 个专名类别标签大写字母标签含义标签含义标签含义标签含义n普通名词f方位名词s处所名词t时间nr人名ns地名nt机构名nw作品名nz其他专名v普通动词vd动副词vn名动词a形容词ad副形词an名形词d副词m数量词q量词r代词p介词c连词u助词xc其他虚词w标点符号PER人名LOC地名ORG机构名TIME时间需要注意人名、地名、机构名、时间四类存在两套标签PER/LOC/ORG/TIME与nr/ns/nt/t。被标注为第二套小写标签的词是模型判断为低置信度的人名、地名、机构名和时间词。开发者可以基于这两套标签在四个类别的准确率与召回率之间做出自己的权衡。模型训练单卡与多卡单卡训练在 slm/examples/lexical_analysis 目录下执行对应 train.pypython train.py \ --data_dir ./lexical_analysis_dataset_tiny \ --model_save_dir ./save_dir \ --epochs 10 \ --batch_size 32 \ --device gpu \ # --init_checkpoint ./save_dir/final各参数释义如下--data_dir数据集所在文件夹路径需包含train.tsv、test.tsv、word.dic、tag.dic、q2b.dic--model_save_dir训练期间模型保存路径--epochs训练迭代轮数默认 10--batch_size每次迭代每张卡上的样本数目--device训练设备gpu表示使用 GPUxpu表示使用百度昆仑卡cpu表示使用 CPUtrain.py 中实际限定为cpu/gpu--init_checkpoint模型加载路径通过设置该参数可启动增量训练。结合训练脚本源码还有一组常用超参数值得关注--base_lr基础学习率默认 0.001作用于全网络优化器为 Adam、--crf_lrCRF 层学习率比率默认 0.2对应模型构造参数crf_lrargs.crf_lr、--emb_dim词向量维度默认 128、--hidden_sizeGRU 隐层节点数默认 128、--max_seq_len最长序列字数默认 64、--logging_steps日志间隔默认 10、--save_steps保存 checkpoint 间隔默认 100、--do_eval是否边训练边评估默认 True。训练时每save_steps步保存一次model_{global_step}.pdparams并在评估 F1 超过历史最优时额外保存best_model.pdparams。多卡训练使用paddle.distributed.launch启动分布式训练python -m paddle.distributed.launch --gpus 0,1 train.py \ --data_dir ./lexical_analysis_dataset_tiny \ --model_save_dir ./save_dir \ --epochs 10 \ --batch_size 32 \ --device gpu \ # --init_checkpoint ./save_dir/final从 train.py 可以看到多卡支持的内在逻辑paddle.distributed.get_world_size()大于 1 时调用paddle.distributed.init_parallel_env()使用paddle.io.DistributedBatchSampler做分布式采样且仅rank 0的进程执行模型保存与评估。模型评估通过加载训练保存的模型对测试集进行验证对应 eval.pypython eval.py --data_dir ./lexical_analysis_dataset_tiny \ --init_checkpoint ./save_dir/model_100.pdparams \ --batch_size 32 \ --device gpu其中./save_dir/model_100.pdparams是训练过程中保存的参数文件请替换为实际得到的训练保存路径。评估基于ChunkEvaluator计算 Precision、Recall 与 F1日志形如eval precision: 0.xx, recall: 0.xx, f1: 0.xx具体实现见 train.py 中的evaluate函数eval.py与其同构。模型导出与部署预测动态图转静态图导出训练结束后可通过 export_model.py 将动态图参数导出为静态图参数python export_model.py --data_dir./lexical_analysis_dataset_tiny --params_path./save_dir/model_100.pdparams --output_path./infer_model/static_graph_params--params_path动态图训练保存的参数路径--output_path静态图参数导出路径。从源码看导出流程为加载word.dic与tag.dic重建BiGruCrfpaddle.load载入权重后经paddle.jit.to_static转换input_spec声明为[None, None]的int64token_ids与[None]的int64length最后paddle.jit.save保存静态图模型。Python 部署预测导出模型后即可用于部署deploy/predict.py 提供了 Python 部署预测示例。开启 PIRPaddlePaddle 3.0.0 默认python deploy/predict.py --model_fileinfer_model/static_graph_params.json --params_fileinfer_model/static_graph_params.pdiparams --data_dir lexical_analysis_dataset_tiny未开启 PIRpython deploy/predict.py --model_fileinfer_model/static_graph_params.pdmodel --params_fileinfer_model/static_graph_params.pdiparams --data_dir lexical_analysis_dataset_tiny模型预测对无标签数据可启动模型预测对应 predict.py读取infer.tsv并输出results.txtpython predict.py --data_dir ./lexical_analysis_dataset_tiny \ --init_checkpoint ./save_dir/model_100.pdparams \ --batch_size 32 \ --device gpu得到类似输出(大学, n)(学籍, n)(证明, n)(怎么, r)(开, v) (电车, n)(的, u)(英文, nz) (什么, r)(是, v)(司法, n)(鉴定人, vn)预测结果的组装逻辑位于 data.py 的 parse_result将模型输出的标签 id 序列还原为标签文本后按-B开头、O边界拼接字符还原词语并剥离-B/-I后缀得到词性/专名主类别最终得到(词, 标签)序列。Taskflow 一键预测与自定义模型开箱即用的一键调用如果不想走完整训练链路PaddleNLP 提供了 Taskflow 工具对输入文本进行一键分词与词性标注用法见 LacTask 实现 中的 usage 与 示例工程 READMEfrom paddlenlp import Taskflow lac Taskflow(lexical_analysis) lac(LAC是个优秀的分词工具) [{text: LAC是个优秀的分词工具, segs: [LAC, 是, 个, 优秀, 的, 分词, 工具], tags: [nz, v, q, a, u, n, n]}] lac([LAC是个优秀的分词工具, 三亚是一个美丽的城市]) [{text: LAC是个优秀的分词工具, segs: [LAC, 是, 个, 优秀, 的, 分词, 工具], tags: [nz, v, q, a, u, n, n]}, {text: 三亚是一个美丽的城市, segs: [三亚, 是, 一个, 美丽, 的, 城市], tags: [LOC, v, m, a, u, n]} ] 任务默认路径为$HOME/.paddlenlp/taskflow/lexical_analysis/lac/其中包含执行该任务所需的全部文件。从 源码 可以看到LacTask的resource_files_names声明了四个必需资源model_state.pdparams模型权重、tag.dic标签词典、q2b.dic全角/半角归一化词典、word.dic字词典首次调用时自动下载。预处理阶段_preprocess会先用q2b.dic将半角字符归一为全角再经word.dic转 idOOV作为未登录字 id推理时通过静态图 predictor 执行_run_model后处理_postprocess按-B/O边界还原词与标签并支持_auto_splitter对超长文本自动切分_max_seq_len 512、_auto_joiner拼接回原始输入。LacTask还支持batch_size、num_workers、split_sentence等 kwargs 参数。通过 Taskflow 加载自定义模型如果希望得到定制化的分词及标注结果可以通过 Taskflow 加载自定义词法分析模型进行预测用model_path指定用户自定义路径示例 README 中写作task_path自定义路径下的文件需与默认路径一致custom_task_path/ ├── model.pdparams ├── word.dic ├── tag.dic └── q2b.dic加载并预测from paddlenlp import Taskflow my_lac Taskflow(lexical_analysis, model_path./custom_task_path/)同时LacTask.__init__还支持user_dict参数配合 Customization 工具 实现用户自定义词典的强制切分_custom.load_customization(self._user_dict)后在后处理阶段parse_customization修正切分与标注。更多 Taskflow 用法可参考 Taskflow 文档。预训练模型参考如需直接使用已经预训练好的 LAC 模型完成词法分析任务可参考 Lexical Analysis of Chinese 与 PaddleHub 分词模型lac而 PaddleNLP 仓库内的 Taskflowlexical_analysis任务即内置了 LAC 预训练权重模型资源定义开箱即用。小结本文以 PaddleNLP 的 Lexical Analysis 教程 为主线完整串联了中文词法分析从任务定义、GRUCRF 建模原理到数据准备、标签体系、单卡/多卡训练、评估、动态图转静态图导出、部署预测、Taskflow 一键调用与自定义模型加载的端到端流程。读者既可以通过 slm/examples/lexical_analysis 示例工程从零训练自己的词法分析模型也可以借助 Taskflow 一键预测 在几行代码内完成中文分词与词性标注或基于自定义词典与自定义模型获得完全可控的切分与标注结果。赞分享人工智能大模型NLP深度学习预训练微调RLHF模型量化【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载相关推荐OpenDisplay网络安全加固UDP 9001、Bonjour暴露面与防火墙配置完整指南OpenDisplay网络安全加固UDP 9001、Bonjour暴露面与防火墙配置完整指南 OpenDisplay 是一款免费开源的 Sidecar / D音视频桌面应用【亲测免费】 LAC (Lexical Analysis for Chinese) 安装与使用指南LAC Lexical Analysis for Chinese 安装与使用指南 1. 项目目录结构及介绍 在解压或克隆完成 LAC https://githuNLP10分钟搞懂AISystem量化训练(QAT)从原理到部署实践10分钟搞懂AISystem量化训练 QAT 从原理到部署实践 你还在为模型部署时精度下降发愁想让INT8模型达到FP32性能却不知从何入手本文将详解AI文档教程人工智能上一篇3行代码实现智能检索FlagEmbedding多模态嵌入模型实践指南下一篇GitHub_Trending/stoc/stock前端组件库量化界面开发必备工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表