Label Studio 嵌套分类指南用 visibleWhen / whenTagName / whenChoiceValue 构建条件式与多级分类标注【免费下载链接】label-studioLabel Studio is a multi-type data labeling and annotation tool with standardized output format项目地址: https://gitcode.com/GitHub_Trending/la/label-studioLabel Studio 的分类Choices标注模板支持“条件触发 多级嵌套”的进阶用法只有标注者选中了某个选项后才会显示下一级分类问题或补充文本样本。本文以 nested-classification.md 为核心骨架结合仓库内 View、Choices、Text 等标签文档以及前端编辑器对visibleWhen系列参数的源码实现Visibility.js系统讲解条件式分类、两级与三级嵌套分类的完整 XML 配置写法并给出参数取值、运行前提与结果序列化说明帮助你直接用这些模板改造自己的标注项目。前置理解分类模板里的三个关键条件参数嵌套分类的所有玩法都建立在一组条件控制参数之上。它们既可以加在 View 容器标签上也可以直接加在 Choices 控制标签上作用是按标注者当前的选择状态动态显示/隐藏界面区块。参数可选值以仓库文档为准作用visibleWhenchoice-selected/choice-unselected/region-selected/no-region-selected控制内容可见性与下方when*参数组合可进一步收窄触发条件whenTagName字符串配合visibleWhen使用。对 choices 类填对应Choices标签的name对 regions 类填对象标签的namewhenChoiceValue字符串多个值用英文逗号分隔配合visibleWhenchoice-selected或choice-unselected使用且必须与whenTagName同时出现按具体的选项值收窄可见性以 docs/source/includes/tags/view.md 的参数表为准补充说明两点约束whenLabelValue仅用于region-selected场景按区域标签过滤whenRole用于聊天类数据按角色如 user / assistant过滤详见 chat.md对 choices 场景whenChoiceValue支持逗号分隔的多值例如whenChoiceValuePositive,Negative表示选中其中任意一个即显示view.md 中就有这样的示例。参数解析在哪发生在前端编辑器的源码 Visibility.js 中visiblewhen、whentagname、whenchoicevalue、whenlabelvalue、whenrole五个属性被建模为可空字符串字段而isVisible计算属性Visibility.js在每次标注状态变化时求值choice-selected分支会先在annotation.names中定位whenTagName指向的 Choices 标签再调用其hasChoiceSelection(choiceValue.split(,), tag.selectedValues())判断所选值是否命中Visibility.js。也就是说多值逗号分隔是在运行时被split(,)逐个匹配的而不是把整串字符串拿去比较。场景一条件式分类在第二个样本上追加分类适用于“先对第一段文本做情感分类再根据结果展示第二段文本及其专属分类问题”的流程。核心思路是用visibleWhenchoice-selectedwhenTagNamewhenChoiceValue把一段 View 容器“挂”在指定选项上。第 1 步定义数据对象标签使用 Text 对象标签承载第一段文本name与value指向任务数据字段$text1必须填写Text nametext1 value$text1 /同样的模板可以平移到图像或音频分类把对象标签换成Image name... value$image/或Audio name... value$audio/即可其他部分无需改动。第 2 步定义第一组分类选项Choices 控制标签通过name标识选项组toName关联到第 1 步的对象标签showInlinetrue让选项在同一行横向排布Choices namesentiment toNametext1 showInlinetrue Choice valuePositive / Choice valueNegative / Choice valueNeutral / /Choices第 3 步用条件 View 包裹第二段样本只有标注者在sentiment中选中了Positive下面的 View 才会出现。注意whenTagNamesentiment必须与whenChoiceValuePositive成对使用View visibleWhenchoice-selected whenTagNamesentiment whenChoiceValuePositive Header valueWhat about this text? / Text nametext2 value$text2 / /ViewHeader 在这里充当给标注者的指令文案。第 4 步定义第二组分类选项同样受条件控制第二组选项toNametext2关联第二段文本并复制与第 3 步相同的条件设置——三者必须一致才能保证“文本出现的同时问题也出现”Choices namesentiment2 toNametext2 choicesingle showInlinetrue visibleWhenchoice-selected whenTagNamesentiment whenChoiceValuePositive Choice valuePositive / Choice valueNegative / Choice valueNeutral / /Choices完整配置把四段代码按顺序放入同一个View推荐在最外层再包一层View以符合标签语法要求即为可用模板View Text nametext1 value$text1 / Choices namesentiment toNametext1 showInlinetrue Choice valuePositive / Choice valueNegative / Choice valueNeutral / /Choices View visibleWhenchoice-selected whenTagNamesentiment whenChoiceValuePositive Header valueWhat about this text? / Text nametext2 value$text2 / /View Choices namesentiment2 toNametext2 choicesingle showInlinetrue visibleWhenchoice-selected whenTagNamesentiment whenChoiceValuePositive Choice valuePositive / Choice valueNegative / Choice valueNeutral / /Choices /View代码库中的对应示例编辑器示例 nested_choices/config.xml 展示了同类思路——第一组sentiment选项与一个仅带visibleWhenchoice-selected不写whenTagName即“任一选项被选中即显示”的第二组选项联动。你可以对比两种写法理解“指定标签”与“不指定标签”的差别。场景二两级嵌套分类同一数据上的追问与场景一不同这里不引入第二份数据而是在同一份数据如图片上做“先粗分类、再追问细节”的两级问题。第二组选项的触发条件是“第一组任意选项被选中”因此只写visibleWhenchoice-selectedwhenTagNamecontent不写whenChoiceValue。第 1 步定义图像对象Image nameimage value$image/第 2 步第一级粗分类Choices namecontent toNameimage Choice valueAdult content/ Choice valueWeapons / Choice valueViolence / /Choices第 3 步第二级追问任意选项触发whenTagNamecontent限定监听第一组选项不写whenChoiceValue表示第一组中任一选项被选中即显示。Header作为嵌套在 Choices 内部的问题文案Choices nameother-props toNameimage choicesingle showInlinetrue visibleWhenchoice-selected whenTagNamecontent Header valueAre there people or animals? / Choice valueYes / Choice valueNo / /Choices这一写法与源码中的判断逻辑完全吻合choice-selected分支在whenTagName有值、choiceValue为空时只要tag.hasChoiceSelection(undefined, tag.selectedValues())命中任一已选项即返回可见Visibility.js。场景三三级嵌套分类基于特定选项继续追问当追问粒度需要超过两级时可以继续叠层。以音频分类为例第一级判断总体倾向第二级收集音频本身属性第三级仅当第二级选中Noisy时追问噪音类型。每一级的触发条件都可以用前文参数自由组合复杂度由你掌控。第 1 步定义音频对象Audio nameaudio value$audio /第 2 步第一级——总体倾向Choices nameintent toNameaudio showInlinetrue Choice valuePositive / Choice valueNegative / Choice valueNeutral / /Choices第 3 步第二级——音频属性任一第一级选项触发Choices nameother-props toNameaudio choicesingle showInlinetrue visibleWhenchoice-selected whenTagNameintent Header valueOther properties of the audio clip / Choice valueNoisy / Choice valueClear / /Choices第 4 步第三级——噪音类型选中 Noisy 时触发注意这里whenTagNameother-props指向第二级Choices 的namewhenChoiceValueNoisy指定具体选项。whenChoiceValue必须与whenTagName成对使用。另外原文档示例中第三级 Choices 的toNametext指向了文本对象若你的任务数据中没有名为text的字段请将其改为实际对象标签的name本例为audio否则配置校验会失败Choices nameemotion toNameaudio choicesingle showInlinetrue visibleWhenchoice-selected whenTagNameother-props whenChoiceValueNoisy Header valueWhat type of noise? / Choice valueCrowd / Choice valueMachinery / Choice valueTraffic / Choice valueUnsure/Other / /Choices触发链路总结层级标签触发条件效果第一级intent无始终可见选择 Positive / Negative / Neutral第二级other-propschoice-selectedwhenTagNameintent任一第一级选项被选中即出现第三级emotionchoice-selectedwhenTagNameother-propswhenChoiceValueNoisy第二级选中 Noisy 才出现条件参数的其他组合与进阶用法在 View 标签上使用场景一已见在 Choices 标签上同样可用Visibility.js 的注释明确说明该可见性机制可以应用在View和Choices两种标签上。场景二、三的示例正是在Choices上直接使用此时连同Header一起随条件显隐。choice-unselected反条件显示若希望“取消选中某选项时”才显示追问可将visibleWhen改为choice-unselected。源码中该模式定义为!fnschoice-selectedVisibility.js即对选择条件取反。region-selected与whenLabelValue区域驱动的显隐条件不仅可绑定“选项”也可绑定“区域标注”。例如 view.md 的示例中当标注者在label标签组选中了PER或ORG区域时才显示附加的HeaderView Labels namelabel toNametext Label valuePER backgroundred/ Label valueORG backgrounddarkorange/ Label valueLOC backgroundorange/ Label valueMISC backgroundgreen/ /Labels Text nametext value$text/ !-- Shown only when region PER or ORG is selected -- View visibleWhenregion-selected whenLabelValuePER,ORG Header valueyoho/ /View /View多值匹配与动态选项whenChoiceValuePositive,Negative可一次匹配多个选项逗号分隔运行时按逗号拆分逐一比对Visibility.js分类选项本身也支持从任务数据动态加载Choices ... value$variants且动态选项支持children嵌套allowNested相关参数见 includes/tags/choices.md 与 choices.md 的动态加载示例。randomize弱化位置偏差若希望每次打开任务时打乱顶层Choice的展示顺序例如情感分类避免“总是顺手选第一项”可设置randomizetrue。注意随机化是临时的不影响序列化结果中value/alias的输出热键提示按可见顺序编号带显式hotkey的选项不受影响。细节见 includes/tags/choices.md。常用参数速查参数适用标签默认值说明nameChoices / View 内的控制标签—选项组或元素名whenTagName据此引用toNameChoices—关联的对象标签nameText / Image / Audio 等choiceChoicessingle单选 / 单选-radio / 多选single、single-radio、multipleshowInlineChoicesfalse是否在同一行横向显示选项required/requiredMessageChoicesfalse/ —是否强制选择及校验失败提示visibleWhenView、Choices—可见性触发模式4 种取值见上文whenTagNameView、Choices—配合visibleWhen按标签名收窄whenChoiceValueView、Choices—配合choice-selected/choice-unselected与whenTagName使用按选项值收窄多值逗号分隔whenLabelValueView、Choices—仅配合region-selected按区域标签收窄多值逗号分隔layoutChoicesvertical选项布局select下拉/inline横向/vertical纵向perRegionChoices—对某个区域而不是整任务做选择valueChoices—从任务数据字段动态加载选项列表allowNestedChoices—允许动态选项的children嵌套结果序列化为数组的数组适用前提与注意事项参数配对约束whenChoiceValue必须与whenTagName同时使用原文档明确强调includes/tags/choices.md 的参数表亦标注两者均为必需。条件标签适用范围visibleWhen机制由前端编辑器统一实现Visibility.js可在View与Choices上使用四种取值region-selected/choice-selected/no-region-selected/choice-unselected中no-region-selected不能附加其他when*参数Visibility.js。父级不可见会级联隐藏源码中isVisible首先检查父级可见性父级不可见时直接返回不可见Visibility.js因此嵌套时触发条件要保持层级一致。toName必须真实存在条件显隐只控制“显示”不改变数据关联。每个Choices的toName仍需指向配置中真实定义的对象标签如image、audio否则配置无法通过校验文中三级示例已修正原文档的toNametext。其他数据类型同样适用条件式分类不限于文本图像、音频乃至视频分类任务均可平移套用只需替换对象标签与数据字段。本文所有模板的运行前提Label Studio 标注项目创建页面的“Labeling Setup”中粘贴 XML 配置并校验通过任务数据需包含$text1、$text2、$image、$audio等对应字段。社区版与商业版的配置语法一致此能力属于通用标注模板能力。结语通过visibleWhen搭配whenTagName/whenChoiceValue你可以把原本平铺的分类问题改造成“选择驱动”的多级问卷式标注流程从“先分类再对第二段样本追问”的条件式分类到同一数据上两级、三级的嵌套追问再到基于区域标签的显隐控制参数组合的复杂度完全由业务需要决定。理解 Visibility.js 的运行逻辑按whenTagName定位标签、按逗号拆分匹配选项值、父级不可见级联能帮助你在排查配置问题时快速定位是“参数拼写”还是“层级嵌套”导致的不显示。将本文三个场景的完整 XML 直接用于你的 项目标注配置即可快速落地一套自适应的分类标注模板。【免费下载链接】label-studioLabel Studio is a multi-type data labeling and annotation tool with standardized output format项目地址: https://gitcode.com/GitHub_Trending/la/label-studio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考