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