有没有一种简单的方法可以告诉“解析器”管道不要更改 的值Token.is_sent_start
?
所以,故事是这样的:我正在处理预先句子化的文档(1 行 = 1 个句子),我只需要这个分割。我意识到解析器的分段并不总是与我的文档中的相同,所以我不想依赖它所做的分段。
解析器完成后我无法更改分段,所以当它出错时我无法纠正它(你得到一个错误)。如果我自己分割文本然后应用解析器,它会否决我刚刚进行的分割,所以它不起作用。
因此,为了强制保留原始分割并仍然使用预训练的变压器模型(fr_dep_news_trf),我要么:
- 禁用解析器,
- 将自定义管道添加到 nlp 以设置 Token.is_sent_start 我想要的方式,
- 创建文档
nlp("an example")
或者,我只是创建一个 Doc
doc = Doc(words=["an", "example"], sent_starts=[True, False])
然后我应用管道的每个元素,除了解析器。
但是,如果我在某些时候仍然需要解析器(我确实需要,因为我需要知道一些子树),如果我只是将它应用于我的 Doc,它会否决已经存在的分段,所以,在某些情况下,分段不正确。所以我做了以下解决方法:
- 在列表中保留正确的分段
sentences = list(doc.sents)
- 在文档上应用解析器
- 使用解析器计算的任何语法信息
- 从我之前制作的列表中检索我需要的任何句子信息,因为我现在无法信任
Token.is_sent_start
。
它有效,但感觉不太对劲,感觉有点乱。我错过了一种更简单,更清洁的方式吗?
我正在考虑的其他事情是设置自定义扩展,例如,我会使用Token._.is_sent_start
而不是 defaultToken.is_sent_start
和 custom Doc._.sents
,但我担心它可能比有用更令人困惑......
一些用户建议使用span.merge()
一个非常相似的主题,但在 spaCy 的最新版本中似乎不存在该功能(防止 spaCy 将段落编号拆分为句子)