2010-09-29 72 views
2

現在我有以下代碼:用於SentenceDetector的Opennlp 1.5?

SentenceModel sd_model = null; 
    try { 
    sd_model = new SentenceModel(new FileInputStream(
    "opennlp/models/english/sentdetect/en-sent.bin")); 
    } catch (InvalidFormatException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } catch (FileNotFoundException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
    SentenceDetectorME mSD = new SentenceDetectorME(sd_model); 
    String param = "This is a good senttence.I'm very happy. Who can tell me the truth.And go to school."; 
    String[] sents = mSD.sentDetect(param); 
    for(String sent : sents){ 
    System.out.println(sent); 
    } 

但我得到的follwing結果:

This is a good senttence.I'm very happy. 
Who can tell me the truth.And go to school. 

當然,這不是我們想要的。我該如何解決這個問題?感謝名單。

回答

0

嘗試使用特定語言句子探測器(opennlp.tools.lang.english.SentenceDetector)。

+0

opennlp.tools.lang.english.SentenceDetector有同樣的問題。 – 2010-09-29 12:32:10

7

我不認爲提供OpenNLP句子檢測模型是一個很好的適合你的任務,因爲它已經被訓練的數據,其中空白如下句末標點,因爲這是英文拼寫相當標準。英語句子檢測器通常用於區分句末標點符號和縮寫中使用的標點符號,引號等。在所有情況下,您的普通句子檢測器都會期望句子之間存在某種空白。

如果你想使用OpenNLP,我認爲最簡單的解決方案是預處理你的數據,以增加一個空間,你可以檢測到像[a-z][.?!][A-Z]這樣的模式。 (這種模式顯然是不足夠的,但只給一個想法。)有沒有有格式,如Nnnn.Nnnn或NNNN?NNNN所以我敢打賭,你可以達到很好的效果,而無需使用任何票友比正則表達式許多縮寫,但這取決於你的數據是什麼樣子。或者,您可以使用某種帶有自定義模型的標記器來查找這些情況。

也有可能,你可以訓練不希望句子之間的空格自己的句子檢測模型,但它看起來像那將是棘手的與OpenNLP。他們提供的培訓課程期望訓練數據每行有一個句子,因此無法避免在句子之間插入空格。