如何从输入中获取句号?

时间:2011-04-20 15:59:44

标签: regex delphi nlp text-segmentation

在文本中检测句子边界似乎很难。引号如。!?可能会用来分隔句子但不准确,因为可能有歧义词和引文,如美国或教授或博士我正在研究Tperlregex库和正则表达食谱Jan Goyvaerts但我不知道如何写检测句子的表达式?

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

由于

3 个答案:

答案 0 :(得分:6)

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

He said: "It's OK!"

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

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

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

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

最后,你可能会接近人类划分句子的方式,但总会有一些案例可以抛出分析。例如,假设您有一个识别“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.

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

使用这种方法的优点很多。例如,考虑输入

  

教授。杰西卡是一个很棒的女人。她是美国人。她与Jacob Jr先生结婚。

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

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

然后上面的输入将被拆分为

  

教授。

     杰西卡是个很棒的女人。

     

她是U的本地人。

     

S上。

     

一个。

     

她嫁给了先生

     

Jacob Jr。

然而,所需的输出是

  

教授。杰西卡是一个很棒的女人。

     

她是美国人。她与Jacob Jr先生结婚。

这种逻辑句子分割只能使用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);

Kindly read through this article I have written for integrating SharpNLP with your Application in Visual Studio to make use of the NLP tools