强制'parser'不分句?

Force 'parser' to not segment sentences?

有没有简单的方法告诉“解析器”管道不要更改 Token.is_sent_start 的值?

所以,故事是这样的: 我正在处理预判刑的文件(1 行 = 1 句),我只需要这种分段。我意识到解析器的分割并不总是与我的文档中的一样,所以我不想依赖它所做的分割。

我无法在解析器完成后更改分段,因此当它出错时我无法更正它(你得到一个错误)。如果我自己分割文本然后应用解析器,它会否决我刚刚所做的分割,所以它不起作用。

因此,为了强制保留原始分割并仍然使用预训练的转换器模型 (fr_dep_news_trf),我要么:

  1. 禁用解析器,
  2. 向 nlp 添加自定义管道以设置 Token.is_sent_start 我想要的方式,
  3. 使用 nlp("an example")
  4. 创建文档

或者,我只是用

创建一个文档
doc = Doc(words=["an", "example"], sent_starts=[True, False])

然后我应用管道的每个元素,除了解析器。

但是,如果我在某些时候仍然需要解析器(我确实需要解析器,因为我需要知道一些子树),如果我只是将它应用到我的文档上,它会否决已经存在的分段,所以,在某些情况下,分割是不正确的。所以我做了以下解决方法:

  1. 在列表中保留正确的分段sentences = list(doc.sents)
  2. 在文档上应用解析器
  3. 使用解析器计算的任何语法信息
  4. 从我之前制作的列表中检索我需要的任何句子信息,因为我现在无法信任 Token.is_sent_start

可以用,但是恕我直言,感觉不太对劲,感觉有点乱。有没有我错过的更简单、更简洁的方法?

我正在考虑的其他事情是设置自定义扩展名,例如,我会使用 Token._.is_sent_start 而不是默认 Token.is_sent_start 和自定义 Doc._.sents,但是我担心这可能比帮助更令人困惑......

一些用户建议使用 span.merge() 来处理一个非常相似的主题,但该功能似乎在最近发布的 spaCy (Preventing spaCy splitting paragraph numbers into sentences)

中不存在

如果句子边界是预先设置的,解析器应该会遵守它们。 one outstanding bug 不会发生这种情况,但这只是在某些标记未设置句子边界的情况下。

如果您将所有标记边界设置为 TrueFalse(而不是 None),然后 运行 解析器,它会覆盖您的值吗?如果是这样,最好有一个具体的例子,因为这听起来像是一个错误。

鉴于此,如果您使用自定义组件在解析器之前设置您的真实句子边界,它应该工作。

关于您的其他一些观点...

我认为将您的句子边界与解析器的边界分开没有任何意义 - 如果您这样做,您最终可能会得到跨越多个句子的子树,这将是奇怪且无益的。

您没有在问题中提及这一点,但是否将每个 sentence/line 视为一个单独的文档? (不清楚是你合并了多行而句子边界错了,还是你传入了一行但它变成了多个句子。)