如何在Lua中匹配一个句子

3
我正在尝试创建一个正则表达式来匹配一个句子。以下是片段。
local utf8 = require 'lua-utf8'
function matchsent(text)
  local text = text
  for sent in utf8.gmatch(text, "[^\r\n]+\.[\r\n ]") do
    print(sent)
    print('-----')
  end
end

但是,它不像 Python 那样工作。我知道 Lua 使用不同的正则表达式模式,并且其正则表达式能力有限,但为什么上面的正则表达式会给我一个语法错误?在 Lua 中,匹配句子的正则表达式会是什么样子呢?


1
你需要使用 % 转义特殊符号。 - Wiktor Stribiżew
1个回答

2
请注意,Lua使用的是Lua模式,它们不是“正则”表达式,因为它们无法匹配正则语言。由于需要考虑各种缩写、空格、大小写等因素,因此它们几乎无法用于将文本分成句子。要将文本分成句子,您需要一个NLP包而不是一个或两个正则表达式,因为任务的复杂性。
关于上面的正则表达式为什么会给我语法错误的问题,您需要在Lua模式中使用%符号转义特殊符号。请参考以下示例代码:
function matchsent(text)
    for sent in string.gmatch(text, '[^\r\n]+%.[\r\n ]') do
        print(sent)
        print("---")
    end
end
matchsent("Some text here.\nShow me")

一个在线演示

是的,那个可以,但是“Dr.Bonn was hiding in a tree.”这句话会被错误地分割。 - minerals
1
请注意,Lua模式不是正则表达式,并且默认情况下无法匹配带有缩写词的句子。您可能想使用类似于%.%s+(%u)的东西,将其替换为.§%1,然后使用[^§]+gmatch来“拆分”成“句子”,但这仍然是近似的,因为它无法区分. New sentence. Dr. Bonn。请参见https://ideone.com/rvzAtX。请注意,您不能像Python中那样在Lua中使用任何类似于`(?:(?:Dr|Mrs)\.|[^\r\n.])+\.`的内容,因为Lua模式不支持交替,更不用说量化组了。 - Wiktor Stribiżew
是的,句子分词是一个独立的主题,我只是希望能够使用一些近似的Python正则表达式来简化它。 - minerals
@minerals:实际上,即使在Python中,您最好使用nltk来处理此任务。在Ruby中,有一个基于正则表达式的库可以将文本拆分成句子(https://github.com/apohllo/srx-english/blob/master/lib/srx/english/sentence_splitter.rb)。但是,由于大量使用替代方案,它无法移植到基于Lua模式的解决方案中。 - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接