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 编码文本与网页的标注界面,涵盖valueType、inline、encoding、granularity、resolveUrls等全部参数语义、与HyperTextLabels控制标签的组合用法,以及基于 XPath 的区域标注结果 JSON 格式。读完本文,你将能够独立编写可运行的 HyperText 标注配置,理解其结果数据的底层序列化原理,并掌握将云端存储 URI 直接解析为可标注页面的高级用法。
一、HyperText 标签是什么
HyperText是 Label Studio 前端编辑器(web/libs/editor)中的一个对象(Object)标签,用于在标注界面中渲染 HTML 格式的超文本内容,供标注人员对 HTML 编码的文本与网页进行区域级标注。
官方文档对其定位如下:
The
HyperTexttag displays hypertext markup for labeling. Use for labeling HTML-encoded text and webpages for NER and NLP projects.
它面向的数据类型为HTML。与之配合的通常是Labels或HyperTextLabels这类控制(Control)标签,后者正是为了"标注超文本"这一场景设计的:在 hypertextlabels.md 中,HyperTextLabels被描述为"creates labeled hyper text (HTML),用于配合 HyperText 对象标签完成 HTML 文本或元素的命名实体识别任务"。
从源码结构看,HyperText与Text标签共享同一个底层模型RichTextModel。RichText/index.js 中的注册逻辑显示,两者只是以isText标志区分的同一套富文本实现:
Registry.addTag("text", RichTextModel, HtxRichText({ isText: true })); Registry.addTag("hypertext", RichTextModel, HtxRichText({ isText: false }));在 RichText/model.js 中,TagAttrs模型集中定义了这两个标签的全部属性(valuetype、inline、savetextresult、selectionenabled、clickablelinks、highlightcolor、showlabels、encoding、granularity、resolveurls),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"将Labels与HyperText建立关联,标注时选择的标签会作用于该超文本区域;- 这一配置即可用于标注"标题(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额外支持choice(single/multiple,默认single)、maxUsages(单个标签每个任务的最大使用次数)与showInline(是否同行内联展示标签,默认true)等控制参数,适合"标题(Header)/正文(Body Text)"这类语义角色标注。
三、完整参数详解
官方文档通过{% insertmd %}引入了 includes/tags/hypertext.md 中的参数表,以下逐项展开说明,并结合源码给出实际取值与默认行为:
| Param | Type | Default | Description |
|---|---|---|---|
name | string | 元素名称,供toName引用 | |
value | string | 元素的值(绑定任务数据字段,如$text) | |
valueType | url|text | text | 文本是直接存放在上传数据中,还是需要从 URL 加载 |
inline | boolean | false | 是否将 HTML 直接嵌入 Label Studio 页面渲染,否则使用 iframe |
saveTextResult | yes|no | 是否把标注文本一并存入结果;对valueType=url默认不存 | |
encoding | none|base64|base64unicode | 如何解码编码字符串中的值 | |
selectionEnabled | boolean | true | 启用或禁用文本选择 |
clickableLinks | boolean | false | 是否允许点击超文本中的链接打开资源 |
highlightColor | string | 高亮颜色(十六进制),未设置时使用标签颜色 | |
showLabels | boolean | 是否在区域旁显示标签;未设置(默认)— 使用编辑器设置;true/false — 覆盖编辑器设置 | |
granularity | symbol|word|sentence|paragraph | 控制区域选择的粒度 | |
resolveUrls | boolean | true | valueType="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,官方给出的结果参数如下:
| Name | Type | Description |
|---|---|---|
value | Object | 区域值对象 |
value.start | string | 区域起始容器的 XPath |
value.end | string | 区域结束容器的 XPath |
value.startOffset | number | 起始容器内的偏移量 |
value.endOffset | number | 结束容器内的偏移量 |
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>配置要点回顾:
valueType="url"+resolveUrls="true":支持直接标注从远程 URL 加载、且内含s3://、gs://等云存储引用的页面;granularity="word":选区按单词对齐,适合实体抽取;clickableLinks="true":允许标注人员点击页面中的真实链接核验目标地址;HyperTextLabels的choice="multiple"允许多标签叠加,maxUsages="10"限制单标签每任务最多使用 10 次;- 由于是
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:标签注册逻辑,可见
hypertext与text共用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),仅供参考