强制“解析器”不分割句子?

问题描述

是否有一种简单的方法可以告诉“解析器”管道不要更改 Token.is_sent_start 的值?

所以,故事是这样的: 我正在处理预先分词的文档(1 行 = 1 句),这个分词就是我所需要的。我意识到解析器的分割并不总是和我的文档中的一样,所以我不想依赖它所做的分割。

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

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

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

或者,我只是用

创建一个文档
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),然后运行解析器,它是否会覆盖您的值?如果是这样,最好有一个具体的例子,因为这听起来像是一个错误。

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

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

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

您没有在问题中提到这一点,但是将每个句子/行视为一个单独的文档是一种选择吗? (不清楚是多行合并句子边界不对,还是单行传入却变成了多个句子。)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...