似乎很难检测文本中的句子边界。引号之类的 .!? 可用于分隔句子,但不太准确,因为可能存在模棱两可的单词和引文,例如 USA 或 Prof. 或 Dr。我正在研究Jan Goyvaerts的 Tperlregex 库和正则表达式食谱,但我不知道如何编写表达式检测句子?
在 delphi 中使用 Tperlregex 可能比较准确的表达是什么?
谢谢
似乎很难检测文本中的句子边界。引号之类的 .!? 可用于分隔句子,但不太准确,因为可能存在模棱两可的单词和引文,例如 USA 或 Prof. 或 Dr。我正在研究Jan Goyvaerts的 Tperlregex 库和正则表达式食谱,但我不知道如何编写表达式检测句子?
在 delphi 中使用 Tperlregex 可能比较准确的表达是什么?
谢谢
首先,您可能需要自己定义“句子”是什么,然后实施该定义。例如,如何:
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.
在此处查看我的教程http://code.google.com/p/graph-expression/wiki/SentenceSplitting。这个具体的例子可以很容易地重写为正则表达式和一些命令式代码。
使用带有预训练模型的 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 工具而编写的这篇文章