如何向 spaCy tokenizer 添加自定义规则以将 HTML 分解为单个标记?

2023-12-21

我知道有很多资源可以解决这个问题,但我无法让 spaCy 完全满足我的要求。

我想向我的 spaCy 分词器添加规则,以便 HTML 标签(例如<br/>等等...)在我的文本中将是一个标记。

我现在正在使用“merge_noun_chunks”管道,所以我得到像这样的令牌:
"documentation<br/>The Observatory Safety System"(这是一个单一的令牌)

我想添加一条规则,以便将其分为 3 个标记:
"documentation", "<br/>", "The Observatory Safety System"
我查了很多资源:here http://www.longest.io/2018/01/27/spacy-custom-tokenization.html, 也在这里 https://stackoverflow.com/questions/47549856/tokenizing-an-html-document。但我无法让它在我的情况下工作

我已经尝试过这个:

    
    infix_re = re.compile(r'''<[\w+]\/>''')
    prefix_re = compile_prefix_regex(nlp.Defaults.prefixes)
    suffix_re = compile_suffix_regex(nlp.Defaults.suffixes)

    return Tokenizer(nlp.vocab, prefix_search=prefix_re.search,
                                suffix_search=suffix_re.search,
                                infix_finditer=infix_re.finditer,
                                token_match=None)

我不确定我是否准确理解更改中缀的作用。我是否也应该删除<来自前缀正如这里所建议的 https://stackoverflow.com/a/52595182/13020673?


实现这一目标的一种方法似乎是使标记器既

  1. 分解包含没有空格的标签的标记,并且
  2. “块”标签状序列作为单个标记。

要像示例中那样拆分标记,您可以修改标记生成器中缀(在这里描述的方式 https://github.com/explosion/spaCy/issues/3673):

infixes = nlp.Defaults.infixes + [r'([><])']
nlp.tokenizer.infix_finditer = spacy.util.compile_infix_regex(infixes).finditer

为了确保标签被视为单个标记,您可以使用“特殊情况”(请参阅分词器概述 https://spacy.io/usage/spacy-101#annotations-token or the 方法文档 https://spacy.io/api/tokenizer#add_special_case)。您可以为打开、关闭和空标签添加特殊情况,例如:

# open and close
for tagName in "html body i br p".split():
    nlp.tokenizer.add_special_case(f"<{tagName}>", [{ORTH: f"<{tagName}>"}])    
    nlp.tokenizer.add_special_case(f"</{tagName}>", [{ORTH: f"</{tagName}>"}])    

# empty
for tagName in "br p".split():
    nlp.tokenizer.add_special_case(f"<{tagName}/>", [{ORTH: f"<{tagName}/>"}])    

综合起来:

import spacy
from spacy.symbols import ORTH

nlp = spacy.load("en_core_web_trf")
infixes = nlp.Defaults.infixes + [r'([><])']
nlp.tokenizer.infix_finditer = spacy.util.compile_infix_regex(infixes).finditer

for tagName in "html body i br p".split():
    nlp.tokenizer.add_special_case(f"<{tagName}>", [{ORTH: f"<{tagName}>"}])    
    nlp.tokenizer.add_special_case(f"</{tagName}>", [{ORTH: f"</{tagName}>"}])    

for tagName in "br p".split():
    nlp.tokenizer.add_special_case(f"<{tagName}/>", [{ORTH: f"<{tagName}/>"}])    

这似乎产生了预期的结果。例如,申请...

text = """<body>documentation<br/>The Observatory <p> Safety </p> System</body>"""
print("Tokenized:")
for t in nlp(text):
    print(t)

...将完整且单独地打印标签:

# ... snip
documentation
<br/>
The
# ... snip

I found 分词器的解释方法 https://spacy.io/api/tokenizer#explain在这方面非常有帮助。它为您提供了标记化原因的详细信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何向 spaCy tokenizer 添加自定义规则以将 HTML 分解为单个标记? 的相关文章

  • 在 gtk.main() 执行时与 gtk.container 交互?

    目前在 Python 中使用电池监视器图标进行实验pygtk and egg trayicon创建一个图标来显示电池图标 工具提示 我似乎能够添加图标和工具提示文本 但是当它到达gtk main 阶段我需要一种方法来修改这些 以便它可以显示
  • 如何使用 Julia 查找矩阵中的连通分量

    假设我有以下矩阵 此处用 Julia 语言定义 mat 1 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 将一组值为 1 的相邻元素视为一个 分量 如何识别该矩阵有 2 个分量以及每个分量由哪些顶点组成 对于矩
  • 在python中合并两个json对象

    我正在 python 中合并两个 json 我正在做 import json json obj json dumps a 1 2 json obj1 json dumps a 3 4 json obj json obj1 print jso
  • 将 3d NumPy 数组重塑为 2d NumPy 数组时遇到问题

    我正在研究图像处理问题 我的数据以 3 维 NumPy 数组的形式呈现 其中 x y z 条目是图像 z 的 x y 像素 数值强度值 有 100000 张图像 每张图像为 25x25 因此 数据矩阵的大小为 25x25x10000 我试图
  • 在 C 中解析字符串的最简单方法是什么?

    我必须在 C 中解析这个字符串 XFR 3 NS 207 46 106 118 1863 0 207 46 104 20 1863 r n 并且能够得到207 46 106 118部分和1863部分 第一个 IP 地址 我知道我可以一个字符
  • 在python中合并3个dict()

    如果多个字典之间有公共字符串 是否有逻辑合并多个字典的方法 即使这些公共字符串在一个 dict 的值与另一个 dict 的键之间匹配 我在 SO 上看到了很多类似的问题 但似乎没有一个问题能解决我将 较低级别文件 中的多个键与较高键 值中的
  • nginx/uwsgi 服务器的持久内存中 Python 对象

    我怀疑这是否可能 但这是问题和提出的解决方案 提出的解决方案的可行性是这个问题的对象 我有一些需要可用于所有请求的 全局数据 我将这些数据保存到 Riak 并使用 Redis 作为缓存层以提高访问速度 目前 数据被分为约 30 个逻辑块 每
  • Python矩阵问题[重复]

    这个问题在这里已经有答案了 这是从这个线程继续的 Python矩阵 有什么解决方案吗 https stackoverflow com questions 5835583 python matrix any solution Input fr
  • 使用 scikit-learn 在朴素贝叶斯分类器中混合类别数据和连续数据

    我正在使用 Python 中的 scikit learn 开发分类算法来预测某些客户的性别 除此之外 我想使用朴素贝叶斯分类器 但我的问题是我混合了分类数据 例如 在线注册 接受电子邮件通知 等 和连续数据 例如 年龄 长度 会员资格 等
  • 如何使用 matplotlib 面向对象的 API 设置轴刻度和刻度标签

    我需要一些在 Python2 7 下的 Matplotlib pyplot 中绘图的帮助 我想生成一个具有以下 x 轴的图 x 轴应该是这样 https i stack imgur com zcosX jpg 我到目前为止通过使用myaxi
  • 安装 Ta-lib 会产生 gcc 错误

    当我尝试在我的 mac 上将 Ta lib 作为全局包安装时 出现 gcc 错误 我收到以下错误 gcc Wno unused result Wsign compare Wunreachable code DNDEBUG g fwrapv
  • 忽略覆盖率报告中的空文件

    覆盖率 py https github com nedbat coveragepy会包括 init py在其报告中并将其显示为 0 行 但覆盖率为 100 我想从覆盖率报告中排除所有空白文件 我不能只添加 init py to omit作为
  • 使用 Pytest 捕获 SystemExit 消息

    我正在使用 pytest 编写测试 我遇到了一些函数抛出异常的情况SystemExit如果输入错误 终端上会显示一些错误消息 我想为以下情况编写测试SystemExit抛出并验证输出错误消息中是否有特定字符串 这是代码 def test v
  • Python 调试器是否会介入生成器?

    我目前正在使用 NetBeans IDE 和 Jython 2 5 1 当逐步调试我的项目时 一旦遇到生成器的迭代 调试器就会直接转到代码末尾 输出工作正常 但是一旦满足第一个生成器就无法进行逐步调试 这是所有 Python IDE 中 P
  • PyGTK TreeView 中的自动换行

    如何在 PyGTK TreeView 中自动换行文本 gtk TreeView 中的文本是使用 gtk CellRendererText 渲染的 文本换行归结为在单元格渲染器上设置正确的属性 为了让文本换行 您需要设置wrap width单
  • Pygame 旋转射击

    我和几个朋友一直在编写一种有趣的新射击机制 为了让它发挥作用 我们需要朝玩家面对的方向射击 Sprite 正在使用 Pygame Transform Rotate 进行旋转 我们怎样才能找到一个角度 然后朝那个方向发射子弹呢 这是我们的精灵
  • 如何更改Python中的全局变量[重复]

    这个问题在这里已经有答案了 我正在尝试更改程序中的变量 我在程序开始时声明了一个全局变量 我想在程序中的不同函数中更改该变量 我可以通过再次声明函数内的变量来做到这一点 但我想知道是否有更好的方法来做到这一点 下面是一些测试代码来解释我的意
  • 连接 Flask Socket.IO Server 和 Flutter

    基本上 我有一个套接字 io 烧瓶代码 import cv2 import numpy as np from flask import Flask render template from flask socketio import Soc
  • 类型错误:对于仅使用浮点数的函数,返回数组必须是 ArrayType

    这个实在是难倒我了 我有一个计算单词权重的函数 我已经确认 a 和 b 局部变量都是 float 类型 def word weight term a term freq term print a type a b idf term prin
  • 使用 Python PuLP 混合整数规划的时间限制

    我一直在使用PuLP http pythonhosted org PuLP 解决我感兴趣的特定混合整数线性规划 MIP 但是 随着问题规模的增长 PuLP 花费的时间太长 我希望能够运行求解器一段时间 并在需要很长时间的情况下提前终止它 并

随机推荐

  • 使用 TStringList 的奇怪 EOutOfMemory 异常

    我有一个系统 它加载一些压缩到 log 文件中的文本文件 然后使用多个线程解析为信息类 每个线程处理不同的文件并将解析的对象添加到列表中 该文件是使用 TStringList 加载的 因为它是我测试过的最快的方法 文本文件的数量是可变的 但
  • 在 Python 中迭代模块

    所以我有一个嵌套文件夹 其中有执行某些操作的模块 注意 它们不是类 只是脚本 我想迭代这些模块 我现在拥有的 from scripts module 1 import train module 1 from scripts module 2
  • CouchDB Views - 列出函数性能影响?

    你们中的许多人都知道 couchdb 视图的响应如下 rows key 1 value Col1 Some Value key 2 value Col1 Another Value 好吧 我想将其整理为 key 1 value Col1 S
  • 如何更改作为参数传递给函数的变量?

    我试图通过使用返回 void 的函数来更改结构内的一些变量 该函数采用 Struct 成员作为参数 结构数组和大小 该函数有一些代码 最终会更改结构成员内的一些变量 但是 我知道当您将某些内容作为参数传递给函数时 您正在使用副本而不是原始文
  • 在 PHP 中通过 SSH 连接到 MySQL 服务器

    我想通过 ssh 建立一个到我的 mysql 服务器的 ssh 隧道 理想情况下 我会返回一个 mysqli db 指针 就像我直接连接一样 我所在的共享主机没有SSH2 http ca php net ssh2库 但我也许可以使用 PEC
  • 我能知道 BufferedImage 最初的文件类型是什么吗?

    在我的代码中 我有一个缓冲图像 http docs oracle com javase 7 docs api java awt image BufferedImage html那是装载有ImageIO http docs oracle co
  • qtextedit - 调整大小以适合

    我有一个QText编辑 https doc qt io qt 5 QTextEdit html充当 显示者 可编辑为 false 它显示的文本是自动换行的 现在我确实希望设置此文本框的高度 以便文本完全适合 同时也遵守最大高度 基本上 布局
  • docker-compose - 我可以在不重新启动容器的情况下更新 traefik 标签吗?

    我可以使用 docker compose 更新容器上的标签而不重新启动容器吗 理想场景 更改 docker compose yml 中的标签 保存 docker compose yml 运行命令来更新标签 无需重新启动容器 一般来说 更改容
  • Numpy:如何按列堆叠数组?

    假设我有 n 个相同长度的 numpy 数组 我现在想创建一个 numpy 矩阵 使得矩阵的每一列都是 numpy 数组之一 我怎样才能实现这个目标 现在我正在循环中执行此操作 但会产生错误的结果 注意 我必须能够迭代地将它们一一堆叠在一起
  • 从 void ** 到 char ** 的转换有多危险

    所以我们知道标准并不强制指针大小相等 here https stackoverflow com questions 1241205 are all data pointers of the same size in one platform
  • jQuery:如何获取表单提交时单击了哪个按钮?

    我有一个 submit 为表单提交设置的事件 我的页面上还有多个表单 但本示例仅提供一个表单 我想知道在没有应用的情况下单击了哪个提交按钮 click 事件对每个人来说 这是设置
  • HTTP 请求标头

    好的 我一直在使用原始 HTTP 请求 发现我可以将原始 HTTP 响应发布到 NSLog 中 并且我几乎已经将原始 HTTP 请求破解到 NSLog 中 我现在有点卡住了 代码示例 NSString CurrentWebURL webVi
  • 日历中的重复事件 - Rails

    我正在寻找对重复事件进行建模的最佳方法 我正在使用 fullcalendar 来显示事件 但我认为重复事件最好在 Rails 后端处理 我已经查看了其他问题和现有示例代码 但没有找到任何合适的内容 它的行为应该类似于谷歌日历 所以应该可以删
  • 如何通过新的 RTTI 设置事件处理程序? [D2010]

    在使用新的 RTTI 模块时 我找不到使用新实用程序设置事件处理程序的方法 尝试这样的事情 LProp TRttiContext Create GetType Form1 ClassInfo AsInstance GetProperty O
  • C语言中如何截断文件?

    我正在使用 C 将一些数据写入文件 我想删除文件中以前写入的文本 以防它比我现在写的长 我想减小文件的大小或截断直到最后 我怎样才能做到这一点 如果您想将文件的先前内容保留到一定长度 大于零的长度 其他答案提供了 则 POSIX 提供tru
  • 计算 Woocommerce 中每个订单状态的不同订单状态计数和总现金

    我需要在 woocommerce 查询中获取几天之间不同状态的订单总数 为了让它循环遍历某天之间的所有订单 我使用以下查询 args array post type gt shop order post status gt publish
  • 获取 I/art:显式并发标记清除 GC 释放

    我正在启动一个服务 gt 后台服务 并开始检查 新线程 中的文件 在日志中我得到以下内容 服务 应用程序被暂停 Log I art Explicit concurrent mark sweep GC freed 25935 1686KB A
  • 如何在 Android 上使用 MediaStore 将数据从相机保存到磁盘?

    对于我的应用程序 我一直在使用自己的 Camera 类来拍摄图像和自己的数据库 但很快我就无法真正跟上变化 我决定使用 Android 中的内置相机应用程序来完成这项工作 但是我似乎无法让它保存文件 我在这里缺少什么 应用程序似乎保存了文件
  • Magento - 使用购物车页面上的自定义模块添加自定义块

    我创建了一个自定义模块 并尝试在购物车表之后和总计框之前包含一个块 但我无法将其放在那个确切的位置 我可以让我的块出现在内容部分中 就在其他所有内容的下方 但不在中间 如果我覆盖 checkout xml 和 cart phtml 那么我可
  • 如何向 spaCy tokenizer 添加自定义规则以将 HTML 分解为单个标记?

    我知道有很多资源可以解决这个问题 但我无法让 spaCy 完全满足我的要求 我想向我的 spaCy 分词器添加规则 以便 HTML 标签 例如 br 等等 在我的文本中将是一个标记 我现在正在使用 merge noun chunks 管道