如何在node.js应用程序中使用Apache OpenNLP

时间:2014-06-22 16:20:16

标签: multithreading node.js apache architecture opennlp

将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   还提供字典和正则表达式名称查找器   实现。

1 个答案:

答案 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)
});