2011-10-29 31 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

相關問題