似乎很難在文本中檢測到句子邊界。引號像。!?可能會被用來分隔句子,但不是很準確,因爲可能存在含糊不清的單詞和引文,例如美國或教授或博士,我正在通過Jan Goyvaerts來研究Tperlregex圖書館和正則表達式食譜,但我不知道如何編寫檢測到的表達式句子?如何從輸入中獲取句子數量?
在delphi中使用Tperlregex可能會有比較準確的表達式?
感謝
似乎很難在文本中檢測到句子邊界。引號像。!?可能會被用來分隔句子,但不是很準確,因爲可能存在含糊不清的單詞和引文,例如美國或教授或博士,我正在通過Jan Goyvaerts來研究Tperlregex圖書館和正則表達式食譜,但我不知道如何編寫檢測到的表達式句子?如何從輸入中獲取句子數量?
在delphi中使用Tperlregex可能會有比較準確的表達式?
感謝
首先,你可能需要在你自己的什麼是「句子」是定義到達,然後實現定義。例如,如何:
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.
+1我必須補充:不管你的實現選擇是什麼(正則表達式或明確編碼),你都需要建立一套測試段落。對於每個段落,你知道應該報告多少個句子。您經常會發現嘗試實施新規則會導致現有規則中斷。 – 2011-04-20 20:23:17
查看我的教程在這裏http://code.google.com/p/graph-expression/wiki/SentenceSplitting。這個具體的例子可以很容易地重寫成正則表達式和一些命令式的代碼。
使用具有預先訓練模型的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);
多少句是我的意見,我會真誠地想知道獲得所需的輸出? J. I. Wilbers博士,博士。彼岸。 – 2011-04-20 17:19:30