2011-10-29 32 views
2

我需要做的是解析文本的一个巨大的字符串转换成句子。句子是通过寻找终结者来隔离的。终结者包括'。'和'?'和':'和省略号(“...”)。找到句子的简单方法是一个大字符串?

是有办法,我可以说

if (char is terminator) 
{ 
    // do this 
} 

干净利索,而不是

if (char == '.' || char == '?' || char == etc etc etc etc) 

我没有想到这样做具有终止的数组,并做

if (ArrayofTerminators.Contains<char>('thechar')) 
{ 
    // do that 
} 

但这似乎太傻了?

*编辑感谢。很难有很多好的答复选择。无论如何,我决定使用UnhandledException的答案,因为它非常紧凑,高雅,正是我在寻找的东西。

+2

可能值得一提的是,'。'也常常用于缩写,所以它可能会与结果歪曲 – Loman

回答

0
char[] delimiters = new char[] { '.', '?' }; 
string[] sentences= text.Split(delimiters, StringSplitOptions.RemoveEmptyEntries); 
+0

斯普利特不会返回句子 - 它会丢失标点符号。 – bryanmac

2

如果切片成分离的字符串为你的作品 - String.Split支持分隔符(http://msdn.microsoft.com/en-us/library/b873y76a.aspx

VAR sentenses = “A BCD富?!” 斯普利特(新的char [] { '的阵列。”'? ','!'});

如果省略号被拆分将无法正常工作单独点表示。

如果您需要检查分离器和只需要找到sentense边界 - 分隔符,而不是阵列的考虑使用HashSethttp://msdn.microsoft.com/en-us/library/bb359438.aspx),如果你有“在分离器的阵列”检查的字符。

+0

不错,我会建议一些不必要的复杂的事情,包括用一个特定的终止符替换各个分隔符,然后运行拆分,不知道它会接受一个数组 – heisenberg

+0

,工作。你错过了一些刺激。 – bryanmac

1

假设你只担心一个8位(或更少)字符集,你可以很容易地只是做布尔数组。将终止符设置为true,其他所有内容都为false。那么对于终止测试变为:

if (terminators[char]) 
{ 
    // do this 
} 

您可以更大的字符集的功能是相同的,但对于大字符(比如,超过16位),它开始使用很多更多的内存。

1

所有劈叉缺少puncuations。他们不工作。

一个选项来获得句子它遍历字符。

此代码说明了为什么迭代作品和拆分并不:

 string text = "sentence one. sentence two? sentence three..."; 
     List<string> sentences = new List<string>(); 

     StringBuilder sb = new StringBuilder(); 
     bool termHit = false; 

     foreach (char c in text) 
     { 
      sb.Append(c); 

      if (c == '.' || c == '?') 
      { 
       termHit = true;  
      } 
      else 
      { 
       if (termHit) 
       { 
        termHit = false; 
        sentences.Add(sb.ToString()); 
        sb = new StringBuilder(); 
       } 
      } 
     } 

     if (sb.Length > 0) 
     { 
      sentences.Add(sb.ToString()); 
     } 

     Console.WriteLine("Parse:"); 
     foreach (string sentence in sentences) 
     { 
      Console.WriteLine(sentence);  
     } 

     string[] splits = text.Split(new char[] {'.', '?'}); 

     Console.WriteLine("Split:"); 
     foreach (string sentence in splits) 
     { 
      Console.WriteLine(sentence);  
     } 

它输出:

解析:

句子之一。

句二?

句子3 ...

斯普利特:

句子一个

句中两个

句子3

而且,在洛曼下的评论中指出你的题。解析句子的问题比所有这些解决方案复杂得多。例如,标点包含点。

+0

你可能是对的。如果分裂失败,我会回到这里调查你的解决方案。 :D谢谢 –

+0

来解决puncuation问题,你可以在术语之后寻找2个空格(空格计数器)以定义一个句子...... – bryanmac

+0

在句子末尾使用两个空格似乎越来越少见。 – phoog

相关问题