将文档解析为句子

时间:2011-06-02 19:21:12

标签: c# regex linq parsing text

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

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

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

  3. 我想知道是否有办法做到这一点,最好是在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.
    

3 个答案:

答案 0 :(得分:2)

你可以使用:

得到一个句子(取决于你对句子的定义)
(\a|[\.!\?:])[^\.!\?:]+

一句话使用:

[a-zA-Z]+

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

答案 1 :(得分: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();

答案 2 :(得分:1)

您可以根据句点(。)进行Split,这会给您一系列句子。

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

然后你会根据“空格”对每个“句子数组”做一个Split来得到单词数。

是的,然后你会使用正则表达式进行匹配。由于你没有指定你想要匹配的内容,我可以添加其他内容。