import java.io.File;
import java.io.FileInputStream;
import opennlp.tools.sentdetect.SentenceDetector;
import opennlp.tools.sentdetect.SentenceDetectorME;
import opennlp.tools.sentdetect.SentenceModel;
import opennlp.tools.util.Span;
public class SentenceDetection {
SentenceDetector sd;
public Span[] getSentences(String docTextFromMapFunction) throws Exception {
if (sd == null) {
sd = new SentenceDetectorME(new SentenceModel(new FileInputStream(new File("/standardized-on-each-node/path/to/en-sent.zip"))));
}
/**
* this gives you the actual sentences as a string array
*/
// String[] sentences = sd.sentDetect(docTextFromMapFunction);
/**
* this gives you the spans (the charindexes to the start and end of each
* sentence in the doc)
*
*/
Span[] sentenceSpans = sd.sentPosDetect(docTextFromMapFunction);
/**
* you can do this as well to get the actual sentence strings based on the spans
*/
// String[] spansToStrings = Span.spansToStrings(sentPosDetect, docTextFromMapFunction);
return sentenceSpans;
}
}
1条答案
按热度按时间lmyy7pcs1#
我用了两种不同的方法。一种方法是将句子检测模型推送到每个节点上的一个标准dir(ie/opt/opennlpmodels/),并在mapper类的类级别读取序列化模型,然后在map或reduce函数中适当地使用它。
另一种方法是将模型放在数据库或分布式缓存中(作为blob或其他形式)。。。我以前曾使用accumulo存储文档分类模型(如下面所示)。然后在类级别建立到数据库的连接,并以bytearrayinputstream的形式获取模型。
我使用了puppet来推出模型,但是使用您通常使用的任何工具来保持集群中的文件是最新的。
根据您的hadoop版本,您可能可以将模型作为jobsetup的属性偷偷引入,然后只有主(或从何处启动作业)需要实际的模型文件。我从没试过这个。
如果您需要知道如何实际使用opennlp语句检测器,请告诉我,我将发布一个示例。hth公司
嗯。。。只要确保文件放好就行了。有更优雅的方式做这件事,但这是工作,它很简单。