微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

是否有一种简单的方法可以告诉“解析器”管道不要更改 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),然后运行解析器,它是否会覆盖您的值?如果是这样,最好有一个具体的例子,因为这听起来像是一个错误。

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?