首页 > 解决方案 > 以 r 中的科学参考编号结尾的单独句子

问题描述

我正在做一个项目,其中一个步骤是将科学文章的文本分成句子。为此,我正在使用textrank我理解它寻找. ? ! 来识别标记化句子的结尾。

我遇到的问题是以句号结尾的句子,后面直接跟一个参考号(也可能在括号中)。下面的例子代表了我迄今为止识别和收集的模式。


xx = c ("hello.1 World", "hello.1,2 World",  "hello.(1) world", "hello.(1,2) World", "hello.[1,2] World", "hello.[1] World")

我做了一些搜索,看起来“句子边界检测”本身就是一门科学,可以变得复杂且特定于领域。

我能想到的解决这个问题的唯一方法(至少在我的情况下)是编写一个正则表达式,在句点之后添加一个空格,以便textrank可以使用其通常的模式来识别它。

任何建议如何使用 R 中的正则表达式来做到这一点?我尽力在网上搜索,但找不到答案。

这个问题解释了如何在小写字母和大写字母之间添加空格。在我的情况下,在 R 中的字符串中的两个字母之间添加空格 ,我相信我需要在字母之间添加空格,然后是句点和数字/括号。

我的预期输出是这样的:

("hello. 1 World", "hello. 1,2 World",  "hello. (1) world", "hello. (1,2) World", "hello. [1,2] World", "hello. [1] World")

谢谢

标签: rregextokenizesentence

解决方案


对于您提供给我们的确切示例输入,您可以对以下模式进行正则表达式搜索:

\.(?=\d+|\(\d+(?:,\d+)*\)|\[\d+(?:,\d+)*\])

然后用点替换,后跟一个空格。示例脚本:

xx <- c("hello.1 World", "hello.1,2 World", "hello.(1) world", "hello.(1,2) World",
        "hello.[1,2] World", "hello.[1] World")
output <- gsub("\\.(?=\\d+|\\(\\d+(?:,\\d+)*\\)|\\[\\d+(?:,\\d+)*\\])", ". ", xx, perl=TRUE)
output

[1] "hello. 1 World"     "hello. 1,2 World"   "hello. (1) world"
[4] "hello. (1,2) World" "hello. [1,2] World" "hello. [1] World"

推荐阅读