2011-04-20 39 views
7

似乎很難在文本中檢測到句子邊界。引號像。!?可能會被用來分隔句子,但不是很準確,因爲可能存在含糊不清的單詞和引文,例如美國或教授或博士,我正在通過Jan Goyvaerts來研究Tperlregex圖書館和正則表達式食譜,但我不知道如何編寫檢測到的表達式句子?如何從輸入中獲取句子數量?

在delphi中使用Tperlregex可能會有比較準確的表達式?

感謝

+0

多少句是我的意見,我會真誠地想知道獲得所需的輸出? J. I. Wilbers博士,博士。彼岸。 – 2011-04-20 17:19:30

回答

6

首先,你可能需要在你自己的什麼是「句子」是定義到達,然後實現定義。例如,如何:

He said: "It's OK!" 

這是一句還是兩句?一般的答案是無關緊要的。決定是否希望它將其解釋爲一個或兩個句子,並據此進行。

其次,我不認爲我會爲此使用正則表達式。相反,我會掃描每個字符並嘗試檢測序列。一段時間本身可能不足以劃定一個句子,但一段時間後跟空格或回車(或字符串結尾)可能會發生。這可以立即讓您清除美國(週期之後沒有空格)。

對於像Prof. an Dr.這樣的常用縮寫,創建一個字典 - 可能是由用戶編輯的字典可能是一個好主意,因爲每種語言都有自己的一組通用縮寫。

每種語言也會有自己的一套標點符號,這可能會影響您如何解釋標點符號。例如,英語傾向於在括號內放置一段時間(像這樣),而波蘭語則相反(如此)。同樣的差異將適用於雙引號,單引號(某些語言完全不使用它們,有時它們與撇號等無法區分)。您的規則可能必須是語言特定的,至少部分。

最後,您可能近似人類劃界句子的方式,但總會有一些情況可能導致分析失敗。例如,假設你有一個識別「Prof.」的字典作爲一個縮寫,你打算怎麼辦

Most people called him Professor Jones, but to me he was simply The Prof. 

即使你有遵循,並以大寫字母開頭另一句話,仍然不會幫助你知道這句話結束,因爲它可能會作爲以及

Most people called him Professor Jones, but to me he was simply Prof. Bill. 
+0

+1我必須補充:不管你的實現選擇是什麼(正則表達式或明確編碼),你都需要建立一套測試段落。對於每個段落,你知道應該報告多少個句子。您經常會發現嘗試實施新規則會導致現有規則中斷。 – 2011-04-20 20:23:17

0

使用具有預先訓練模型的NLP處理器是明智的。 EnglishSD.nbin就是這樣一個可用於OpenNLP的模型,它可以在SharpNLP的Visual Studio中使用。

使用這種方法的優點很多。例如,考慮輸入

傑西卡教授是一個了不起的女人。她是美國本地人,她與雅各布先生結婚。

如果使用正則表達式拆分,例如

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

接着上面的輸入將被分割爲

教授

傑西卡是一個了不起的女人。

她是U.

S.

A.

她嫁給了先生

雅各小

但是期望的輸出的原生是

傑西卡教授是一位了不起的女人。

她U.S.A.她的母語是結婚的小雅各布先生

這種邏輯的句子拆分只能使用經過訓練的模型從OpenNLP項目來實現。該方法如此簡單。

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); 
    } 

其中mModelPath是包含nbin文件的目錄的路徑。

mSentenceDetector派生自OpenNLP DLL。

您可以通過

string[] sentences = SplitSentences(text); 

Kindly read through this article I have written for integrating SharpNLP with your Application in Visual Studio to make use of the NLP tools