news 2026/9/13 2:41:38

Label Studio HyperText 标签完全指南:HTML 超文本数据标注配置与结果格式解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Label Studio HyperText 标签完全指南:HTML 超文本数据标注配置与结果格式解析

Label Studio HyperText 标签完全指南:HTML 超文本数据标注配置与结果格式解析

【免费下载链接】label-studioLabel Studio is a multi-type data labeling and annotation tool with standardized output format项目地址: https://gitcode.com/GitHub_Trending/la/label-studio

本篇技术指南围绕 Label Studio 的HyperText对象标签展开,系统讲解如何在命名实体识别(NER)与自然语言处理(NLP)项目中配置 HTML 编码文本与网页的标注界面,涵盖valueTypeinlineencodinggranularityresolveUrls等全部参数语义、与HyperTextLabels控制标签的组合用法,以及基于 XPath 的区域标注结果 JSON 格式。读完本文,你将能够独立编写可运行的 HyperText 标注配置,理解其结果数据的底层序列化原理,并掌握将云端存储 URI 直接解析为可标注页面的高级用法。

一、HyperText 标签是什么

HyperText是 Label Studio 前端编辑器(web/libs/editor)中的一个对象(Object)标签,用于在标注界面中渲染 HTML 格式的超文本内容,供标注人员对 HTML 编码的文本与网页进行区域级标注。

官方文档对其定位如下:

TheHyperTexttag displays hypertext markup for labeling. Use for labeling HTML-encoded text and webpages for NER and NLP projects.

它面向的数据类型为HTML。与之配合的通常是LabelsHyperTextLabels这类控制(Control)标签,后者正是为了"标注超文本"这一场景设计的:在 hypertextlabels.md 中,HyperTextLabels被描述为"creates labeled hyper text (HTML),用于配合 HyperText 对象标签完成 HTML 文本或元素的命名实体识别任务"。

从源码结构看,HyperTextText标签共享同一个底层模型RichTextModel。RichText/index.js 中的注册逻辑显示,两者只是以isText标志区分的同一套富文本实现:

Registry.addTag("text", RichTextModel, HtxRichText({ isText: true })); Registry.addTag("hypertext", RichTextModel, HtxRichText({ isText: false }));

在 RichText/model.js 中,TagAttrs模型集中定义了这两个标签的全部属性(valuetypeinlinesavetextresultselectionenabledclickablelinkshighlightcolorshowlabelsencodinggranularityresolveurls),HyperText的正式文档声明则维护在 HyperText.js 这个 stub 文件中,保证代码注释与用户文档同步。这意味着:凡是本文下述关于 HyperText 的参数,在代码层面均可在RichTextModel中找到对应字段

二、基本配置示例

2.1 结合 Labels 标签标注 HTML 内容

官方文档给出的第一个示例,是使用HyperText展示绑定到任务数据字段$text的 HTML 内容,并用Labels提供三个标签:

<View> <HyperText name="text-1" value="$text" /> <Labels name="parts" toName="text-1"> <Label value="Caption" /> <Label value="Article" /> <Label value="Author" /> </Labels> </View>

要点说明:

  • value="$text"表示从任务数据中取名为text的字段,该字段保存 HTML 字符串;
  • toName="text-1"LabelsHyperText建立关联,标注时选择的标签会作用于该超文本区域;
  • 这一配置即可用于标注"标题(Caption)、正文(Article)、作者(Author)"等网页结构成分。

2.2 内嵌 HTML 内容

第二个示例演示了不依赖任务数据、直接在配置中内嵌 HTML 的用法:

<View> <HyperText name="p1"> <p>Some explanations <em>with style</em></p> </HyperText> </View>

此时HyperText标签体内直接书写 HTML 片段(<p><em>等),编辑器会将其作为待标注内容渲染,适用于快速演示或固定内容标注。

2.3 配合 HyperTextLabels 的 NER 配置

若需要更细粒度控制"同一标签可被选择的次数""单选/多选",官方推荐使用 HyperTextLabels 标签,其示例配置为:

<View> <HyperTextLabels name="labels" toName="ht"> <Label value="Header" /> <Label value="Body Text" /> </HyperTextLabels> <HyperText name="ht" value="$html" /> </View>

HyperTextLabels额外支持choicesingle/multiple,默认single)、maxUsages(单个标签每个任务的最大使用次数)与showInline(是否同行内联展示标签,默认true)等控制参数,适合"标题(Header)/正文(Body Text)"这类语义角色标注。

三、完整参数详解

官方文档通过{% insertmd %}引入了 includes/tags/hypertext.md 中的参数表,以下逐项展开说明,并结合源码给出实际取值与默认行为:

ParamTypeDefaultDescription
namestring元素名称,供toName引用
valuestring元素的值(绑定任务数据字段,如$text
valueTypeurl|texttext文本是直接存放在上传数据中,还是需要从 URL 加载
inlinebooleanfalse是否将 HTML 直接嵌入 Label Studio 页面渲染,否则使用 iframe
saveTextResultyes|no是否把标注文本一并存入结果;对valueType=url默认不存
encodingnone|base64|base64unicode如何解码编码字符串中的值
selectionEnabledbooleantrue启用或禁用文本选择
clickableLinksbooleanfalse是否允许点击超文本中的链接打开资源
highlightColorstring高亮颜色(十六进制),未设置时使用标签颜色
showLabelsboolean是否在区域旁显示标签;未设置(默认)— 使用编辑器设置;true/false — 覆盖编辑器设置
granularitysymbol|word|sentence|paragraph控制区域选择的粒度
resolveUrlsbooleantruevalueType="url"时是否解析内容中的云存储 URI(如s3://gs://

3.1valueType:数据来源与安全模式

valueType决定value字段的内容是直接作为 HTML 字符串渲染text),还是作为 URL 去加载页面/内容(url)。在 RichText/model.js 中,其默认值并非固定为text,而是与浏览器安全模式联动:

valuetype: types.optional( types.enumeration(["text", "url"]), () => (window.LS_SECURE_MODE ? "url" : "text"), ),

即:在 SECURE MODE 下默认强制为url,此时不允许直接把文本写进任务数据,WARNING_MESSAGES中专门有一条dataTypeMistmatch提示"Do not put text directly in task data if you use valueType=url"(见 model.js)。

3.2inline:直接渲染还是 iframe

inline=false(默认)时,HTML 内容被渲染在 iframe 中,隔离页面自身的脚本与样式;inline=true则把 HTML 直接嵌入 Label Studio 页面。源码中对此有一个隐含约束(model.js):if (self.type === "text") self.inline = true;——即Text标签强制内联,而inline参数只对HyperText有意义(对应注释 "whether to embed html directly to LS or use iframe (only HyperText)")。

3.3saveTextResult:结果中是否携带文本

saveTextResult控制标注结果中是否记录被选中区域的文本内容。官方文档特别强调:对于valueType=url,默认不保存文本。这一行为在afterCreate钩子中自动推导(model.js):

if (self.savetextresult === "none") { if (self.valuetype === "url") self.savetextresult = "no"; else if (self.valuetype === "text") self.savetextresult = "yes"; }

也就是说,savetextresult未显式配置时:valueType=text→ 自动保存文本;valueType=url→ 自动不保存文本;用户显式设置yes/no可以覆盖此推导。

3.4encoding:解码编码字符串

当任务数据中的值本身是编码字符串时,可设置:

  • none:不解码,直接使用(源码中的默认值);
  • base64:用atob(val)解码(model.js);
  • base64unicode:用Utils.Checkers.atobUnicode(val)解码,适用于包含 Unicode 字符的 base64 编码内容(model.js)。

3.5granularity:区域选择粒度

granularity控制用户一次框选的最小语义单元,可选symbol(字符)、word(单词)、sentence(句子)、paragraph(段落)。在模型层被建模为枚举(model.js),默认symbol即自由选择任意字符范围。设置为word/sentence/paragraph后,选区会自动吸附到对应粒度的边界,便于按语义单元标注实体。

3.6resolveUrls:云存储 URI 解析

valueType="url"且加载的 HTML 内容中引用了云存储资源(如s3://gs://开头的图片、附件地址)时,resolveUrls=true(默认)会把它们解析为可访问的实际 URL;在无法直接解析的场景下,会替换为/tasks/{id}/resolve/代理地址,使资源通过 Label Studio 的鉴权与预签名(presigning)机制加载(model.js):

if (self.resolveurls && self.type !== "text") { content = presignUrls(content, store.task?.id); }

注意这里同样排除了text类型,即resolveUrls是 HyperText 的专属行为,与 Label Studio 各存储后端(S3、GCS、Azure Blob 等)的预签名能力联动。

3.7 其他行为参数

  • selectionEnabled:默认true,置false可禁用选区,用于纯展示场景;
  • clickableLinks:默认false,置true后标注人员可直接点击超文本中的链接跳转(注意与标注框选操作共存时的交互取舍);
  • highlightColor:十六进制高亮色,缺省时沿用所选标签的配色;
  • showLabels:三态参数——不设置时跟随编辑器全局设置,显式true/false强制显示/隐藏区域旁的标签名。

四、标注结果格式:基于 XPath 的区域序列化

HyperText 标注产生的区域(Region)结果由HyperTextRegion定义,其文档 stub 位于 HyperTextRegion.js,官方给出的结果参数如下:

NameTypeDescription
valueObject区域值对象
value.startstring区域起始容器的 XPath
value.endstring区域结束容器的 XPath
value.startOffsetnumber起始容器内的偏移量
value.endOffsetnumber结束容器内的偏移量
value.text(可选)string区域文本内容,可省略

官方示例 JSON:

{ "value": { "start": "/div[1]/p[2]/text()[1]", "end": "/div[1]/p[4]/text()[3]", "startOffset": 2, "endOffset": 81, "hypertextlabels": ["Car"] } }

该格式与HyperTextLabels的结果参数完全一致(见 includes/tags/hypertextlabels.md),便于两类标签混用同一套后处理逻辑。

4.1 结果如何生成:全局偏移与相对偏移的换算

从源码看,HyperText 区域的序列化并不是简单的字符下标,而是**"XPath 容器 + 容器内偏移"**的双层定位,这一转换由 DOM 管理器完成,RichText 模型对外暴露三个换算接口(model.js):

  • globalOffsetsToRelativeOffsets({ start, end }):把文档级全局码点偏移转换为{start, startOffset, end, endOffset}相对定位,即序列化方向;
  • relativeOffsetsToGlobalOffsets(start, startOffset, end, endOffset):反方向还原,用于回放标注;
  • rangeToGlobalOffset(range):把浏览器选区Range对象转换为全局偏移,即用户框选的入口。

区域重建时,needsUpdate()会调用region.initRangeAndOffsets()applyHighlight(true)updateHighlightedText()重新定位并高亮已有区域(model.js)。这种 XPath 定位方式的优势在于:即使 HTML 结构复杂、文本被<em><span>等标签切碎,区域仍能稳定锚定到具体 DOM 文本节点,不会因为样式标签的增删而失配。

4.2 安全清理:结果与渲染的一致性

setRemoteValue在载入 HTML 内容时执行关键的安全步骤(model.js):

if (self.type === "text") { self._value = String(val); } else { self._value = sanitizeHtml(String(val)); }

即 HyperText 加载的 HTML 会经过sanitizeHtml清理(移除 script、iframe 等危险元素,替换为占位节点以保持 DOM 节点数量一致),而 Text 类型因已在视图层做 HTML 转义,不再重复消毒。这保证标注区域所锚定的 DOM 结构与序列化结果是严格对应的。

五、实战:一个完整的网页成分标注配置

综合上述内容,给出一个可直接投入使用的完整配置,用于对从 URL 加载的网页做"标题/正文/作者/链接"成分标注:

<View> <HyperText name="page" value="$html" valueType="url" granularity="word" clickableLinks="true" resolveUrls="true" encoding="none" /> <HyperTextLabels name="parts" toName="page" choice="multiple" maxUsages="10"> <Label value="Header" background="#ff0000" /> <Label value="Body Text" background="#00ff00" /> <Label value="Author" background="#0000ff" /> <Label value="Link" background="#ffa500" /> </HyperTextLabels> </View>

配置要点回顾:

  1. valueType="url"+resolveUrls="true":支持直接标注从远程 URL 加载、且内含s3://gs://等云存储引用的页面;
  2. granularity="word":选区按单词对齐,适合实体抽取;
  3. clickableLinks="true":允许标注人员点击页面中的真实链接核验目标地址;
  4. HyperTextLabelschoice="multiple"允许多标签叠加,maxUsages="10"限制单标签每任务最多使用 10 次;
  5. 由于是valueType="url"且未显式设置saveTextResult,结果默认不包含value.text,仅记录 XPath 定位信息——如需回显文本,可显式加上saveTextResult="yes"

对应的标注结果(节选)示例如下:

{ "value": { "start": "/html[1]/body[1]/div[1]/p[1]/text()[1]", "end": "/html[1]/body[1]/div[1]/p[3]/text()[2]", "startOffset": 0, "endOffset": 120, "text": "Some explanations with style...", "hypertextlabels": ["Body Text"] } }

六、常见问题与调试线索

  • 内容没有渲染:检查value绑定的任务数据字段是否存在;若使用valueType="url"而任务数据里直接放了文本,会触发源码中的dataTypeMistmatch警告(model.js)。
  • URL 加载失败:会触发loadingError警告并在标注区显示错误信息;在 SECURE MODE 下valueType被强制为url,请确认任务数据确实存放 URL。
  • 标注结果没有text字段:这是valueType="url"的默认行为(saveTextResult自动为no),按需显式设置saveTextResult="yes"
  • 区域无法精确选择selectionEnabled="false"会完全禁用选择;granularity粒度设置过高(如paragraph)时最小选区为整个段落,按需调整。
  • 点击文本却跳转链接clickableLinks默认为false,只有在显式开启后链接才可点击。
  • 区域位置漂移:XPath 定位依赖 DOM 结构稳定性;若页面内容包含动态插入的节点,建议在标注前固定页面版本,并依赖sanitizeHtml的节点替换策略保持结构一致。

七、进一步阅读

  • hypertextlabels.md 与 includes/tags/hypertextlabels.md:HyperTextLabels控制标签的完整参数与结果说明;
  • HyperText.js:HyperText 标签的源码文档 stub(与本文参数表一一对应);
  • RichText/model.js:HyperText 与 Text 共用的底层数据模型与加载、解码、消毒、坐标换算实现;
  • RichText/index.js:标签注册逻辑,可见hypertexttext共用RichTextModel
  • HyperTextRegion.js:区域结果的类型定义与示例 JSON;
  • text.md:同族Text标签文档,用于纯文本标注场景的对比参考。

【免费下载链接】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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 2:40:43

随机森林回归实战:基于UCI数据的葡萄酒质量预测

不绕弯子&#xff0c;直接聊这次做的葡萄酒质量预测项目。市面上的教程大多拿鸢尾花、波士顿房价练手&#xff0c;但那类数据集干净得不像实战。我这次选的是UCI上的公开葡萄酒质量数据集&#xff0c;用随机森林回归模型解决一个非常接地气的问题&#xff1a;给一堆理化指标&am…

作者头像 李华
网站建设 2026/9/13 2:40:30

MCP工具定义实战:JSON Schema在具身智能Agent中的应用

做具身智能方向的工程落地&#xff0c;这两年绕不开一个话题&#xff1a;MCP&#xff08;Model Context Protocol&#xff09;的工具定义规范。尤其当你需要让大模型去调用机械臂、传感器、仿真环境这些真实世界的工具时&#xff0c;工具的JSON定义写得好不好&#xff0c;直接决…

作者头像 李华
网站建设 2026/9/13 2:38:27

Vue.js实战:搭建影视云视听平台的前端架构与性能优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 2:37:30

达梦数据库定时备份与清理任务实战:从图形化配置到自动化运维

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华