3

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

这是一段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 文档转换为纯文本文档。
  • 我正在传递纯文本文档以进行句子边界检测。
  • 在这个标记化之后
  • 在此名称实体提取之后

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

给我一些想法!

任何帮助将不胜感激!?

4

4 回答 4

3

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

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

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

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

于 2013-11-14T18:00:58.673 回答
2

这篇文章可能会有所帮助

OpenNLP:外国名称无法识别

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

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

于 2014-01-26T14:07:23.723 回答
0

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

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

于 2013-08-14T19:28:03.783 回答
0

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

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

于 2013-08-14T18:40:33.077 回答