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

如何使用OpenNLP创建自定义模型?

百里意智
2023-03-14

我试图使用OpenNLPJavaAPI从文档中提取名称、技能等实体。但它没有提取正确的名称。我使用opennlp源锻造链接上可用的模型

下面是一段java代码-

public class tikaOpenIntro {

    public static void main(String[] args) throws IOException, SAXException,
            TikaException {

        tikaOpenIntro toi = new tikaOpenIntro();
        toi.filest("");
        String cnt = toi.contentEx();
        toi.sentenceD(cnt);
        toi.tokenization(cnt);

        String names = toi.namefind(toi.Tokens);
        toi.files(names);

    }

    public String Tokens[];

    public String contentEx() throws IOException, SAXException, TikaException {
        InputStream is = new BufferedInputStream(new FileInputStream(new File(
                "/home/rahul/Downloads/rahul.pdf")));
        // URL url=new URL("http://in.linkedin.com/in/rahulkulhari");
        // InputStream is=url.openStream();
        Parser ps = new AutoDetectParser(); // for detect parser related to

        BodyContentHandler bch = new BodyContentHandler();

        ps.parse(is, bch, new Metadata(), new ParseContext());

        return bch.toString();

    }

    public void files(String st) throws IOException {
        FileWriter fw = new FileWriter("/home/rahul/Documents/extrdata.txt",
                true);
        BufferedWriter bufferWritter = new BufferedWriter(fw);
        bufferWritter.write(st + "\n");
        bufferWritter.close();
    }

    public void filest(String st) throws IOException {
        FileWriter fw = new FileWriter("/home/rahul/Documents/extrdata.txt",
                false);

        BufferedWriter bufferWritter = new BufferedWriter(fw);
        bufferWritter.write(st);
        bufferWritter.close();
    }

    public String namefind(String cnt[]) {
        InputStream is;
        TokenNameFinderModel tnf;
        NameFinderME nf;
        String sd = "";
        try {
            is = new FileInputStream(
                    "/home/rahul/opennlp/model/en-ner-person.bin");
            tnf = new TokenNameFinderModel(is);
            nf = new NameFinderME(tnf);

            Span sp[] = nf.find(cnt);

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

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

            }
            sd = fd.toString();

        } catch (FileNotFoundException e) {

            e.printStackTrace();
        } catch (InvalidFormatException e) {

            e.printStackTrace();
        } catch (IOException e) {

            e.printStackTrace();
        }
        return sd;
    }


    public void sentenceD(String content) {
        String cnt[] = null;
        InputStream om;
        SentenceModel sm;
        SentenceDetectorME sdm;
        try {
            om = new FileInputStream("/home/rahul/opennlp/model/en-sent.bin");
            sm = new SentenceModel(om);
            sdm = new SentenceDetectorME(sm);
            cnt = sdm.sentDetect(content);

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public void tokenization(String tokens) {

        InputStream is;
        TokenizerModel tm;

        try {
            is = new FileInputStream("/home/rahul/opennlp/model/en-token.bin");
            tm = new TokenizerModel(is);
            Tokenizer tz = new TokenizerME(tm);
            Tokens = tz.tokenize(tokens);
            // System.out.println(Tokens[1]);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

我想做的是:

  • 我正在使用ApacheTika将PDF文档转换为纯文本文档

但它正在提取姓名和其他单词。它不是提取专有名称。如何创建自定义模型,从文档中提取游泳、编程等技能?

给我一些想法!

任何帮助都将不胜感激!?

共有3个答案

姬温文
2023-03-14

一种方法是保存一个已知专有名称的列表,这些名称可以出现在文档中。这也是培养技能的好方法。识别命名实体时,应检查其是否出现在列表中。

另一种方法是编写自己的组件来提取命名实体,这比OpenNLP做得更好,但可能要困难得多。

宦烈
2023-03-14

这篇帖子可能会有所帮助

OpenNLP:无法识别外来名称

它展示了如何使用称为“Modelbuilder-addon”的非常新的OpenNLP插件生成模型

你给它输入一个句子文件,一个已知名字文件,然后告诉它把模型放在哪里。嗯

习狐若
2023-03-14

听起来你对OpenNLP的预建名称模型的性能不满意。但是(a)模型从来都不是完美的,即使是最好的模型也会错过一些它本该抓住的东西,抓住一些它本该错过的东西;(b)如果模型训练过的文档与您试图标记的文档在类型和文本风格上匹配,那么模型的性能会最好(因此,训练过混合大小写文本的模型不会很好地适用于所有大写文本,而训练过新闻文章的模型也不会很好地适用于推文)。你可以尝试其他公开可用的工具,比如斯坦福NE工具包或LingPipe;他们可能有性能更好的模型。但没有一个是完美的。

要创建自定义模型,需要生成一些训练数据。对于OpenNLP,它看起来像

I have a Ph.D. in <START:skill> operations research <END>

对于像这样具体的事情,你可能需要自己拿出数据。你需要很多;OpenNLP文档推荐了大约15000个例句。有关更多详细信息,请参阅OpenNLP文档。

 类似资料:
  • 我的要求是像这样分析句子。“给我找一本饥饿的潮汐书。”或者“饥饿的潮水或破碎的镜子,哪一个更好。”饥饿的潮汐和破碎的镜子是书的名字,为此我需要创建一个自定义模型,在给定的令牌数组中找到书的标题。因此,稍后我可以根据给定的句子创建一个查询。请让我知道我如何做到这一点,或者如果有任何其他方法来分析这样的句子。

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

  • 我正在尝试执行OpenNLP模型,我已经为我的自定义名称进行了培训。我执行以下命令来制作定制模型: OpenNLP TokenNameFinderTrainer-编码UTF-8-lang en-data c:\用户\nshah\桌面\en-ner-person.train-model en-ner-PERName.bin 我能够成功创建名为en-ner personName的模型。箱子 现在我正在

  • 我们有一个报告编写工具,我们正在尝试添加搜索功能。基本上,用户可以输入一个问题,并根据句子中的标准返回一份报告。我们正在尽可能地保持开放性,不需要特定的句子结构,这就是为什么我们想尝试OpenNLP-NER。 例如: “上季度的艺术出勤率是多少?” 标记为: 我们试着用不同的部门,不同的过滤器等提出不同的问题。。我们还没有达到15k,只有14.6k,所以我们还在努力。 就分析问题而言,这是问题的开

  • 这是我的培训代码 滚轮编号。火车 结果训练 当我使用这段代码测试它时。 给出了如下结果。有些时候是错的。

  • 问题内容: 我正在http://www.cafeaulait.org/javafaq.html上阅读#6.10项,然后我开始怀疑大型企业如何创建自己的JVM实现。一个人会尝试(或可行)实验性的东西吗? 问题答案: 从技术上讲,创建该新JVM所需的所有信息都是该语言和目标平台的公共规范。即使字节码解释在很大程度上相同,JVM还是需要根据其是要在台式机还是手机上运行而有所不同。 一些开始寻找信息的地方