当前位置: 首页 > 知识库问答 >
问题:

如何在OpenNLP中训练名称模型?

章岳
2023-03-14

我正在尝试训练名称查找器模型来检测名称,但它没有给出正确的结果。这是代码。

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        InputStream is=null;
        Resources resources=this.getResources();
        assetManager=resources.getAssets();

        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  void predict(String sentence[], String modelFile) throws Exception {
        InputStream is1 ;
        is1 = assetManager.open("en-ner-person.bin",MODE_PRIVATE);

        TokenNameFinderModel model1 = new TokenNameFinderModel(is1);

        String sd;
        NameFinderME nameFinder = new NameFinderME(model1);
        Span sp[] = nameFinder.find(sentence);

        String a[] = Span.spansToStrings(sp, sentence);
        StringBuilder fd = new StringBuilder();
        int l = a.length;

        for (int j = 0; j < l; j++) {
            fd = fd.append(a[j] + "\n");

        }
        sd = fd.toString();
        Log.d("Name Detected:", sd);

    }



}

这是iam得到的输出:

检测到的名称:[07-20 19:35:47.516 8799:8799 I/Adreno EGL]

en-ner-person.train内容是:

<START:person> Sunil <END> , 61 years old , will join the board as a nonexecutive director Nov. 29 .

请帮忙。

共有1个答案

潘星阑
2023-03-14

试试这个:

 Span[] sp = nameFinder.find(search);
 nameFinder.clearAdaptiveData();

 for (Span span : sp) {
   for (int i=span.getStart(); i<span.getEnd(); i++) {
     fd.append(sentence[i] + "\n");
   }
 }

此外,这一行似乎是错误的,您不需要再次将append tofd的内容分配给它。

fd = fd.append(a[j] + "\n");

希望这有帮助。

 类似资料:
  • 我发现很难创建自己的openNLP模型。谁能告诉我,如何拥有自己的模型。培训应该如何进行。 输入应该是什么,输出模型文件将存储在哪里。

  • 编辑1:主要的问题是在训练完一个NER模型后,我将它应用到令牌上。因此,它不会识别“轮滑”,因为在代币中,它们以“轮滑”和“滑冰”的形式出现,而NER模型现在无法识别这个爱好。

  • 我使用的OpenNLP模型如下: 我想把我的数据附加到训练数据集中,这些模型就是在这个数据集中训练的。那么请告诉我从哪里可以得到原始数据集?

  • 我刚开始使用OpenNLP。我需要创建一个简单的训练模型来识别名称实体。

  • 大家已经提到了这个,这个,这个和这个,但是仍然发现很难建立一个自定义的名字查找器模型。。以下是代码: 我在尝试执行命令行时不断出现错误: 让我把论点1改为 然后我收到一个运行时错误,说你不能强制转换这个。这是我在线程“main”中强制转换 第二个问题是: 给出一个语法错误。不确定这里出了什么问题。如果有任何帮助,我将不胜感激,因为我已经尝试了上述链接上的所有代码片段。 祝好

  • 我试图用下面的代码训练模型,但我一直在方法上收到错误,它告诉我将更改为。为什么?