如何从输入中获取句号?

War*_*ren 7 regex delphi nlp text-segmentation

在文本中检测句子边界似乎很难.引号如.!?可能会被用来分隔句子,但不是那么准确,因为可能有歧义的词语和引用,如美国或教授或博士我正在研究Tperlregex图书馆和Jan Goyvaerts的正则表达手册,但我不知道如何写出那个表达式检测句子?

在delphi中使用Tperlregex可能是比较准确的表达式?

谢谢

Mar*_*ski 6

首先,您可能需要自己定义"句子"是什么,然后实现该定义.例如,怎么样:

He said: "It's OK!"
Run Code Online (Sandbox Code Playgroud)

是一两句话吗?一般答案是无关紧要的.决定是否想要把它解释为一个或两个句子,并进行相应处理.

其次,我认为我不会使用正则表达式.相反,我会扫描每个字符并尝试检测序列.一个句子本身可能不足以划分一个句子,但是一个句子后跟空格或回车(或字符串结尾)可能就是这样.这会立即让你淘汰美国(没有空格的时期).

对于Prof. a Dr.这样的常见缩写,创建一个字典可能是一个好主意 - 也许可以由用户编辑,因为每种语言都有自己的一组常用缩写.

每种语言也都有自己的标点符号规则,这可能会影响标点符号的解释方式.例如,英语倾向于在括号内放置句点(如此),而波兰语则相反(如此).相同的区别将适用于双引号,单引号(某些语言根本不使用它们,有时它们与撇号等无法区分).您的规则可能必须特定于语言,至少部分是这样.

最后,您可以近似人类划分句子的方式,但总会有案例可以抛出分析.例如,假设您有一个识别"Prof."的字典.作为缩写,你打算做什么

Most people called him Professor Jones, but to me he was simply The Prof.
Run Code Online (Sandbox Code Playgroud)

即使你有一个跟随并以大写字母开头的另一个句子,这仍然无法帮助你知道句子在哪里结束,因为它可能也是

Most people called him Professor Jones, but to me he was simply Prof. Bill.
Run Code Online (Sandbox Code Playgroud)