【问题标题】:How to get sentence number from input?如何从输入中获取句子编号?
【发布时间】:2011-08-09 15:32:27
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 我的评论有多少句,我很想知道? J. I. Wilbers 博士,博士。等。

标签: regex delphi nlp text-segmentation


【解决方案1】:

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

He said: "It's OK!"

是一两句话吗?一般的答案是无关紧要的。决定是否希望它把它解释为一两个句子,然后进行相应的处理。

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

对于像 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.

【讨论】:

  • +1 我必须补充一点:无论您选择何种实现方式(正则表达式或显式编码),您都需要构建一套测试段落。对于每个段落,您知道应该报告多少个句子。您经常会发现,尝试实施新规则会破坏现有规则。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    使用带有预训练模型的 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);
    

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

    【讨论】:

      猜你喜欢
      • 2017-04-02
      • 1970-01-01
      • 1970-01-01
      • 2014-03-04
      • 1970-01-01
      • 1970-01-01
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多