Apache OpenNLP庫是一種基于機器學習的工具包,用于處理自然語言文本。
它支持最常見的NLP任務,如標記化,句子分割,詞性標記,命名實體提取,分塊,解析和參考解析。 通常需要這些任務來構建更高級的文本處理服務。 OpenNLP還包括基于最大熵和感知器的機器學習。
功能:
一、語句檢測器
1、句子檢測
OpenNLP句子檢測器可以檢測標點符號是否標記句子的結尾。 在這個意義上,句子被定義為兩個標點符號之間的最長的白色空間修剪字符序列。 第一句和最后一句是這條規則的例外。 第一個非空白字符假定為一個句子的開頭,最后一個非空白字符假定為一個句子結尾。下面的示例文本應該被分割成句子。
在檢測到句子邊界之后,每個句子被寫在其自己的行中。
通常在文本被標記化之前完成語句檢測,這是網站上預訓練模型的訓練方式,但也可以首先執行標記化,并讓SentenceDetector處理已經標記化的文本。OpenNLP句子檢測器不能基于句子的內容來識別句子邊界。一個突出的例子是文章中的第一句,其中標題被錯誤地識別為第一句的第一部分。OpenNLP中的大多數組件期望輸入被分段為句子。
2、句子檢測工具
嘗試Sentence Detector的最簡單的方法是命令行工具。 該工具僅用于演示和測試。下載英語句子檢測器型號,并使用以下命令啟動Sentence Detector工具:
$ opennlp SentenceDetector en-sent.bin
只需將示例文本從上面復制到控制臺。Sentence Detector將讀取它,并且每行回一個句子到控制臺。通常輸入從文件讀取,輸出重定向到另一個文件。這可以通過以下命令實現。
$ opennlp SentenceDetector en-sent.bin < input.txt > output.txt
對于來自網站的英語句子模型,輸入文本不應被標記化。 3、句子檢查API 句子檢測器可以通過其API輕松集成到應用程序中。要實例化Sentence Detector,必須首先加載句子模型。 InputStream modelIn = new FileInputStream("en-sent.bin"); try { SentenceModel model = new SentenceModel(modelIn); } catch (IOException e) { e.PRintStackTrace(); } finally { if (modelIn != null) { try { modelIn.close(); } catch (IOException e) { } } } 加載模型后,SentenceDetectorME可以實例化。 SentenceDetectorME sentenceDetector = new SentenceDetectorME(model); Sentence檢測器可以輸出一個字符串數組,其中每個String是一個句子。 String sentences[] = sentenceDetector.sentDetect(" First sentence. Second sentence. "); 結果數組現在包含兩個條目。 第一個字符串是“第一句”。 第二個字符串是“第二個句子”。 刪除輸入字符串之前,之間和之后的空格。 API還提供了一種簡單地返回輸入字符串中句子的跨度的方法。 Span sentences[] = sentenceDetector.sentPosDetect(" First sentence. Second sentence. "); 結果數組還包含兩個條目。第一個span位于索引2處,結束于17.第二個span從18開始,結束于34.實用程序方法Span.getCoveredText可用于創建僅覆蓋該span中的字符的子字符串。 二、句子檢測器培訓 1、培訓工具 OpenNLP有一個命令行工具,用于訓練各種語料庫的模型下載頁面提供的模型。 數據必須轉換為OpenNLP Sentence Detector訓練格式。每行一句。空行表示文檔邊界。 在文檔邊界未知的情況下,其建議每隔十個句子具有空行。完全像上面的示例中的輸出。工具的用途: $ opennlp SentenceDetectorTrainer Usage: opennlp SentenceDetectorTrainer[.namefinder|.conllx|.pos] [-abbDict path] / [-params paramsFile] [-iterations num] [-cutoff num] -model modelFile / -lang language -data sampleData [-encoding charsetName] Arguments description: -abbDict path abbreviation dictionary in xml format. -params paramsFile training parameters file. -iterations num number of training iterations, ignored if -params is used. -cutoff num minimal number of times a feature must be seen, ignored if -params is used. -model modelFile output model file. -lang language language which is being processed. -data sampleData data to be used, usually a file name. -encoding charsetName encoding for reading and writing text, if absent the system default is used. 要訓練英語句子檢測器,請使用以下命令: $ opennlp SentenceDetectorTrainer -model en-sent.bin -lang en -data en-sent.train -encoding UTF-8它應該產生以下輸出: Indexing events using cutoff of 5 Computing event counts... done. 4883 events Indexing... done. Sorting and merging events... done. Reduced 4883 events to 2945. Done indexing. Incorporating indexed data for training... done. Number of Event Tokens: 2945 Number of Outcomes: 2 Number of Predicates: 467 ...done. Computing model parameters... Performing 100 iterations. 1: .. loglikelihood=-3384.6376826743144 0.38951464263772273 2: .. loglikelihood=-2191.9266688597672 0.9397911120212984 3: .. loglikelihood=-1645.8640771555981 0.9643661683391358 4: .. loglikelihood=-1340.386303774519 0.9739913987302887 5: .. loglikelihood=-1148.4141548519624 0.9748105672742167 ...<skipping a bunch of iterations>... 95: .. loglikelihood=-288.25556805874436 0.9834118369854598 96: .. loglikelihood=-287.2283680343481 0.9834118369854598 97: .. loglikelihood=-286.2174830344526 0.9834118369854598 98: .. loglikelihood=-285.222486981048 0.9834118369854598 99: .. loglikelihood=-284.24296917223916 0.9834118369854598 100: .. loglikelihood=-283.2785335773966 0.9834118369854598 Wrote sentence detector model. Path: en-sent.bin 2、Training API Sentence Detector還提供了一個API來訓練新的句子檢測模型。 基本上需要三個步驟來訓練它: 應用程序必須打開示例數據流 調用SentenceDetectorME.train方法 將SentenceModel保存到文件或直接使用它 以下示例代碼說明了這些步驟: Charset charset = Charset.forName("UTF-8"); ObjectStream<String> lineStream = new PlainTextByLineStream(new FileInputStream("en-sent.train"), charset); ObjectStream<SentenceSample> sampleStream = new SentenceSampleStream(lineStream); SentenceModel model; try { model = SentenceDetectorME.train("en", sampleStream, true, null, TrainingParameters.defaultParams()); } finally { sampleStream.close(); } OutputStream modelOut = null; try { modelOut = new BufferedOutputStream(new FileOutputStream(modelFile)); model.serialize(modelOut); } finally { if (modelOut != null) modelOut.close(); }
新聞熱點
疑難解答