如何解决强制“解析器”不分割句子?
是否有一种简单的方法可以告诉“解析器”管道不要更改 Token.is_sent_start
的值?
所以,故事是这样的: 我正在处理预先分词的文档(1 行 = 1 句),这个分词就是我所需要的。我意识到解析器的分割并不总是和我的文档中的一样,所以我不想依赖它所做的分割。
解析器完成后我无法更改分段,因此当它出错时我无法纠正它(你得到一个错误)。如果我自己分割文本然后应用解析器,它会否决我刚刚所做的分割,所以它不起作用。
因此,为了强制保留原始分段并仍然使用预训练的转换器模型 (fr_dep_news_trf),我要么:
或者,我只是用
创建一个文档doc = Doc(words=["an","example"],sent_starts=[True,False])
然后我应用管道的每个元素,除了解析器。
但是,如果我在某个时候仍然需要解析器(我这样做,因为我需要知道一些子树),如果我只是将它应用于我的文档,它会否决已经到位的分段,因此,在某些情况下,分割不正确。所以我做了以下解决方法:
- 在列表中保留正确的细分
sentences = list(doc.sents)
- 在文档上应用解析器
- 使用解析器计算的任何句法信息
- 从我之前制作的列表中检索我需要的任何句子信息,因为我现在无法信任
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 不会发生这种情况,但这只是在某些标记的句子边界未设置的情况下。
如果您将所有标记边界设置为 True
或 False
(不是 None
),然后运行解析器,它是否会覆盖您的值?如果是这样,最好有一个具体的例子,因为这听起来像是一个错误。
鉴于此,如果您使用自定义组件在解析器之前设置真正的句子边界,它应该就可以了。
关于你的其他一些观点......
我认为将句子边界与解析器的边界分开没有任何意义 - 如果这样做,您最终会得到跨越多个句子的子树,这只会很奇怪且无用。
您没有在问题中提到这一点,但是将每个句子/行视为一个单独的文档是一种选择吗? (不清楚是多行合并句子边界不对,还是单行传入却变成了多个句子。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。