有没有办法使用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作为实体时,结果为NONE,因为它不是有效的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()考虑行‘’start‘为13,行’and‘为17,行’label‘为标签
我该如何解决这个问题?我可以使用pubmedbert给出的起始和结束偏移量在spacy doc对象中添加实体吗?
会非常感谢你的帮助,谢谢。
发布于 2020-09-18 21:36:03
由于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)然后,您应该能够将实体跨度添加到文档。
如果您需要基于不同的标记化的原始spacy标记化+实体,则必须调整实体字符偏移量以匹配spacy标记边界,以便添加它们。由于这在很大程度上取决于数据/任务(如果dtve是一个实体,那么Exdtve是否也必须是同一类型的实体?),您可能需要一个基于您的数据的自定义解决方案。如果您尝试调整实体跨度以与当前标记对齐,则可以使用token.idx和len(token)查看每个标记的字符起始和长度。
https://stackoverflow.com/questions/63932600
复制相似问题