nlp - 将段落拆分为有意义的子段落
问题描述
通常,一个段落包含许多子段落,每个子段落都有一定的含义。
在 NLP 中,如何将段落拆分为有意义的子段落,或者换句话说,我想检测子段落之间的边界
解决方案
您所说的问题很有趣,但定义不明确,因为“含义”本身定义不明确,我们实际上不知道如何区分段落的好分区和坏分区。
但是,我们可以将问题简化为:如果它们的主题相似,即它们是关于相同或相似的对象,或者包含其他相似的单词或短语,我们希望将相邻的句子组合在一起。因此我们可以正式地描述我们的算法:
- 将段落分成句子。
- 将每个句子表示为一些正式的对象(例如,一个词袋,或来自 w2v、fasttext、ELMO 或 BERT 的词嵌入袋,或来自某些神经网络(如 USE)的句子嵌入)。
- 计算每对句子之间的距离(例如,句子嵌入或单词计数之间的余弦距离,或单词嵌入之间的单词移动距离)。
- 在这个距离矩阵上运行一个凝聚聚类算法,有一个额外的限制:只有相邻的聚类可以合并在一起。
- 尝试使用不同的停止标准(通常是阈值)对不同段落进行聚类,并选择产生最有意义的分区的阈值。
如果这个算法看起来像你想要的,我可以在 Python 中提供它的基线实现。
Upd请用我的基本实现来看看这个要点:Spacy sentenizer + Spacy 句子向量的余弦相似度 + 仅基于相邻句子的朴素聚类。 https://gist.github.com/avidale/e4450da902d36bb14c595987943120dc
推荐阅读
- javascript - Jasmine 如何测试返回 httpClient observable 的函数?
- r - R:在命令行中显示计算结果
- django - 在 Apache httpd 服务器中部署两个 Django 应用程序的正确方法?
- c++ - 在 TEST 宏 googletest 中的任何地方抛出异常时测试失败
- oracle - 创建交互式报表时的 Oracle APEX ORA-01722
- c# - C# - 在使用 XMLSchemaInference 生成 XSD 文件后,允许在 XSD 文件中使用任意顺序的元素
- c++ - 有什么方法可以在一个语句中声明多个朋友类?
- android - 我无法从内部存储发送带有 Intent 的位图
- python - 在 pyspark 2.1.0 中,如何使用十进制值更新列?
- html - 如何使用 Bootstrap 4 获得以下结果