在openNLP中编写我们自己的模型

时间:2014-06-24 07:46:05

标签: java nlp opennlp named-entity-recognition

如果我在命令行中使用这样的查询

./opennlp TokenNameFinder en-ner-person.bin "input.txt" "output.txt"

我会在output.txt中打印人名,但我想编写自己的模型,以便打印我自己的实体。

E.g。

  1. icm2500的风险值是多少。
  2. prd_234的交付将迟到。
  3. Watson正在处理router_34。
  4. 如果我通过这些行,它应该解析并提取product_entities。 icm2500,prd_234,router_34 ......等这些都是产品(我们可以将这些信息保存在一个文件中,我们可以将它用作模型或openNLP的查找类型。)

    任何人都可以告诉我如何做到这一点?

1 个答案:

答案 0 :(得分:2)

您需要通过以opennlp格式注释一些句子来训练您自己的模型。对于您发布的示例句子,格式如下所示:

what is the risk value on <START:product> icm2500 <END>.
Delivery of <START:product> prd_234 <END> will be arrived late.
Watson is handling <START:product> router_34 <END>.

确保每个句子以换行符结尾,如果句子中有换行符以某种方式逃脱它们。 一旦从数据中创建了这样的文件,就可以使用Java API来训练模型,如此

public static void main(String[] args){

Charset charset = Charset.forName("UTF-8");
ObjectStream<String> lineStream =
        new PlainTextByLineStream(new FileInputStream("your file in the above format"), charset);
ObjectStream<NameSample> sampleStream = new NameSampleDataStream(lineStream);

TokenNameFinderModel model;

try {
  model = NameFinderME.train("en", "person", sampleStream, TrainingParameters.defaultParams(),
            null, Collections.<String, Object>emptyMap());
}
finally {
  sampleStream.close();
}

try {
  modelOut = new BufferedOutputStream(new FileOutputStream(modelFile));
  model.serialize(modelOut);
} finally {
  if (modelOut != null) 
     modelOut.close();      
}

}

现在您可以将该模型与名称搜索器一起使用。

因为您可能有一个明确的,可能很短的产品名称列表,所以您可能会考虑使用简单的正则表达式方法。

这里是一个覆盖NameFinder的opennlp文档:

http://opennlp.apache.org/documentation/1.5.3/manual/opennlp.html#tools.namefind.training.tool