Spacy 实体规则不适用于基数(社会安全号码)

2024-06-19

我已使用实体规则为社会保障号添加新标签。 即使设置了 overwrite_ents=true 但它仍然无法识别

我验证了正则表达式是正确的。不知道我还需要做什么 我之前尝试过=“ner”但结果相同

text = "My name is yuyyvb and I leave on 605 W Clinton Street. My social security 690-96-4032"
nlp = spacy.load("en_core_web_sm")
ruler = EntityRuler(nlp, overwrite_ents=True)
ruler.add_patterns([{"label": "SSN", "pattern": [{"TEXT": {"REGEX": r"\d{3}[^\w]\d{2}[^\w]\d{4}"}}]}])
nlp.add_pipe(ruler)
doc  = nlp(text)
for ent in doc.ents:
    print("{} {}".format(ent.text, ent.label_))

实际上,您拥有的 SSN 被 spacy 标记为 5 个块:

print([token.text for token in nlp("690-96-4032")])
# => ['690', '-', '96', '-', '4032']

因此,要么使用自定义分词器-数字之间的值不会拆分为单独的标记,或者 - 更简单 - 为连续 5 个标记创建一个模式:

patterns = [{"label": "SSN", "pattern": [{"TEXT": {"REGEX": r"^\d{3}$"}}, {"TEXT": "-"}, {"TEXT": {"REGEX": r"^\d{2}$"}}, {"TEXT": "-"}, {"TEXT": {"REGEX": r"^\d{4}$"}} ]}]

完整的 spacy 演示:

import spacy
from spacy.pipeline import EntityRuler

nlp = spacy.load("en_core_web_sm")
ruler = EntityRuler(nlp, overwrite_ents=True)
patterns = [{"label": "SSN", "pattern": [{"TEXT": {"REGEX": r"^\d{3}$"}}, {"TEXT": "-"}, {"TEXT": {"REGEX": r"^\d{2}$"}}, {"TEXT": "-"}, {"TEXT": {"REGEX": r"^\d{4}$"}} ]}]
ruler.add_patterns(patterns)
nlp.add_pipe(ruler)

text = "My name is yuyyvb and I leave on 605 W Clinton Street. My social security 690-96-4032"
doc = nlp(text)
print([(ent.text, ent.label_) for ent in doc.ents])
# => [('605', 'CARDINAL'), ('690-96-4032', 'SSN')]

So, {"TEXT": {"REGEX": r"^\d{3}$"}}匹配仅由三位数字组成的令牌,{"TEXT": "-"} is a -字符等

用 spacy 覆盖连字符数字标记化

如果您对如何通过覆盖默认标记化来实现它感兴趣,请注意infixes https://github.com/explosion/spaCy/blob/58533f01bf926546337ad2868abe7fc8f0a3b3ae/spacy/lang/punctuation.py#L36: the r"(?<=[0-9])[+\-\*^](?=[0-9-])"正则表达式使 spacy 将连字符分隔的数字拆分为单独的标记。使1-2-3 and 1-2就像子字符串被标记为单个标记一样,删除-来自正则表达式。好吧,你不能这样做,这要棘手得多:你需要用 2 个正则表达式替换它:r"(?<=[0-9])[+*^](?=[0-9-])" and r"(?<=[0-9])-(?=-)"因为事实上-也在数字之间进行检查((?<=[0-9])) 和一个连字符(参见(?=[0-9-])).

所以,整个事情看起来像

import spacy
from spacy.tokenizer import Tokenizer
from spacy.pipeline import EntityRuler
from spacy.util import compile_infix_regex

def custom_tokenizer(nlp):
    # Take out the existing rule and replace it with a custom one:
    inf = list(nlp.Defaults.infixes)
    inf.remove(r"(?<=[0-9])[+\-\*^](?=[0-9-])")
    inf = tuple(inf)
    infixes = inf + tuple([r"(?<=[0-9])[+*^](?=[0-9-])", r"(?<=[0-9])-(?=-)"]) 
    infix_re = compile_infix_regex(infixes)

    return Tokenizer(nlp.vocab, prefix_search=nlp.tokenizer.prefix_search,
                                suffix_search=nlp.tokenizer.suffix_search,
                                infix_finditer=infix_re.finditer,
                                token_match=nlp.tokenizer.token_match,
                                rules=nlp.Defaults.tokenizer_exceptions)

nlp = spacy.load("en_core_web_sm")
nlp.tokenizer = custom_tokenizer(nlp)
ruler = EntityRuler(nlp, overwrite_ents=True)
ruler.add_patterns([{"label": "SSN", "pattern": [{"TEXT": {"REGEX": r"^\d{3}\W\d{2}\W\d{4}$"}}]}])
nlp.add_pipe(ruler)

text = "My name is yuyyvb and I leave on 605 W Clinton Street. My social security 690-96-4032. Some 9---al"
doc = nlp(text)
print([t.text for t in doc])
# =>  ['My', 'name', 'is', 'yuyyvb', 'and', 'I', 'leave', 'on', '605', 'W', 'Clinton', 'Street', '.', 'My', 'social', 'security', '690-96-4032', '.', 'Some', '9', '-', '--al']
print([(ent.text, ent.label_) for ent in doc.ents])
# => [('605', 'CARDINAL'), ('690-96-4032', 'SSN'), ('9', 'CARDINAL')]

如果你遗漏了r"(?<=[0-9])-(?=-)", the ['9', '-', '--al']会变成'9---al'.

NOTE你需要使用^\d{3}\W\d{2}\W\d{4}$ regex: ^ and $匹配令牌的开始和结束(否则,部分匹配的令牌也将被识别为 SSN)并且[^\w]等于\W.

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

Spacy 实体规则不适用于基数(社会安全号码) 的相关文章

  • 如何设置障碍来阻止玩家穿过墙壁

    快速注释 这是我的 A Level NEA 编程项目 有两个主要部分 第一个部分生成迷宫 用户必须在给定时间段内浏览迷宫 该时间段当前尚未实现 第二个部分用户必须回答教育物理问题才能获得最好成绩 问题是从我的系统本地存储的文本文件导入的 然
  • 如何将 pip 3 与 Python 3.4 结合使用?

    我的操作系统是Lubuntu https en wikipedia org wiki Lubuntu14 04 和默认的 Python 版本是 Python 2 7 6 但在 usr bin 它说我已经安装了Python 3 4 当我运行p
  • 如何从 JSON 文件中删除反斜杠

    我想创建一个像这样的 json 文件 946705035 4 946706692 4 我正在选取一个仅包含 Unix 时间戳的列并对它们进行分组 result data Last Modified Date unixtimestamp no
  • pip 安装在共享目录上(Windows)

    我尝试创建自己的 Pypi 存储库 尊重https www python org dev peps pep 0503 https www python org dev peps pep 0503 我的想法是将其放在共享目录中 我使用的是 W
  • 测试字典的所有值是否相等 - 当值未知时

    我有两本词典 每个字典中的值should人人平等 BUT我不知道这个数字会是多少 dict1 xx A yy A zz A dict2 xx B yy B zz B N B A 不等于 B N B A 和 B 实际上都是十进制数字字符串 例
  • 如何使用 Apache Hello World 将最新 (2020) Django 安装到 AWS EC2 Linux 2 实例和服务器

    我缺少什么 这是我第一次尝试使用 Django Django 中内置的服务器可以在本地很好地提供该文件 但我无法让 Apache 执行相同的操作 以下是我在一个全新的 干净的 Linux 2 实例上所做的事情 sudo yum update
  • 从点集合创建 .stl 文件

    因此 我使用的软件接受轮廓或 stl 文件形式的 3D 对象 我的轮廓沿着 z 平面 每个平面都有一个唯一的 z 我必须修改实验的轮廓 现在轮廓对于每个平面没有唯一的 z 它们现在与 z 0 平面略有角度 这些点代表 3D 对象的边缘 获取
  • 尝试在 PyQt5 中的 pyqtgraph 绘图小部件中获取带有坐标显示的光标

    我正在尝试在 PyQt5 的 pqytplot 图小部件中添加光标位置的读数 我发现这段代码可以实现我想要的功能 但是在一个独立的窗口中 所有这些都在一个程序文件中 import pyqtgraph as pg from pyqtgraph
  • 如何根据列行拆分数据框

    我有一个 Excel 文件 数据框有 20 行 几行之后再次出现列名称行 我想根据列名称行划分数据帧 这是示例 x 0 1 2 3 4 x 23 34 5 6 预期输出是 df1 x 0 1 2 3 4 df2 x 23 34 5 6 考虑
  • 抓取问题:“检查元素”与“查看页面源代码”不同

    我正在尝试对一个网页进行网络抓取 该网页内部包含多个选项卡 当我单击所需的选项卡并显示其内容后 首先出现两个问题 1 网页地址不会更改 并且所有选项卡都相同 2 当我使用浏览器 firefox和chrome 的 查看页面源 查看页面源时 所
  • 在 python 中编写轮询函数的更好方法

    我写了一个轮询函数来检查reg result可变 120 秒 reg result 0 while timeout time time 120 while reg result is not REGISTERED and time time
  • Python:kwargs.pop() 和 kwargs.get() 之间的区别

    我已经看到了这两种方法 但我不明白有什么区别以及我应该使用什么作为 最佳实践 def custom function kwargs foo kwargs pop foo bar kwargs pop bar def custom funct
  • 为什么我在迭代 28 后收到错误:“JSONDecodeError:期望值:第 1 行第 1 列(字符 0)”? [复制]

    这个问题在这里已经有答案了 我正在尝试从政府的 API 中提取数据 该 API 分为多个页面 每页有 10 个观察结果 我编写了一个算法 可以从每个观察中获取重要信息并将其添加到 pandas 数据框中 一切都很顺利 直到我到达迭代 29
  • 如何构建可嵌入的 Python

    我想知道如何为 Windows 构建可嵌入的 Python 找不到该特定包的任何信息或构建配置 我问的原因是我可以在 Mac 和 Linux 上使用相同的变体 最近 我必须为 64 位 Python 3 5 6 构建一个可嵌入的 zip 因
  • numba vstack 不适用于数组列表

    对我来说很奇怪的是 当输入是数组列表时 vstack 不能与 Numba 一起使用 它仅在输入是数组元组时才起作用 示例代码 nb jit nopython True def stack items return np vstack ite
  • 在 Selenium 中自动执行下拉菜单而不选择

    我正在尝试使用 Selenium 从下拉列表中选择一个元素 我已经能够选择下拉列表 但我不知道如何从下拉列表中选择特定元素 因为该网站不使用 select 因此我无法使用内置的 select 类 作为参考 这是下拉列表中元素之一的 HTML
  • 将黑白图像完全转换为一组线条(也称为仅使用线条进行矢量化)

    我有许多黑白图像 想将它们转换为一组线条 这样我就可以完全或至少接近完全地从线条重建原始图像 换句话说 我试图将图像矢量化为一组线条 我已经看过了霍夫线变换 https docs opencv org2 4 modules imgproc
  • 在 Pandas UDF PySpark 中传递多列

    我想计算 PySpark DataFrame 两列之间的 Jaro Winkler 距离 Jaro Winkler 距离可通过所有节点上的 pyjarowinkler 包获得 pyjarowinkler 的工作原理如下 from pyjar
  • Flask 从线程中删除会话变量

    我尝试实施投票系统 它的工作原理是这样的 如果用户对帖子进行投票 我会在会话变量中记录其临时状态 已投票 已加星标等 如果当前用户在我将结果保存到临时表之前尚未投票 用户可以在 5 分钟内更改投票 5 分钟后 结果将使用线程永久写入数据库
  • Pandas 如何删除包含所需字符串的行

    我想删除包含所需字符串的所有行 假设我有以下数据框 A B C 1 a x w g n 3 l p j p v 我想删除包含字符串的所有行p 我已经搜索过它 但大多数答案都是基于列名称 就我而言 我不会知道它可以出现在任何列中 输出数据帧应

随机推荐