首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用BERT的偏移量向spacy文档对象添加实体

使用BERT的偏移量向spacy文档对象添加实体
EN

Stack Overflow用户
提问于 2020-09-17 14:43:15
回答 1查看 405关注 0票数 0

有没有办法使用BERT的偏移量将实体添加到spacy文档对象?问题是我的整个管道依赖于spacy,并且我使用的是spacy不提供支持的最新PUBMEDBERT。

因此,有时pubmedbert给出的实体偏移量不会导致spacy的有效范围,因为标记化是完全不同的。

到目前为止,我做了哪些工作来解决我的问题?我做了一个自定义标记器,要求spacy在标点符号上拆分,类似于bert,但在某些情况下,我就是不能制定规则。例如:

代码语言:javascript
运行
复制
text = '''assessment
Exdtve age-rel mclr degn, left eye, with actv chrdl neovas
Mar-10-2020
assessment'''

Pubmedbert预测13:17是一个实体,即dtve,但在spacy doc对象中添加span作为实体时,结果为NONE,因为它不是有效的span。

代码语言:javascript
运行
复制
span = doc.char_span(row['start'], row['end'], row['ent'])
doc.ents = list(doc.ents) + [span]
TypeError: object of type 'NoneType' has no len()

考虑行‘’start‘为13,行’and‘为17,行’label‘为标签

我该如何解决这个问题?我可以使用pubmedbert给出的起始和结束偏移量在spacy doc对象中添加实体吗?

会非常感谢你的帮助,谢谢。

EN

回答 1

Stack Overflow用户

发布于 2020-09-18 21:36:03

由于spacy在内部将实体存储为文档中令牌上的IOB标签,因此您只能添加与下面的完整令牌相对应的实体跨度。

如果您只使用此doc来存储这些实体(不使用任何其他组件,如来自另一个模型的标记器或解析器,这些组件需要不同的标记器),则可以创建一个与BERT模型具有相同标记化的文档:

代码语言:javascript
运行
复制
import spacy
from spacy.tokens import Doc

nlp = spacy.blank("en")
# bert_tokens = [..., "Ex", "dtve", ...]
words, spaces = spacy.util.get_words_and_spaces(bert_tokens, text)
doc = Doc(nlp.vocab, words=words, spaces=spaces)

然后,您应该能够将实体跨度添加到文档。

如果您需要基于不同的标记化的原始spacy标记化+实体,则必须调整实体字符偏移量以匹配spacy标记边界,以便添加它们。由于这在很大程度上取决于数据/任务(如果dtve是一个实体,那么Exdtve是否也必须是同一类型的实体?),您可能需要一个基于您的数据的自定义解决方案。如果您尝试调整实体跨度以与当前标记对齐,则可以使用token.idxlen(token)查看每个标记的字符起始和长度。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63932600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档