将文本解析成句子?

4
我试图从PDF页面中解析出句子,但这比我预期的要困难得多。有许多特殊情况需要考虑,例如缩写、小数、引用等,它们包含句号但不一定结束句子。
我想知道这里是否有人熟悉C或C++的NLP库,可以帮助我完成这个任务或提供任何建议?
感谢您的帮助。
4个回答

6
这是一个被称为“句子边界消歧”的问题。关于它的维基百科页面列出了一些库,但我不确定是否有任何一个库易于从C中调用。
可以找到许多关于句子边界消歧理论的论文。Unicode标准在Unicode标准附录#29-Unicode文本分割中也定义了一种简单的句子边界检测算法。

3

句子边界消歧(SBD)是自然语言处理领域中的一个核心问题。不幸的是,我以前发现和使用的工具都不是用C编写的(因为它不是字符串操作的首选语言,除非速度是主要问题)。

流水线

如果可能的话,我会创建一个简单的流水线 - 如果在Unix系统上,这应该不是问题,但即使你在Windows上使用脚本语言,你也应该能够填补空白。这意味着SBD可以成为最适合工作的工具,而不仅仅是你能找到的Z语言唯一的SBD。例如,

./pdfconvert | SBD | my_C_tool > ...

这是我工作中的标准做法,除非您有比已述要求更严格的要求,否则应该没有问题。
工具
关于可使用的工具,
我建议使用MXTERMINATOR,这是一个使用最大熵模型的SBD工具,我的导师们最近在他们自己的工作中使用了它。据他们所说,它确实错过了一些句子分割,但这很容易通过sed脚本来修复。他们正在对天文论文进行SBD。主要网站目前似乎已经关闭,但此处有一个FTP镜像可用。 OpenNLP在Java中重新实现了上述算法,使用最大熵模型(JavaDoc),并且更新更及时,背后似乎有一个更强大的社区支持。
还有Sentrick和许多其他工具。此处有一个较旧的列表,可能会有用。

模型和训练

现在,一些工具可能会直接给你良好的结果,但有些则不行。OpenNLP自带英文句子检测模型,这可能适用于您。然而,如果您的领域与工具训练的领域显著不同,则它们可能表现不佳。例如,如果它们是在报纸文本上进行训练的,那么它们在这个任务上可能非常出色,但在处理信件时可能很糟糕。

因此,您可能需要通过提供示例来训练SBD工具。每个工具都应该记录此过程,但我要警告您,这可能需要一些工作量。它需要您在文档X上运行工具,逐个检查并手动修正任何错误的分割,并将正确分割的文档X返回给工具进行训练。根据文档的大小和所涉及的工具,您可能需要对一个或一百个文档执行此操作,直到获得合理的结果。

祝您好运,如果您有任何问题,请随时提问。


2

这是一个自然语言分析问题,而不是计算机语言的问题。因此,永远不会有简单的答案。但是,如果我们知道您为什么要将PDF拆分成句子以及您在获取这些句子后想要做什么,可能会有一些启发式方法可以应用并推荐给您。


我正在将PDF文件拆分成句子,以实现“重新排版”的目的。我将从这些拆分出来的所有句子创建一个新的标记化PDF,以便稍后更容易进行操作。 - 101010110101
那么你的问题不应该是“如何将PDF转换为支持重排的格式?”或类似的问题吗? - anon
Reflow并未得到解决,因此我试图将其分解成若干部分。第一步是获得一个格式正确的句子。 - 101010110101

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接