当前位置: 首页 > 编程语言 > C#

解析单句的正则表达式是什么?分享

时间:2023-04-11 02:14:43 C#

解析单个句子的正则表达式是什么?我正在寻找一个好的.NET正则表达式,我可以用它来解析文本文字中的单个句子。它应该能够将以下文本块解析为六个句子:Helloworld!你好吗?我没事。这是一个很难的句子,因为我使用IDNewlines也应该被接受。数字不应导致句子中断,如1.23。事实事实证明,这比我原先想象的更具挑战性。任何帮助将不胜感激。我将用它来训练已知的文本系统。试试这个@"(S.+?[.!?])(?=s+|$)":stringstr=@"Helloworld!Howareyou?Iamfine.这是一个很难的句子,因为我使用ID换行符也应该被接受。数字不应该导致句子中断,比如1.23。";Regexrx=newRegex(@"(S.+?[.!?])(?=s+|$)");foreach(在rx.Matches(str)中匹配匹配){inti=match.Index;Console.WriteLine(match.Value);}结果:世界您好!你好吗?我没事。这是一个很难的句子,因为我使用IDNewlines也应该被接受。数字不应导致句子中断,如1.23。当然,对于复杂的,你需要一个像SharpNLP或NLTK这样的真正的解析器。我只是一个快速而肮脏的家伙。这里是SharpNLP的资料,它的特点是:SharpNLP是一个用C#编写的自然语言处理工具集合。目前它提供了以下NLP工具:varstr=@"Helloworld!Howareyou?Iamfine.这是一个很难的句子,因为我使用ID换行也应该被接受。数字不应该导致句子中断,比如1.23。";Regex.Split(str,@"(?我在LINQPad中测试过这个。用regex不可能解析自然语言。一个句子的结尾是什么?一个时间段(egeg)可以出现在很多地方。你应该使用一个自然的语言解析工具包,例如OpenNLP或NLTK。不幸的是,C#中的产品很少(如果有的话)。因此您可能必须创建Web服务或以其他方式链接到C#。请注意,如果您依赖于“ID”中的确切空格。你会很快找到损坏的正则表达式的例子。例如,大多数人在他们的内容之后放置空格。WP中的开放和商业产品有很好的总结(http://en.wikipedia.org/wiki/Natural_language_processing_toolkits)。我们已经使用了其中的几个。非常值得努力。[你使用“训练”这个词。这通常与机器学习相关(这是NLP的一种方法,并已用于句子分割).事实上,我提到的工具包包括机器学习。我怀疑这不是你的意思-而是你会通过启发式来表达你的表情。Don't!]这只有用正则表达式才有可能,除非你确切地知道你有哪些“困难”的标记,比如“id”、“Mr.”等。例如,有多少句话是“请出示你的ID,基先生。”?我不熟悉任何C#实现,但我使用NLTK的Punkt分词器。可能不应该太难重新实施。使用此处发布的建议,我想出了一个正则表达式,它可以实现我想要做的事情:(?S.+?(?[.!?]|Z))(?=s+|Z)我做了使用Expresso://使用System.Text.RegularExpressions;//////为C#构建的正则表达式于:Sun,2009年12月27日,下午03:05:24///使用Expresso版本:3.0。3276,http://www.ultrapico.com//////正则表达式的描述://////[句子]:一个命名的捕获组。[S.+?(?[.!?]|Z)]///S.+?(?[.!?]|Z)///除空格之外的任何内容///任何字符,一次或多次重复,尽可能少///[Terminator]:一个命名的捕获组。[[.!?]|Z]///从2个选项中选择//??/此类中的任何字符:[.!?]///字符串末尾或字符串末尾的新行之前///匹配后缀但将其排除在捕获之外。[s+|Z]///从2个选项中选择//??/空格,一次或多次重复///字符串结尾或字符串结尾换行之前//////////publicstaticRegexregex=newRegex("(?\S.+?(?[.!?]|\Z))(?=\s+|\Z)",RegexOptions.CultureInvarian吨|RegexOptions.IgnorePatternWhitespace|RegexOptions.Compiled);//这是替换字符串publicstaticstringregexReplace="$&[${Day}-${Month}-${Year}]";////使用替换模式替换InputText中的匹配文本//stringresult=regex.Replace(InputText,regexReplace);////在正则表达式匹配的地方拆分InputText//string[]results=regex.Split(InputText);////捕获InputText中的第一个匹配项(如果有)//Matchm=regex.Match(InputText);////捕获InputText中的所有匹配//MatchCollectionms=regex.Matches(InputText);////测试InputText是否匹配//boolIsMatch=regex.IsMatch(InputText);////获取所有命名和编号的捕获组的名称//string[]GroupNames=regex.GetGroupNames();////获取所有命名和编号的捕获组的编号//int[]GroupNumbers=regex.GetGroupNumbers();大多数人建议使用SharpNLP,你应该这样做,除了你希望你的QA部门有一个错误但是,因为您可能面临某种压力。这是处理“博士”等词的另一种尝试。和“X”。但是,如果句子以“它”结尾,它将失败。你好世界!你还好吗?我没事。这是一个很难判断的句子,因为我使用ID换行符也应该被接受。数字不应导致句子中断,如1.23。有关心脏幽门螺杆菌评估,请参阅B博士或FooBar先生。以上就是C#学习教程:单句解析的正则表达式是什么?如果分享的内容对你有用,需要了解更多C#学习教程,希望大家多多关注---varresult=newRegex(@"(S.+?[.!?])(?=s+|$)(?!String.IsNullOrWhiteSpace(s)).ToArray();foreach(varmatchinresult){Console.WriteLine(match);}本文收集自网络,不代表立场.如涉及侵权,请点击右侧联系管理员删除,如需转载请注明出处: