You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Apache Tika提取字符串中姓名失败问题求助

问题原因分析

你当前的代码无法提取姓名,核心问题在于:

  • Apache Tika的AutoDetectParser默认不会从纯文本内容里提取人物姓名到person元数据字段。metadata.getValues("person")获取的是文档属性级别的元数据(比如Word/PDF文件的作者信息),而非从文本内容中识别的实体姓名。
  • 你使用的BodyContentHandler仅负责提取文本内容,不具备实体识别(NER)能力。
解决方案:使用Tika的实体识别功能

要从文本内容中提取姓名,需要启用Tika的命名实体识别(NER)组件,通常基于OpenNLP实现。以下是具体修改步骤:

1. 添加依赖(Maven示例)

确保引入包含实体识别功能的Tika依赖:

<dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-parsers-standard-package</artifactId>
    <version>2.9.1</version> <!-- 使用最新稳定版 -->
</dependency>

2. 修改代码实现实体提取

替换原有的BodyContentHandler为OpenNLPContentHandler,并配置解析上下文启用实体识别:

import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.sax.OpenNLPContentHandler;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.annotation.Nonnull;
import org.xml.sax.SAXException;
import org.apache.tika.exception.TikaException;

public static List<String> extractDataFromText(@Nonnull String input) throws TikaException, IOException, SAXException {
    List<String> data = new ArrayList<>();
    List<String> names = new ArrayList<>();
    ByteArrayInputStream stream = new ByteArrayInputStream(input.getBytes(StandardCharsets.UTF_8));
    
    AutoDetectParser parser = new AutoDetectParser();
    Metadata metadata = new Metadata();
    // 初始化支持实体识别的Handler
    OpenNLPContentHandler entityHandler = new OpenNLPContentHandler();
    ParseContext context = new ParseContext();
    // 将实体Handler注入解析上下文
    context.set(ContentHandler.class, entityHandler);
    
    try {
        parser.parse(stream, entityHandler, metadata, context);
    } catch (TikaException | SAXException e) {
        e.printStackTrace();
    }

    // 提取识别出的PERSON类型实体(姓名)
    Map<String, List<String>> entities = entityHandler.getEntities();
    if (entities.containsKey("PERSON")) {
        names.addAll(entities.get("PERSON"));
    }

    System.out.println(names);

    Pattern pattern = Pattern.compile(EMAIL_ADDRESS + "|" + PHONE_NUMBER);
    Matcher matcher = pattern.matcher(input);

    while (matcher.find()) {
        data.add(matcher.group());
    }

    return data;
}

3. 注意事项

  • Tika 2.x与1.x的API存在差异,上述示例基于Tika 2.x版本编写,请确保依赖版本匹配。
  • 首次运行时,OpenNLP会自动下载预训练的实体识别模型,需要网络连接;若需离线使用,可手动配置模型路径。
  • 实体识别的准确率依赖预训练模型,对于特定领域的姓名,可能需要自定义训练模型来优化效果。

内容的提问来源于stack exchange,提问作者Ioanaa 98

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 11:37:38