使用Apache OpenNLP创建自定义模型的问题。测试模型时没有输出

时间:2017-05-30 08:18:55

标签: model opennlp

我在尝试创建自定义模型时遇到了问题。问题是我基于培训文件创建了自定义模型,培训成功。 但是,当我使用示例输入测试模型时(实际上是从训练文件本身获取),这不会给出任何输出。 我甚至试过超过15000个句子,但它从来没有给我输出。 1.尝试过的代码: -

    package com.tcs.ai.opennlp.anothercustommodel.anothercustommodel;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.util.Collections;
import opennlp.tools.namefind.NameFinderME;
import opennlp.tools.namefind.NameSample;
import opennlp.tools.namefind.NameSampleDataStream;
import opennlp.tools.namefind.TokenNameFinderModel;
import opennlp.tools.util.ObjectStream;
import opennlp.tools.util.PlainTextByLineStream;
import opennlp.tools.util.Span;
public class AnotherCustomModel {
public static void main(String args[])
    {
        InputStream is=null;
        String trainingDataFile = "en-ner-person.train";
        String outputModelFile = "en-ner-person.bin";
        String sentence[] = {"Sunil", "61 years old , will join the board as a nonexecutive director Nov. 29" };
        train(trainingDataFile, outputModelFile, "person");
        try {
            predict(sentence, outputModelFile);
        }
        catch(Exception e)
        {
            System.out.println("Errror Preditct" + e.getMessage());
        }       
    }
    private static void train(String trainingDataFile, String outputModelFile, String tagToFind) {
        NameSampleDataStream nss = null;
        try {
            nss = new NameSampleDataStream(new PlainTextByLineStream(new java.io.FileReader(trainingDataFile)));
        } catch (Exception e) {}
        TokenNameFinderModel model = null;
        try {
            model = NameFinderME.train("en", tagToFind, nss, Collections.<String, Object>emptyMap());
        } catch(Exception e) {}
        try {
            File outFile = new File(outputModelFile);
            FileOutputStream outFileStream = new FileOutputStream(outFile);
            model.serialize(outFileStream);
        }
        catch (Exception ex) {}
    }
    private  static void predict(String sentence[], String modelFile) throws Exception {
        InputStream is1 ;
        is1 = new FileInputStream("en-ner-person.bin");
        TokenNameFinderModel model1 = new TokenNameFinderModel(is1);
        String sd;
        NameFinderME nameFinder = new NameFinderME(model1); 
      StringBuilder fd = new StringBuilder();
        Span[] sp = nameFinder.find(sentence);
        nameFinder.clearAdaptiveData();
        for (Span span : sp) {
          for (int i=span.getStart(); i<span.getEnd(); i++) {
            fd.append(sentence[i] + "\n");
          }
        }
        sd = fd.toString();        
        System.out.println("Name Detected:[" + sd + "]");
    }
}
  1. en-ner-person.train: -

    <START:person> Sunil <END> , 61 years old , will join the board as a 
    

    非执行董事11月29日。

  2. 我甚至试过超过15000个句子。不幸的是,当我测试我的模型时,没有错误也没有输出(模型创建也是成功的

1 个答案:

答案 0 :(得分:0)

首先,您提供的输入为:
String sentence[] = {"Sunil", "61 years old , will join the board as a nonexecutive director Nov. 29" };

这是不必要的。使用maxent modeling训练OpenNLP模型。

你应该尝试给出一个句子或只是一个文本文件,然后让opennlp在那个词包上使用它模型来提取实体。

希望这会有所帮助。

<强>更新

这是我在opennlp工作的link,我已经创建了模型并使用它们。代码不言自明。如果你有任何疑问,请回复我。