将Apache Open NLP与node.js一起使用的最佳方法是什么?
具体来说,我想使用Name Entity Extraction API。以下是关于它的说法 - 文档很糟糕(我认为是新项目):
http://opennlp.apache.org/documentation/manual/opennlp.html#tools.namefind
来自文档:
强烈建议在生产系统中使用名称查找器 将其直接嵌入应用程序而不是使用命令 线界面。首先,必须将名称查找器模型加载到内存中 来自磁盘或其他来源。在下面的示例中加载自 磁盘。
InputStream modelIn = new FileInputStream("en-ner-person.bin");
try {
TokenNameFinderModel model = new TokenNameFinderModel(modelIn);
}
catch (IOException e) {
e.printStackTrace();
}
finally {
if (modelIn != null) {
try {
modelIn.close();
}
catch (IOException e) {
}
}
}
模型加载失败的原因有很多:
基础I / O的问题
该型号的版本与OpenNLP版本不兼容
模型被加载到错误的组件中,例如tokenizer model加载了TokenNameFinderModel类。
模型内容因其他原因无效
加载模型后,可以实例化NameFinderME。
NameFinderME nameFinder = new NameFinderME(model);
现在完成初始化并可以使用名称查找器。 NameFinderME类不是线程安全的,只能从中调用它 一个线程。使用多个线程多个NameFinderME实例 可以创建共享相同的模型实例。输入文本应该 被分割成文件,句子和代币。执行实体 检测应用程序为每个句子调用find方法 该文件。每个文件必须调用clearAdaptiveData之后 清除要素生成器中的自适应数据。不打电话 clearAdaptiveData可导致检测率急剧下降 一些文件。以下代码说明了:
for (String document[][] : documents) {
for (String[] sentence : document) {
Span nameSpans[] = find(sentence);
// do something with the names
}
nameFinder.clearAdaptiveData()
}
the following snippet shows a call to find
String sentence = new String[]{
"Pierre",
"Vinken",
"is",
"61",
"years"
"old",
"."
};
Span nameSpans[] = nameFinder.find(sentence);
nameSpans数组现在只包含一个标记为的Span 皮埃尔温肯的名字。开始和结束偏移之间的元素是 名称标记。在这种情况下,开始偏移量为0和结束偏移量 是2.Space对象也知道实体的类型。在这种情况下 它的人(由模型定义)。它可以通过调用来检索 Span.getType()。除了统计名称查找器,OpenNLP 还提供字典和正则表达式名称查找器 实现。
答案 0 :(得分:3)
查看此NodeJS库。
https://github.com/mbejda/Node-OpenNLP
https://www.npmjs.com/package/opennlp
只需执行 NPM install opennlp
看看Github上的例子。
var nameFinder = new openNLP().nameFinder;
nameFinder.find(sentence, function(err, results) {
console.log(results)
});