您好,登錄后才能下訂單哦!
本篇內容主要講解“Sentence Detector有什么作用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Sentence Detector有什么作用”吧!
##Sentence Detection##
Apache OpenNLP Sentence Detector能夠檢測到一個句子中的標點符號是否標記著句子的末尾。在這個意義上,一個句子被定義為由兩個標點符號標記的最長的空格修整的字符序列。第一個和最后一個句子違背了這個原則。第一個沒有空格的字符被假定為一個句子的開始,最后一個沒有空格的字符被假定為句子的結尾。下面的示例文本應該被分割成:
Pierre Vinken, 61 years old, will join the board as a nonexecutive director Nov. 29. Mr. Vinken is chairman of Elsevier N.V., the Dutch publishing group. Rudolph Agnew, 55 years old and former chairman of Consolidated Gold Fields PLC, was named a director of this British industrial conglomerate.
在檢測句子的邊界后每一個句子被寫入他自己的行中。
Pierre Vinken, 61 years old, will join the board as a nonexecutive director Nov. 29. Mr. Vinken is chairman of Elsevier N.V., the Dutch publishing group. Rudolph Agnew, 55 years old and former chairman of Consolidated Gold Fields PLC, was named a director of this British industrial conglomerate.
通常,Sentence Detection在句子被標記(tokenized)之前完成,并且在網站上的預訓練模型(pre-trained models)是以這種方式被訓練的,但是也可以首先執行tokenization,讓Sentence Detector處理已經tokenized的文本。OpenNLP Sentence Detector無法識別基于句子內容的句子邊界。一個突出的例子是,一篇文章中的第一個句子(標題)被錯誤的識別為第一句的第一部分。大多數OpenNLP中的組件期望輸入被分割成很多子句。
###Sentence Detection Tool###
最簡單的使用Sentence Detector的方式是命令行工具。這個工具僅僅用于示范和測試。下載英文sentence detector 模型,并且使用下面的命令啟動Sentence Detector:
$ opennlp SentenceDetector en-sent.bin
僅僅拷貝上面的示例文本到控制臺。Sentence Detector將會讀取它,并且每行一個句子輸出到控制臺。通常,輸入從一個文件讀取,并且輸出重定向到另一個文件。可以通過下面的命令完成.
$ opennlp SentenceDetector en-sent.bin < input.txt > output.txt
對于來自網站的英文sentence模型,這個輸入文本應該不會被tokenized。
###Sentence Detection API###
Sentence Detector可以很方便的通過他的API集成到一個應用中。在實例化Sentence Detector之前,必須首先加載sentence 模型。
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 Detector可以輸出一個String數組,數組中每一個元素都是一個句子。
String sentences[] = sentenceDetector.sentDetect(" First sentence. Second sentence. ");
這個結果數組包括兩個記錄。第一個String是”First sentence.“ ,第二個String是"Second sentence."。在輸入的String之前,之后,中間的空格都被移除。這個API也提供了一個方法,他簡單的返回了這個輸入String中的句子的span。
Span sentences[] = sentenceDetector.sentPosDetect(" First sentence. Second sentence. ");
這個結果數組也包括兩個記錄。第一個span開始于索引2,結束于17。第二個span開始于18,結束于34。公共方法Span.getCiveredText 可以創建一個子String,它僅僅包含這個span中的字符。
##Sentence Detector Training##
###Training Tool###
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.
訓練一個English sentence detector 使用下面的命令:
$ 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
###Training API###
Sentence Detector也提供了一個API來訓練一個新的sentence detection model。要訓練,主要需要三步:
應用程序必須開放一個示例數據流
調用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(); }
##Evaluation##
###Evaluation Tool###
這個命令展示了evaluator工具是怎樣運行的。
$ opennlp SentenceDetectorEvaluator -model en-sent.bin -lang en -data en-sent.eval -encoding UTF-8 Loading model ... done Evaluating ... done Precision: 0.9465737514518002 Recall: 0.9095982142857143 F-Measure: 0.9277177006260672
en-sent.eval文件和訓練數據有著相同的格式。
到此,相信大家對“Sentence Detector有什么作用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。