资讯动态

tfjs-examples 意图分类器:Snips NLU Benchmark 原始数据集的结构解析与使用指南

发布时间:2026/10/15 17:37:39 来源:尧图企业网站定制
示例工程【免费下载链接】tfjs-examplesExamples built with TensorFlow.js项目地址https://gitcode.com/gh_mirrors/tf/tfjs-examples点击查看免费下载导读在 TensorFlow.js 官方示例库 tfjs-examples 的 intent-classifier 子项目中训练数据直接取自 Snips 发布的 NLU Benchmark 数据集。本文围绕该数据集的原始 JSON 格式展开详细解析其分片文件结构、带实体标注的 clause 表示法、三大意图的数据统计并完整串联从原始 JSON 到 CSV / NDJSON 再到 Tensor 的训练数据流水线。读完本文你将掌握该示例项目数据层的完整工作原理并能在本地复现从原始数据到模型训练的每一个命令。数据来源与学术背景intent-classifier/training/data/raw/README.md 明确指出intent-classifier项目使用的数据来源于 Snips 的 nlu-benchmark 仓库。对应的学术引用为A. Coucke et al., Snips Voice Platform: an embedded Spoken Language Understanding system for private-by-design voice interfaces, arXiv:1805.10190 [cs], May 2018.这篇论文描述了一个面向隐私优先private-by-design的嵌入式语音界面所设计的 SLUSpoken Language Understanding口语理解系统。而 nlu-benchmark 正是该工作中公开的自然语言理解评测数据集它按意图intent与槽位slot / entity组织标注数据被广泛用于意图识别intent classification与槽位填充slot filling / token tagging两类任务的基准测试。在该示例中数据被用来训练两类模型详见 intent-classifier/README.md意图分类器intent classifier将用户查询分类到 AddToPlaylist、GetWeather、PlayMusic 三个意图之一Token Tagger槽位标注器识别天气类查询中与地点相关的 token。注意本仓库为只读仓库数据文件仅用于查看、分析与复现训练流程不涉及任何修改操作。原始数据在仓库中的位置原始 JSON 文件存放在 intent-classifier/training/data/raw/ 目录下共三个文件文件意图键样本数train_AddToPlaylist_full.jsonAddToPlaylist1942train_GetWeather_full.jsonGetWeather2000train_PlayMusic_full.jsonPlayMusic2000三个文件合计约 5942 条标注样本该数字由对仓库实际文件逐条统计得出。文件名中的_full表示该文件包含该意图的完整训练集train_前缀则表明它是官方划分的训练子集。原始 JSON 的顶层结构每个 JSON 文件的顶层是一个对象对象的唯一键即意图名intent值是该意图下的样本数组。整体结构为{ GetWeather: [ { data: [ { text: What will the weather be }, { text: this year, entity: timeRange }, { text: in }, { text: Horseshoe Lake State Fish and Wildlife Area, entity: geographic_poi }, { text: ? } ] } ] }data 字段clause 数组每条样本的核心字段是data它是一个由若干 clause片段组成的数组。每个 clause 有两种形态纯文本片段仅有text字段表示这句自然语言中不含任何槽位的部分带实体标注的片段同时包含text与entity字段其中text是被标注槽位的文本内容entity是该槽位的语义类别slot label。例如上面的GetWeather样本完整句子为What will the weather be this year in Horseshoe Lake State Fish and Wildlife Area?其中this year被标注为timeRange时间范围Horseshoe Lake State Fish and Wildlife Area被标注为geographic_poi地理兴趣点。clause 的拼接规则重建完整查询从源码 raw_to_csv.js 可以看到parseRecords函数遍历每条样本的data数组将所有 clause 的text依次拼接memo.concat(curr.text)即得到完整的用户查询文本const queryText data.reduce((memo, curr) { return memo.concat(curr.text); }, );然后将{query, intent}作为一条记录收集。这一拼接规则同样适用于 token tagger 的数据流水线见下文raw_to_tagged_tokens.js。各意图的实体entity分布对仓库中三个原始文件逐条统计 clause 级别的实体出现次数可得到以下分布AddToPlaylist1942 条playlist1943 次、playlist_owner1113 次、music_item889 次、artist739 次、entity_name594 次。GetWeather2000 条city851 次、country500 次、condition_temperature476 次、condition_description454 次、state493 次、geographic_poi291 次、current_location273 次、spatial_relation209 次、timeRange1047 次。PlayMusic2000 条artist1172 次、music_item792 次、service762 次、year635 次、sort347 次、album177 次、playlist149 次、genre144 次、track211 次。这些实体正是意图分类与槽位填充任务标注的语义槽位。从实体分布可以看出天气类查询在槽位设计上比播放列表/音乐类查询更为多样这也是项目单独为天气数据训练 token tagger 的原因之一。两条数据流水线从原始 JSON 到模型输入package.json 中定义了四个数据处理脚本与一个一键聚合脚本。它们分别服务于意图分类器和token tagger两条流水线脚本命令底层文件服务对象输出yarn raw-to-csvtraining/raw_to_csv.js意图分类器training/data/intents.csvyarn csv-to-tensorstraining/csv_to_tensors.js意图分类器intents_as_tensors.jsonintent_metadata.jsonyarn raw-to-tagged-tokenstraining/raw_to_tagged_tokens.jstoken taggerintents_tagged_tokens.ndjsonyarn tokens-to-embeddingstraining/tokens_to_embeddings.jstoken taggertoken_embeddings.ndjson执行yarn prep-data等价于npm-run-all raw-to-csv csv-to-tensors raw-to-tagged-tokens tokens-to-embeddings可顺序运行全部四个步骤。整个过程只需运行一次耗时约 1525 分钟输出全部写入training/data目录。流水线一意图分类器第一步raw-to-csv。raw_to_csv.js 读取上述三个原始 JSON 文件将每条样本规整为{query, intent}记录再用d3-dsv的csvFormat写出两列 CSVquery,intent默认输出到training/data/intents.csv约 5942 行。第二步csv-to-tensors。csv_to_tensors.js 负责将 CSV 转换为 Tensor定义三个标签LABELS [AddToPlaylist, GetWeather, PlayMusic]用tf.util.shuffle打乱数据标签用tf.oneHot转为 one-hot 编码查询文本用Universal Sentence EncoderUSE批量嵌入得到 512 维向量batchSize 默认 32最终通过tf.concat拼接所有批次写出两个 JSONintents_as_tensors.json{xsArr, ysArr}即嵌入向量与 one-hot 标签数组intent_metadata.json{labels, xsShape, ysShape}用于训练时还原张量形状与反推标签。训练时 train_intent.js 读取这两份文件用tf.tensor(xsArr, metadata.xsShape)还原张量并配合 intent_model.js 中的模型结构训练const model tf.sequential(); model.add(tf.layers.dense({ inputShape: [512], // USE 嵌入维度 units: NUM_CLASSES, // 3 activation: softmax, })); model.compile({ optimizer: adam, loss: categoricalCrossentropy, metrics: [accuracy], });可见意图分类器是一个把 512 维嵌入直接映射到 3 类的单层 softmax 模型数据规模完全放得进内存因此使用model.fit(xs, ys, {epochs, validationSplit: 0.15})一次性训练默认 32 个 epoch。流水线二Token Tagger第一步raw-to-tagged-tokens。raw_to_tagged_tokens.js 只处理train_GetWeather_full.json天气数据输出 NDJSON 文件每行格式为[ [{token: string, tag: string}, ...], intent: string ]关键逻辑包括分词复用 util.js 中的tokenizeSentence用正则/\b/按单词边界切分再 trim 并丢弃空串实体到标签的映射entityToTag将geographic_poi、state、country、city四类地点类实体统一映射为LOC标签其余实体或空实体全部归为TOK标签体系util.js 定义TAGS [TOK, LOC, __PAD__]其中PAD_IDX 2用于序列 padding。第二步tokens-to-embeddings。tokens_to_embeddings.js 统计全量查询中出现的 token去重后用 USE 逐一嵌入batchSize 默认 512写出token_embeddings.ndjson每行形如[token, embedding512维数组]。训练环节。train_tagger.js 在训练时动态组装样本按sequenceLength默认 30截断/补齐每个句子的 token 序列不足部分用__PAD__填充其嵌入用tf.ones([512])表示将每个 token 替换为其 USE 嵌入标签替换为 one-hot最终形成[batchSize, sequenceLength, 512]的输入张量通过model.fitDataset训练。tagger_model.js 支持三种架构--modelType可选bidirectional-lstm、lstm、dense默认双向 LSTM并对每个时间步做timeDistributed的 softmax 分类。还可通过--boostLOCTag将classWeight设为[1, 1.5, 1]加重 LOC 标签的误分类惩罚。数据文件的命令行参数速查四个数据处理脚本与两个训练脚本均基于argparse实现命令行参数默认值在源码中定义脚本参数默认值说明raw_to_csv.js--outPathtraining/data/intents.csvCSV 输出路径csv_to_tensors.js--gpu关闭使用tensorflow/tfjs-node-gpu需 CUDA/CuDNN--batchSize32USE 嵌入批次大小--srcPath/--outFolderdata/intents.csv/data/输入输出raw_to_tagged_tokens.js--outPathdata/intents_tagged_tokens.ndjsonNDJSON 输出路径tokens_to_embeddings.js--batchSize512token 嵌入批次大小--gpu关闭同上train_intent.js--epochs32训练轮数train_tagger.js--epochs20训练轮数--batchSize32训练批次大小--modelTypebidirectional-lstm可选lstm/dense--sequenceLength30序列最大长度--boostLOCTag关闭加重 LOC 误分类惩罚注意所有脚本默认走 CPU 路径tensorflow/tfjs-node使用 GPU 需要本机配置 CUDA 与 CuDNN且依赖tensorflow/tfjs-node-gpu版本见 package.json。本地复现从原始数据到完整模型在 intent-classifier 目录下按顺序执行# 1. 安装依赖yarn 或 npm yarn # 2. 一键处理全部原始数据约 1525 分钟只需一次 yarn prep-data # 3. 训练意图分类器 yarn train-intent # 4. 训练 token tagger yarn train-tagger # 5. 将 training/models 软链到 dist/models 并启动浏览器演示 yarn intent-app # 意图分类演示聊天界面 yarn tagger-app # token tagger 演示可视化为 token、标签与嵌入热图训练产物默认输出到training/models目录models/intent/意图模型、models/bidirectional-tagger/默认 tagger若改用--modelType lstm或dense则分别输出到models/lstm-tagger/、models/dense-tagger/。copy_models.js通过软链接将training/models挂到dist/models供前端应用加载copy_models.js。前端推理链路与训练时完全一致app/index.js 先用 USE 将输入嵌入为 512 维向量再送入意图模型预测softmax 最大值低于阈值 0.90 时返回不确定表情否则按标签返回对应图标app/tagger.js 则复用训练时的分词函数tokenizeSentence与 padding 逻辑tf.ones([toPad, EMBEDDING_DIM])补齐不足序列逐 token 输出标签与置信度并用 d3 把嵌入值渲染为可视化热图。结语Snips NLU Benchmark 的原始 JSON 以意图 clause 数组 实体标注的结构承载了 5942 条、三大意图的高质量标注样本是 intent-classifier 项目两条训练流水线的共同起点。理解data数组的拼接规则、实体到标签的映射以及四个数据处理脚本各自产出的中间文件就能完全掌控这个示例从原始数据到可运行模型的全部细节并在此基础上自由调整批次、序列长度、模型架构等超参数。赞分享示例工程【免费下载链接】tfjs-examplesExamples built with TensorFlow.js项目地址https://gitcode.com/gh_mirrors/tf/tfjs-examples点击查看免费下载相关推荐Snips NLU核心组件解析意图分类器与槽位填充器的完美协作Snips NLU核心组件解析意图分类器与槽位填充器的完美协作 在当今快速发展的自然语言处理领域Snips NLU作为一款开源的Python库专门用于从文人工智能NLP机器学习Snips NLU 训练数据集格式详解Snips NLU 训练数据集格式详解 概述 Snips NLU 是一个强大的自然语言理解 NLU 引擎它通过机器学习算法和训练数据来识别用户意图。本文将深入人工智能NLP机器学习Snips NLU 数据模型与核心概念解析Snips NLU 数据模型与核心概念解析 引言 自然语言理解 NLU 是人工智能领域的重要研究方向而Snips NLU作为一个优秀的开源自然语言理解引擎其人工智能NLP机器学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑