2010-04-21 145 views
21

我寫這一段代碼分割字符串,並將其存儲在一個字符串數組: -將字符串分割成句子

String[] sSentence = sResult.split("[a-z]\\.\\s+"); 

不過,我已經添加了[AZ]因爲我想處理一些縮寫問題。但後來我的結果顯示爲這樣: -

此外,當埃弗雷特試圖指導他們在基礎數學他們證明unresponsiv

我知道我失去了在拆分功能指定的模式。我可以失去這段時間,但丟失這個詞的最後一個字母會擾亂它的意義。

有人可以幫我解決這個問題,另外,有人可以幫我處理縮寫嗎?例如,因爲我基於句點分割字符串,所以我不想丟失縮寫。

回答

45

即使對於拉丁語言(如英語)來說,解析句子也不是一項簡單的任務。像你在你的問題中概述的那種天真的方法經常失敗,以至於在實踐中證明它是無用的。

更好的方法是使用配置了正確語言環境的BreakIterator

BreakIterator iterator = BreakIterator.getSentenceInstance(Locale.US); 
String source = "This is a test. This is a T.L.A. test. Now with a Dr. in it."; 
iterator.setText(source); 
int start = iterator.first(); 
for (int end = iterator.next(); 
    end != BreakIterator.DONE; 
    start = end, end = iterator.next()) { 
    System.out.println(source.substring(start,end)); 
} 

產生以下結果:

  1. 這是一個測試。
  2. 這是T.L.A.測試。
  3. 現在有一個博士在裏面。
+6

當我使用這句話時 - 「我的朋友瓊斯先生有一隻新狗。」由於瓊斯的資本化,它正在發生。你知道一個方法嗎?否則BreakIterator非常棒! – nbz 2014-05-02 10:53:22

11

這將是很難得到一個正則表達式在所有情況下工作,但要立即解決的問題,你可以使用一個回顧後:

String sResult = "This is a test. This is a T.L.A. test."; 
String[] sSentence = sResult.split("(?<=[a-z])\\.\\s+"); 

結果:

This is a test 
This is a T.L.A. test. 

注意,有是不以大寫字母結尾的縮寫,例如縮寫,先生等等......而且還有句子不會以句號結束!

+0

謝謝您的回覆。 – 2010-04-22 00:15:54

+1

這將在9.3%的句子中失敗。以及使用省略號的句子。並在他們的錯字。等等。不管你做什麼,你的代碼都會犯錯,從人的角度來看。 – 2010-04-22 01:12:00

4

如果可以,請使用自然語言處理工具,例如LingPipe。有許多細微之處,這將是非常困難使用正則表達式,例如,(例如 :-))來捕捉,先生縮寫省略號(...),等等

在LingPipe網站有一個非常簡單的關於Sentence Detection的教程。

+0

嗨,我檢查了教程。它看起來很完美,但是我似乎無法弄清楚如何在eclipse中使用它。你能幫我一下嗎? – 2010-04-23 22:46:18