将用于句子提取的正则表达式语句转换为Ruby

时间:2010-05-01 08:00:12

标签: ruby regex

我在http://en.wikipedia.org/wiki/Sentence_boundary_disambiguation找到了这个用于句子边界消歧的正则表达式语句,但我无法在Ruby拆分语句中使用它。我对正则表达式不太好,所以也许我错过了什么?这是声明:

((?<=[a-z0-9)][.?!])|(?<=[a-z0-9][.?!]\"))(\s|\r\n)(?=\"?[A-Z])

这是我在Ruby中尝试的,但没有去:

text.split("((?<=[a-z0-9)][.?!])|(?<=[a-z0-9][.?!]\"))(\s|\r\n)(?=\"?[A-Z])")

1 个答案:

答案 0 :(得分:2)

如果你使用Oniguruma正则表达式引擎(这是Ruby 1.9中的标准)编译它,它应该在Ruby 1.9或Ruby 1.8中工作:

result = text.split(/((?<=[a-z0-9)][.?!])|(?<=[a-z0-9][.?!]"))\s+(?="?[A-Z])/)

区别在于您的代码将文字字符串传递给split(),而此代码传递了一个文字正则表达式。

使用经典的Ruby正则表达式引擎(这是Ruby 1.8中的标准)是行不通的,因为它不支持lookbehind。

我还修改了正则表达式。我将(\s|\r\n)替换为\s+。我的正则表达式还会拆分它们之间有多个空格的句子(在一个句子在很多文化中很常见后输入两个空格)和/或它们之间有多个换行符(分隔段落)。

使用Unicode文本时,进一步的改进是将a-z替换为\p{Ll}\p{Lo},将A-Z替换为\p{Lu}\p{Lt}\p{Lo},将0-9替换为\p{N}在正则表达式中的各种字符类中。带有标点符号的字符类可以类似地进行扩展。这需要更多的研究,因为句末标点符号没有Unicode属性。