2011-04-11 37 views
3

我必須處理文本文件(電子書)。我想處理它,以便每行有一個句子(「換行符分隔的文件」,是的?)。我將如何使用sed UNIX實用程序來執行此任務?它是否有象「文字邊界」的符號那樣的「句子邊界」符號(我認爲GNU版本有這個符號)。請注意,句子可以以句號,省略號,問題或感嘆號結尾,最後兩個組合(例如,?,!,!?,!!!!!都是有效的「句子終止符」)。輸入文件被格式化爲某些句子包含必須刪除的換行符。句子邊界處的分割文本文件

我想到了一個像s/...|. |[!?]+ |/\n/g這樣的腳本(爲了更好的閱讀目的而未轉義)。但它不會從句子中刪除換行符。

在C#中如何?如果我使用像sed這樣的正則表達式,它會顯着更快嗎? (我想不是)。還有更快的方法嗎?

無論哪種方式(sed或C#)都很好。謝謝。

回答

0

你可以使用類似這樣提取的句子:

var sentences = Regex.Matches(input, @"[\w ,]+[\.!?]+") 
foreach (Match match in sentences) 
{ 
    Console.WriteLine(match.Value); 
} 

這應該與包含單詞,空格和逗號,並與(任意數量的)時期,感嘆號和問號結束的句子。

1

句子分裂是一個非平凡的問題,機器學習算法已經被開發出來。但在[.\?!]+與大寫字母[A-Z]之間的空白分隔可能是一個很好的啓發式。與tr首先刪除新行,然後應用RE:

tr '\r\n' ' ' | sed 's/\([.?!]\)\s\s*\([A-Z]\)/\1\n\2/g' 

輸出應該是每行一個句子。如果發現錯誤,檢查輸出並優化RE。 (例如,mr. Ed將被錯誤地處理,也許編譯這樣的縮寫列表)。

C#或sed是否更快只能通過實驗確定。

0

您感興趣的任務通常稱爲「句子分段」。正如萊曼斯所說,這是一個不平凡的問題,但啓發式方法通常表現得相當好,至少對於英語而言。

這聽起來像你主要對英語感興趣,所以已經呈現的正則表達式啓發式可以充分滿足你的需求。如果你想要一個更精確的解決方案(代價是複雜度稍微高一些),你可以考慮使用LingPipe,一個開源的NLP框架。我已經與LingPipe運氣相當好,我曾經使用它幾次。

請參閱http://alias-i.com/lingpipe/demos/tutorial/sentences/read-me.html瞭解關於句子分段的詳細教程。

3

正則表達式是我長期使用的一個好選擇。

爲我工作得很好

一個很好的正則表達式是

string[] sentences = Regex.Split(sentence, @"(?<=['""A-Za-z0-9][\.\!\?])\s+(?=[A-Z])"); 

然而,正則表達式的效率不高。此外,雖然邏輯適用於理想情況,但它在生產環境中不起作用。

例如,如果我的文字是,

U.S.A.是一個美好的國家。住在那裏的大多數人都很開心。

正則表達式方法將在每個時期分裂爲5個句子。但是我們從邏輯上知道它應該被拆分成只有兩個句子。

這就是讓我尋找機器學習技術的最終方法,最後SharpNLP對我來說工作得很好。

private string mModelPath = @"C:\Users\ATS\Documents\Visual Studio 2012\Projects\Google_page_speed_json\Google_page_speed_json\bin\Release\"; 
private OpenNLP.Tools.SentenceDetect.MaximumEntropySentenceDetector mSentenceDetector; 
private string[] SplitSentences(string paragraph) 
    { 
     if (mSentenceDetector == null) 
     { 
      mSentenceDetector = new OpenNLP.Tools.SentenceDetect.EnglishMaximumEntropySentenceDetector(mModelPath + "EnglishSD.nbin"); 
     } 

     return mSentenceDetector.SentenceDetect(paragraph); 
    } 

在這裏,在這個例子中,我已經使用SharpNLP,在我所用EnglishSD.nbin的 - 句子檢測預先訓練的模式。

現在,如果我在這個方法上應用相同的輸入,它會將文本完美地分割成兩個邏輯句子。

您甚至可以使用SharpNLP項目對標記,POSTag,Chuck等進行標記。

For step by step integration of SharpNLP into your C# application, read through the detailed article I have written.它會向您解釋與代碼片段的集成。

謝謝

+0

您的正則表達式不會將該示例分成5個句子,它找到兩個。你試過了嗎?我喜歡看似有效的快速和骯髒的句子檢測。 – Crowcoder 2016-08-27 20:08:39