我正在寻找一个很好的.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.
事实证明这比我原先想象的更具挑战性.
任何帮助将不胜感激.我将使用它来训练已知文本体系.
试试这个@"(\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); }
结果:
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.
当然,对于复杂的,你需要一个真正的解析器,如SharpNLP或NLTK.我只是一个快速而肮脏的人.
这是SharpNLP信息,其特点是:
SharpNLP是用C#编写的自然语言处理工具的集合.目前它提供以下NLP工具:
句子分割器
一个标记器
词性标注器
一个chunker(用于"查找非递归的句法注释,如名词短语块")
解析器
一个名字查找器
共同参与工具
WordNet词汇数据库的接口
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();
我在LINQPad中测试了这个.
使用正则表达式解析自然语言是不可能的.一句话的结尾是什么?许多地方都可能出现一段时期(egeg).您应该使用自然语言解析工具包,例如OpenNLP或NLTK.不幸的是,C#中的产品很少(如果有的话).因此,您可能必须创建Web服务或以其他方式链接到C#.
请注意,如果您依赖"ID"中的确切空格,将来会导致问题.您很快就会找到打破正则表达式的示例.例如,大多数人在他们的内容之后放置空格.
WP中的开放和商业产品有很好的总结(http://en.wikipedia.org/wiki/Natural_language_processing_toolkits).我们使用了其中几种.值得付出努力.
[你用"火车"这个词.这通常与机器学习相关(这是NLP的一种方法,并且已经用于句子分割).事实上,我提到的工具包包括机器学习.我怀疑那不是你的意思 - 而是你会通过启发式来表达你的表达.别!]