SpanRuler 在重新标记的词元上链接回原始词元文本,而不是引入分隔符后的文本
目标:首先把一个标记分成两个标记。然后使用 SpanRuler
给这两个重新标记的标记打上一个标签,作为一个整体的范围。
问题:被标记的范围是原始文本(一个单一的标记),而不是两个标记之间有空格连接起来的样子(也就是在重新标记之后的样子)。
我做了什么:
我添加了一个自定义的分词器作为第一步。它能正确地把一个单一的标记分成两个标记。
然后我用 SpanRuler 检测这两个(分开的)标记。注意,SpanRuler 适用于两个分开的标记的模式(比如模式=['abc', 'efg']),如果模式是原来的单一标记(模式='abcefg'),它就不会检测到任何东西。
注意,自定义的重新标记器遵循 Spacy 的非破坏性重新标记原则。
感谢任何帮助。
最小可复现示例:
import spacy
from spacy.language import Language
@Language.component('splitter')
def splitter(doc):
with doc.retokenize() as retokenizer:
retokenizer.split(doc[0], ['abc', 'efg'], heads=[doc[0], doc[0]])
return doc
nlp = spacy.load('en_core_web_sm'])
nlp.add_pipe('splitter', first=True)
sp_ruler = nlp.add_pipe('span_ruler')
sp_ruler.add_patterns([{'label': 'testing', 'pattern': [{'TEXT': 'abc'}, {'TEXT': 'efg'}]}])
doc = nlp('abcefg')
print([(tok.text, i) for i, tok in enumerate(doc)])
print([(type(span), span.text, span.label_) for span in doc.spans["ruler"]])
print(len(doc.spans['ruler']))
实际输出:
> [('abc', 0), ('efg', 1)]
> [(<class 'spacy.tokens.span.Span'>, 'abcefg', 'testing')]
> 1
预期输出:
> [('abc', 0), ('efg', 1)]
> [(<class 'spacy.tokens.span.Span'>, 'abc efg', 'testing')] # notice the space in the text, expected due to custom re-tokenization
> 1
0 个回答
暂无回答