我想使用python脚本从大量科学论文中提取摘要。论文全部保存为大型csv中的字符串。我想要这样的事情:extracting text between two headers我可以写一个正则表达式来找到'Abstract'标题。然而,找到下一部分标题证明是困难的。标题因纸张而异。它们可以是ALL CAPS或Just Capitalized。它们可以是一个单词或一个长短语,跨越两行。它们通常后面跟着两个换行符。这就是我想出的: - >
abst = re.findall(r'(?:ABSTRACT\s*\n+|Abstract\s*\n+)(.*?)((?:[A-Z]+|(?:\n(?:[A-Z]+|(?:[A-Z][a-z]+\s*)+)\n+)',row[0],re.DOTALL)
以下是摘要的示例:
'... \ nAbstract \ nFactorial隐马尔可夫模型(FHMMs)是强大的模型 顺序\ ndata但它们不能很好地扩展到长序列。我们 为FHMM提出可扩展的推理和学习算法 借鉴随机\变分推理,神经系统的思想 网络和copula文献。与现有方法不同, 提出的算法在\ nlatent中不需要消息传递过程 变量并可以分发到计算机网络以加快速度 学习。我们的实验证实了所提算法的确如此 与经过验证的相比,没有引入进一步的近似偏差 结构化平均场算法,\ n并实现更好的性能 长序列和大型FHMM。\ n \ n1 \ n \ n简介\ n \ n ...'
所以我试图找到'摘要'和'简介'并提取它们之间的文本。然而,它可能是'摘要'和'引言',或摘要和'单层网络和平均场\ n \ nPROXXXATION \ n'
帮助?
答案 0 :(得分:1)
认识到下一部分有点模糊 - 或许我们可以依赖抽象部分以两个换行结束?
ABSTRACT\n(.*)\n\n
或许我们只是假设下一节标题将以大写字母开头,后跟任意数量的单词字符。 (同样,这也很模糊,并假设摘要中没有\n\n
。
ABSTRACT\n(.*)\n\n\U[\w\s]*\n\n
也许这会刺激你的进一步摆弄...随意发布不匹配的例子 - 也许我们可以逐步完善它。 N.B :正如Wiktor指出的那样,我无法使用不区分大小写的修饰符。所以整个rx应该与开关一起用于不区分大小写的匹配。
Update1:这里的挑战实际上是如何识别新部分已经开始......而不是将其与Abstract中的段落分隔混淆。也许这也可以通过改变相当宽容的[\w\s]*
和[\w\s]{1,100}
来处理,\U
只能识别新段落中的文本作为"抽象 - 继承者"的标题。如果它有2到100个字符(注意:2个字符,但由于ABSTRACT\n(.*)\n\n\U[\w\s]{1,100}\n\n
(大写字符),限制设置为1。
OR