【问题标题】:How to create Custom model using OpenNLP?如何使用 OpenNLP 创建自定义模型?
【发布时间】:2013-07-31 14:24:25
【问题描述】:

我正在尝试使用 OpenNLP Java API 从文档中提取实体,例如姓名、技能。但它没有提取正确的名称。我正在使用opennlp sourceforge link上提供的模型

这是一段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();
        }
    }

}

我想做的是:

  • 我正在使用 Apache Tika 将 PDF 文档转换为纯文本文档。
  • 我正在传递纯文本文档以进行句子边界检测。
  • 在此标记化之后
  • 在此名称实体提取之后

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

给我一些想法!

任何帮助将不胜感激!?

【问题讨论】:

  • 这个问题你解决了吗?

标签: java nlp stanford-nlp apache-tika opennlp


【解决方案1】:

您可以这样做的一种方法是保留已知专有名称的列表,这些专有名称可以出现在文档中。这也将是一个很好的技能方法。当您识别一个命名实体时,您应该检查它是否出现在列表中。

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

【讨论】:

    【解决方案2】:

    我听说有人使用 Apache UIMA for NER 取得了不错的成功。前一天在这里讨论过这个问题:how to use Entity Recognition with Apache solr and LingPipe or similar tools

    它有几个你可能想看看的链接。

    【讨论】:

      【解决方案3】:

      听起来您对 OpenNLP 的预构建名称模型的性能不满意。但是(a)模型从来都不是完美的,即使是最好的模型也会错过一些它应该抓住的东西,抓住一些它应该错过的东西; (b) 如果模型训练的文档与您尝试标记的文档在流派和文本样式上匹配,则模型将表现最佳(因此,在混合大小写文本上训练的模型在所有情况下都不能很好地工作-大写文本,并且在新闻文章上训练的模型在推文等方面效果不佳)。您可以尝试其他公开可用的工具,例如 Stanford NE toolkit 或 LingPipe;他们可能有性能更好的模型。但它们都不会是完美的。

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

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

      对于这样的具体情况,您可能需要自己提供这些数据。你会需要很多; OpenNLP 文档推荐了大约 15,000 个例句。有关详细信息,请参阅 OpenNLP 文档。

      【讨论】:

      • 一旦你有了15000个句子,你如何把它变成一个模型?
      • @SamBayer :我已经训练了一个包含 50K 句子的自定义模型。我已经注释了这些句子。在测试该模型时,它会将整个输入字符串作为实体返回。你能指导一下,为什么会这样吗?
      • 这是一个非常开放的问题 - 有各种各样的事情都可能出错。数据可能格式错误,或者您可能忘记提供一个开关,或者,几乎是其他任何东西。也许 OpenNLP 用户邮件列表是获取此指南的更好地方。
      【解决方案4】:

      这篇文章可能会有所帮助

      OpenNLP: foreign names does not get recognized

      它展示了如何使用名为“modelbuilder-addon”的全新 OpenNLP 插件生成模型

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-21
        • 1970-01-01
        • 2015-01-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多