📜  OpenNLP-命名实体识别(1)

📅  最后修改于: 2023-12-03 15:03:22.981000             🧑  作者: Mango

OpenNLP 命名实体识别

OpenNLP 是一个自然语言处理工具包,其中的命名实体识别模块能够较为准确地从文本中识别出实体,如人名、地名、组织机构名等。本文将介绍如何使用 OpenNLP 进行命名实体识别。

安装

首先需要下载 OpenNLP,选择合适的版本并解压到指定位置。然后下载 Apache Maven 并安装到本地。

接下来,在项目的 pom.xml 文件中添加以下依赖:

<dependency>
    <groupId>org.apache.opennlp</groupId>
    <artifactId>opennlp-tools</artifactId>
    <version>1.9.2</version>
</dependency>
使用
  1. 加载模型

加载命名实体识别模型,一般有两种方式:从文件系统加载或从 jar 包中加载。

InputStream is = new FileInputStream("en-ner-person.bin");
TokenNameFinderModel model = new TokenNameFinderModel(is);
NameFinderME nameFinder = new NameFinderME(model);
  1. 进行识别

对于待识别的文本,先进行分词,然后使用 NameFinderMEfind 方法进行实体识别。

String[] tokens = new String[]{"John", "Smith", "works", "at", "Acme", "Inc", "."};
Span[] spans = nameFinder.find(tokens);

函数的返回结果是一个 Span 数组,其中每个元素表示一个实体的位置信息和类型信息。

  1. 输出结果

可以通过 SpangetTypegetCoveredText 方法获取实体类型和实体文本。

for (Span span : spans) {
    System.out.println(span.getType() + " - " + span.getCoveredText(tokens));
}
示例代码
import opennlp.tools.namefind.NameFinderME;
import opennlp.tools.namefind.TokenNameFinderModel;
import opennlp.tools.util.Span;

import java.io.FileInputStream;
import java.io.InputStream;

public class NameFinderExample {

    public static void main(String[] args) throws Exception {
        InputStream is = new FileInputStream("en-ner-person.bin");
        TokenNameFinderModel model = new TokenNameFinderModel(is);
        NameFinderME nameFinder = new NameFinderME(model);

        String[] tokens = new String[]{"John", "Smith", "works", "at", "Acme", "Inc", "."};
        Span[] spans = nameFinder.find(tokens);

        for (Span span : spans) {
            System.out.println(span.getType() + " - " + span.getCoveredText(tokens));
        }
    }

}
总结

OpenNLP 的命名实体识别模块提供了较为准确的实体识别能力,通过简单的加载模型和调用方法即可使用,适用于大部分命名实体识别的场景。需要注意的是,其准确性会因所使用的模型和文本样本的不同而有所变化,因此需要进行适当的模型选择和评估。