python-3.x - 如何引用一些特殊的词(注册号)不被 Spacy 标记?
问题描述
我在文本中有一些数字,我想将其保留为一句话。他们中有一些:
7-2017-19121-B
7-2016-26132
wd/2012/0616
JLG486-01
H14-0890-12
我怎样才能保护他们不被言语分开。我已经将正则表达式用于自定义标记器,从不使用破折号分割单词,但它只适用于字母而不是数字。我不想更改很大且非常复杂的默认正则表达式。我怎样才能轻松做到?
我已经做的是使用那些“连字符保护器”。因为7-2014-1721-Y
我得到了令牌[7,-,2014,-,1721-Y]
,所以最后一个短语没有分开,但前一个是。正如我所说,代码很复杂,希望添加相同的代码以包含数字实体的此类操作。
这是功能:
def custom_tokenizer(nlp):
prefix_re = compile_prefix_regex(nlp.Defaults.prefixes)
suffix_re = compile_suffix_regex(nlp.Defaults.suffixes)
# changing default infixed
def_infx = nlp.Defaults.infixes
cur_infx = (d.replace('-|–|—|', '') for d in def_infx)
infix_re = compile_infix_regex(cur_infx)
return Tokenizer(nlp.vocab, prefix_search=prefix_re.search, suffix_search=suffix_re.search,
infix_finditer=infix_re.finditer, token_match=None)
也许除了修改之外还有一些更简单的方法?我试图用一些转义字符来引用这些“盘子”,{7-2017-19121-B}
但它不起作用。
顺便说一句,有一个匹配这些特殊“数字”的正则表达式。也许对我来说解决方法只是将它们从文本中删除(我稍后会尝试)但现在我问我是否有机会。
["(?=[^\d\s]*\d)(?:[a-zA-Z\d]+(?:/[a-zA-Z\d]+)+)", "(?:[[A-Z\d]+(?:[-][A-Z\d]+)+)"]
暗示。我发现根据需要从更改7-2017-19121-B
为7/2017/19121/B
工作。问题是(让我检查)我怎样才能使它适应我当前的代码并保持我现在的性能。
解决方案
您可以将它们添加为“特殊情况”:
nlp.tokenizer.add_special_case("7-2017-19121-B", [{ORTH: "7-2017-19121-B"}])
...
nlp.tokenizer.add_special_case("H14-0890-12", [{ORTH: "H14-0890-12"}])
测试:
print([w.text for w in nlp("Got JLG486-01 and 7-2017-19121-B codes.")])
# => ['Got', 'JLG486-01', 'and', '7-2017-19121-B', 'codes', '.']
推荐阅读
- java - Liquibase:链接来自测试的主要 yaml 变更日志
- java - 重启 Linux 应用程序后 MySQL 表为空
- lets-encrypt - certbot 和 certbot-auto 之间的区别
- c# - 如何使用 c# 通过 SlackAPI 上传文件 - 没有图像 - 并同时将其评论到 Slack
- vuejs2 - Here Maps 使用 Vue 时将信息气泡添加到地图
- python - 在视图装饰器中获取经过身份验证的用户
- spring - 在 Hibernate 多对多映射中需要以下场景的解决方案
- c# - JWT 令牌在给定的过期时间之前过期
- excel - Excel VBA对包含重复项的有序列中的每个不同值仅显示一次下拉列表
- javascript - 如何使用 javascript 从对象数组中获取所需的数据?