使用BERT偏移向spacy文档对象添加图元

2024-09-30 06:12:41 发布

您现在位置:Python中文网/ 问答频道 /正文

是否有任何方法可以使用BERT的偏移量将实体添加到spacy文档对象?问题是我的整个管道都依赖于spacy,我使用的是spacy不支持的最新PUBMEDBERT

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

到目前为止,我做了什么工作来解决我的问题? 我通过要求spacy在标点符号上拆分来定制标记器,类似于bert,但在某些情况下我无法制定规则。例如:

text = '''assessment
Exdtve age-rel mclr degn, left eye, with actv chrdl neovas
Mar-10-2020
assessment'''

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

span = doc.char_span(row['start'], row['end'], row['ent'])
doc.ents = list(doc.ents) + [span]
TypeError: object of type 'NoneType' has no len()

考虑行[ [开始] ]为13,行[ [结束] ]为17,行[〔Enter〕〕为标号

我怎样才能解决这个问题?我是否可以使用pubmedbert给出的起始和结束偏移量在spacy doc对象中添加实体

非常感谢您在这方面的帮助,谢谢


Tags: 对象方法文档标记实体doc管道spacy
1条回答
网友
1楼 · 发布于 2024-09-30 06:12:41

因为spacy将实体作为IOB标记存储在文档中的令牌上,所以您只能在下面添加对应于完整令牌的实体范围

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

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)

然后,您应该能够将实体范围添加到文档中

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

相关问题 更多 >

    热门问题