【问题标题】:Parse a document into sentences将文档解析为句子
【发布时间】:2011-06-02 19:21:12
【问题描述】:

我有一个问题对专家来说应该很简单,但对我来说却很神秘:) 我想将文本(经过预处理,除了常规标点符号外没有特殊字符)解析为句子并执行两项任务类似于:

  1. 对于每个句子,找出单词的数量(Sentence Length)。然后对于文档,找到平均句子长度。无需报告任何句子级别的输出。请注意,该文档包含相当数量的专有名词,因此大写字母不一定表示句子的开头。但是本文档中的句子通常以“,”,“!”或“?”结尾。

  2. 对于每个句子,应用正则表达式模式。如果匹配,则给句子赋值,例如 1。对于整个文档,报告匹配数。同样,只需要文档级别的输出。

我想知道是否有任何方法可以做到这一点,最好是在 C# 或 VB 中。任何帮助将不胜感激。

=======================

示例段落:

This is an example of a paragraph! It contains three sentences? And the average sentence has many words. 

示例模式:

"three"

输出:

number of sentences-3.
Average sentence length-6.
Number of matches-1.

【问题讨论】:

  • 句子不以逗号结尾。你的意思是句号吗?
  • 到目前为止,答案似乎没有考虑十进制数字和缩写。

标签: c# regex linq parsing text


【解决方案1】:

你可以得到一个句子(取决于你对句子的定义)使用:

(\a|[\.!\?:])[^\.!\?:]+

还有一个词使用:

[a-zA-Z]+

剩下的很简单 - 只需查看 MSDN 上的正则表达式文档。

【讨论】:

  • 这样找词是行不通的。你会用撇号、破折号或任何其他可能包含在单词中的词来错误地计算单词。您可以将它们添加到您的字符集中并使用单词边界。 \b[^\s]+?\b
  • @Tony:这将匹配下划线、不间断空格和许多其他不需要的垃圾:) 不过这不是我的意思——他可以在那里放任何字符,支持多种语言,允许数字,等等. “词”的定义有点松散。
  • 对,我只是想表达,使用 \b 作为单词边界可能是区分单词开始和结束位置的最佳方式。
【解决方案2】:

这应该可行:

string example =
    "This is an example of a paragraph! It contains three sentences? And the average sentence has many words.";

var splitExample = example.Split(new[] {'.', '!', '?'}, StringSplitOptions.RemoveEmptyEntries);

var matchExpression = new Regex("three");
double avgLength = splitExample.Average(x => x.Split(new []{' '}, StringSplitOptions.RemoveEmptyEntries).Length);
int sentences = splitExample.Length;
int matches = splitExample.Where(x => matchExpression.IsMatch(x)).Count();

【讨论】:

  • “我认为 Mann 先生不能正确地拆分这句话……”——你会说这两个句子。
【解决方案3】:

您可以根据句点 (.) 执行 Split,这将为您提供一系列句子。

string sentences[] = document.Split('.');

然后您将根据“空格”对每个“句子数组”执行Split 以获取单词数。

是的,您将使用正则表达式进行匹配。由于您没有指定要匹配的内容,因此我无法添加太多其他内容。

【讨论】:

  • “但本文档中的句子通常以“.”、“!”或“?”结尾。”
  • 啊,好点,然后你需要根据句号问号或感叹号来分割。虽然使用正则表达式可能会更快。
  • 不是真的; string sentences[] = document.Split(new char[] {'.', '!', '?'}, StringSplitOptions.RemoveEmptyEntries);。 (RemoveEmptyEntries 用于省略号。)这可能仍然比正则表达式更快。
  • 你也可以使用分隔符来分割句子:char[] delimiters = {'!', '.', '?' }; string[] words = text.Split(delimiterChars);
  • 不要烦人,但是:string sentences[] = document.Split(new char[] {'.', '!', '?'}, StringSplitOptions.RemoveEmptyEntries);System.Text.RegularExpressions.Regex re = new System.Text.RegularExpressions.Regex("(\a|[\.!\?:])[^\.!\?:]+");
猜你喜欢
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
  • 2017-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
相关资源
最近更新 更多