强制'parser'不分句?
Force 'parser' to not segment sentences?
有没有简单的方法告诉“解析器”管道不要更改 Token.is_sent_start
的值?
所以,故事是这样的:
我正在处理预判刑的文件(1 行 = 1 句),我只需要这种分段。我意识到解析器的分割并不总是与我的文档中的一样,所以我不想依赖它所做的分割。
我无法在解析器完成后更改分段,因此当它出错时我无法更正它(你得到一个错误)。如果我自己分割文本然后应用解析器,它会否决我刚刚所做的分割,所以它不起作用。
因此,为了强制保留原始分割并仍然使用预训练的转换器模型 (fr_dep_news_trf),我要么:
- 禁用解析器,
- 向 nlp 添加自定义管道以设置 Token.is_sent_start 我想要的方式,
- 使用
nlp("an example")
创建文档
或者,我只是用
创建一个文档
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
),然后 运行 解析器,它会覆盖您的值吗?如果是这样,最好有一个具体的例子,因为这听起来像是一个错误。
鉴于此,如果您使用自定义组件在解析器之前设置您的真实句子边界,它应该工作。
关于您的其他一些观点...
我认为将您的句子边界与解析器的边界分开没有任何意义 - 如果您这样做,您最终可能会得到跨越多个句子的子树,这将是奇怪且无益的。
您没有在问题中提及这一点,但是否将每个 sentence/line 视为一个单独的文档? (不清楚是你合并了多行而句子边界错了,还是你传入了一行但它变成了多个句子。)
有没有简单的方法告诉“解析器”管道不要更改 Token.is_sent_start
的值?
所以,故事是这样的: 我正在处理预判刑的文件(1 行 = 1 句),我只需要这种分段。我意识到解析器的分割并不总是与我的文档中的一样,所以我不想依赖它所做的分割。
我无法在解析器完成后更改分段,因此当它出错时我无法更正它(你得到一个错误)。如果我自己分割文本然后应用解析器,它会否决我刚刚所做的分割,所以它不起作用。
因此,为了强制保留原始分割并仍然使用预训练的转换器模型 (fr_dep_news_trf),我要么:
- 禁用解析器,
- 向 nlp 添加自定义管道以设置 Token.is_sent_start 我想要的方式,
- 使用
nlp("an example")
创建文档
或者,我只是用
创建一个文档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
),然后 运行 解析器,它会覆盖您的值吗?如果是这样,最好有一个具体的例子,因为这听起来像是一个错误。
鉴于此,如果您使用自定义组件在解析器之前设置您的真实句子边界,它应该工作。
关于您的其他一些观点...
我认为将您的句子边界与解析器的边界分开没有任何意义 - 如果您这样做,您最终可能会得到跨越多个句子的子树,这将是奇怪且无益的。
您没有在问题中提及这一点,但是否将每个 sentence/line 视为一个单独的文档? (不清楚是你合并了多行而句子边界错了,还是你传入了一行但它变成了多个句子。)