7

似乎很难检测文本中的句子边界。引号之类的 .!? 可用于分隔句子,但不太准确,因为可能存在模棱两可的单词和引文,例如 USA 或 Prof. 或 Dr。我正在研究Jan Goyvaerts的 Tperlregex 库和正则表达式食谱,但我不知道如何编写表达式检测句子?

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

谢谢

4

3 回答 3

6

首先,您可能需要自己定义“句子”是什么,然后实施该定义。例如,如何:

He said: "It's OK!"

是一两句话吗?一般的答案是无关紧要的。决定您是否希望它将其解释为一个或两个句子,并相应地进行。

其次,我认为我不会为此使用正则表达式。相反,我会扫描每个字符并尝试检测序列。一个句点本身可能不足以分隔一个句子,但一个句点后跟空格或回车(或字符串结尾)可能会。这可以立即让您清除 USA(句点后面没有空格)。

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

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

最后,您可能会近似人类划分句子的方式,但总会有一些案例可能会导致分析失败。例如,假设您有一本可以识别“Prof.”的字典。作为缩写,你要做什么

Most people called him Professor Jones, but to me he was simply The Prof.

即使您后面还有另一个以大写字母开头的句子,这仍然无法帮助您知道句子的结尾,因为它还不如

Most people called him Professor Jones, but to me he was simply Prof. Bill.
于 2011-04-20T16:17:19.913 回答
1

在此处查看我的教程http://code.google.com/p/graph-expression/wiki/SentenceSplitting。这个具体的例子可以很容易地重写为正则表达式和一些命令式代码。

于 2011-04-21T06:17:39.243 回答
0

使用带有预训练模型的 NLP 处理器是明智的。EnglishSD.nbin就是一种可用于 OpenNLP 的模型,它可以在带有 SharpNLP 的 Visual Studio 中使用。

使用这种方法的好处很多。例如考虑输入

杰西卡教授是个了不起的女人。她是土生土长的美国她嫁给了小雅各布先生。

例如,如果您使用正则表达式拆分

 string[] sentences = Regex.Split(text, @"(?<=['""A-Za-z0-9][\.\!\?])\s+(?=[A-Z])");

那么上面的输入将被拆分为

教授

杰西卡是个很棒的女人。

她是土生土长的美国。

S。

一种。

她嫁给了先生。

小雅各布

然而,所需的输出是

杰西卡教授是个了不起的女人。

她是土生土长的美国她嫁给了小雅各布先生。

这种逻辑句子拆分只能使用来自 OpenNLP 项目的训练模型来实现。方法就这么简单。

private string mModelPath = @"C:\Users\ATS\Documents\Visual Studio 2012\Projects\Google_page_speed_json\Google_page_speed_json\bin\Release\";
private OpenNLP.Tools.SentenceDetect.MaximumEntropySentenceDetector mSentenceDetector;
private string[] SplitSentences(string paragraph)
    {
        if (mSentenceDetector == null)
        {
            mSentenceDetector = new OpenNLP.Tools.SentenceDetect.EnglishMaximumEntropySentenceDetector(mModelPath + "EnglishSD.nbin");
        }

        return mSentenceDetector.SentenceDetect(paragraph);
    }

其中 mModelPath 是包含 nbin 文件的目录的路径。

mSentenceDetector 源自 OpenNLP dll。

您可以通过以下方式获得所需的输出

string[] sentences = SplitSentences(text);

请通读我为在 Visual Studio 中将 SharpNLP 与您的应用程序集成以利用 NLP 工具而编写的这篇文章

于 2013-10-19T08:23:27.777 回答