解析单个句子的正则表达式是什么?

Luk*_*ski 23 c# regex

我正在寻找一个很好的.NET正则表达式,我可以用它来解析文本正文中的单个句子.

它应该能够将以下文本块解析成六个句子:

Hello world! How are you? I am fine.
This is a difficult sentence because I use I.D.

Newlines should also be accepted. Numbers should not cause  
sentence breaks, like 1.23.
Run Code Online (Sandbox Code Playgroud)

事实证明这比我原先想象的更具挑战性.

任何帮助将不胜感激.我将使用它来训练已知文本体系.

YOU*_*YOU 39

试试这个@"(\S.+?[.!?])(?=\s+|$)":

string str=@"Hello world! How are you? I am fine. This is a difficult sentence because I use I.D.
Newlines should also be accepted. Numbers should not cause sentence breaks, like 1.23.";

Regex rx = new Regex(@"(\S.+?[.!?])(?=\s+|$)");
foreach (Match match in rx.Matches(str)) {
    int i = match.Index;
    Console.WriteLine(match.Value);
}
Run Code Online (Sandbox Code Playgroud)

结果:

Hello world!
How are you?
I am fine.
This is a difficult sentence because I use I.D.
Newlines should also be accepted.
Numbers should not cause sentence breaks, like 1.23.
Run Code Online (Sandbox Code Playgroud)

当然,对于复杂的,你需要一个真正的解析器,如SharpNLP或NLTK.我只是一个快速而肮脏的人.

这是SharpNLP信息,其特点是:

SharpNLP是用C#编写的自然语言处理工具的集合.目前它提供以下NLP工具:

  • 句子分割器
  • 一个标记器
  • 词性标注器
  • 一个chunker(用于"查找非递归的句法注释,如名词短语块")
  • 解析器
  • 一个名字查找器
  • 共同参与工具
  • WordNet词汇数据库的接口

  • +1指向我们SharpNLP,这是我以前没见过的,可能非常有用. (3认同)

SLa*_*aks 5

var str = @"Hello world! How are you? I am fine. This is a difficult sentence because I use I.D.
Newlines should also be accepted. Numbers should not cause sentence breaks, like 1.23.";

Regex.Split(str, @"(?<=[.?!])\s+").Dump();
Run Code Online (Sandbox Code Playgroud)

我在LINQPad中测试了这个.


pet*_*ust 5

使用正则表达式解析自然语言是不可能的.一句话的结尾是什么?许多地方都可能出现一段时期(egeg).您应该使用自然语言解析工具包,例如OpenNLP或NLTK.不幸的是,C#中的产品很少(如果有的话).因此,您可能必须创建Web服务或以其他方式链接到C#.

请注意,如果您依赖"ID"中的确切空格,将来会导致问题.您很快就会找到打破正则表达式的示例.例如,大多数人在他们的内容之后放置空格.

WP中的开放和商业产品有很好的总结(http://en.wikipedia.org/wiki/Natural_language_processing_toolkits).我们使用了其中几种.值得付出努力.

[你用"火车"这个词.这通常与机器学习相关(这是NLP的一种方法,并且已经用于句子分割).事实上,我提到的工具包包括机器学习.我怀疑那不是你的意思 - 而是你会通过启发式来表达你的表达.别!]