所以我在 NLP 工作了很长时间,这是一个你想要解决的非常棘手的问题。您永远无法以 100% 的准确率实施解决方案,因此您应该事先决定是做出假阴性决定(未能找到段落分割点)还是假阳性决定(插入虚假分割)更好点)。一旦你这样做了,组装一个文档语料库并注释你希望找到的真实分割点。
完成此操作后,您将需要一种机制来查找 EOS(句末)点。然后,在每对句子之间,你需要做出一个二元决定:是否应该在此处插入段落边界?
您可以根据不同的切分点来衡量每个段落中概念的凝聚力。例如,在一个包含五个句子 (ABCDE) 的文档中,有 16 种不同的分割方式:
ABCDE ABCD|E ABC|DE ABC|D|E AB|CDE AB|CD|E AB|C|DE AB|C|D|E
A|BCDE A|BCD|E A|BC|DE A|BC|D|E A|B|CDE A|B|CD|E A|B|C|DE A|B|C|D|E
为了测量衔接,您可以使用句子到句子的相似度度量(基于为每个句子提取的一些特征集合)。为简单起见,如果两个相邻句子的相似度度量为 0.95,那么将它们组合到同一段落中的“成本”为 0.05。文档分割计划的总成本是所有句子连接成本的总和。为了达到最终细分,您选择总成本最低的计划。
当然,对于包含多个句子的文档,有太多不同的可能分割排列来蛮力评估它们的所有成本。因此,您需要一些启发式方法来指导该过程。动态编程在这里可能会有所帮助。
至于实际的句子特征提取……嗯,这就是它变得非常复杂的地方。
您可能希望忽略高度句法的词(连接词,如介词、连词、助动词和从句标记),并将相似性建立在语义相关的词(名词和动词,以及在较小程度上的形容词和副词)上。
一个简单的实现可能只是计算每个单词的实例数,并将一个句子中的单词数与相邻句子中的单词数进行比较。如果一个重要的词(比如“Philadelphia”)出现在两个相邻的句子中,那么它们可能会得到很高的相似度分数。
但这样做的问题是,两个相邻的句子可能有非常相似的主题,即使这些句子有完全不重叠的词组。
因此,您需要评估每个单词的“意义”(其特定含义,给定周围的上下文)并将该含义概括为涵盖更广泛的领域。
例如,想象一个带有“greenish”这个词的句子。在我的特征提取过程中,我当然会包含确切的词汇值(“greenish”),但我也会应用形态变换,将单词规范化为其根形式(“green”)。然后我会在分类法中查找该词,发现它是一种颜色,可以进一步概括为视觉描述符。因此,基于这个词,我可能会在我的句子特征集合中添加四种不同的特征(“greenish”、“green”、“[color]”、“[visual]”)。如果文档中的下一句再次提到颜色“绿色”,那么这两个句子将非常相似。如果下一句使用“红色”这个词,那么它们仍然具有一定程度的相似性,
所以,有一些基本的想法。您可以无限地详细说明这些算法并调整算法以在您的特定数据集上表现良好。有上百万种不同的方法可以解决这个问题,但我希望其中一些建议对您有所帮助。