知识库-向量化功能-Word文件向量化

16 阅读3分钟

知识库-向量化功能-Word文件向量化

一、核心逻辑

采用Apache POI组件解析Word文件,区分.doc(旧版二进制格式)和.docx(新版XML格式)两种后缀,分别适配对应的解析工具类,提取文件纯文本内容并做格式化处理,为后续文本向量化提供干净的数据源。

二、依赖配置(Maven)

<!-- Word文件解析核心依赖 -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.5</version> <!-- 适配.docx格式 -->
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-scratchpad</artifactId>
    <version>5.2.5</version> <!-- 适配.doc格式 -->
</dependency>

说明:POI 5.2.5为稳定版本,兼容主流Word文件格式,避免版本过低导致的解析异常。

三、核心实现代码

3.1 基础解析方法(区分doc/docx)

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

/**
 * 解析.doc格式Word文件
 * @param file 待解析的doc文件
 * @return 纯文本内容(去除首尾空白)
 * @throws IOException 文件读取异常
 */
private static String extractDocx(File file) throws IOException {
    // 资源自动关闭(try-with-resources),避免文件句柄泄漏
    try (FileInputStream fis = new FileInputStream(file);
         XWPFDocument doc = new XWPFDocument(fis);
         XWPFWordExtractor extractor = new XWPFWordExtractor(doc)) {
        return extractor.getText().trim();
    }
}

/**
 * 解析.doc格式Word文件
 * @param file 待解析的doc文件
 * @return 纯文本内容(去除首尾空白)
 * @throws IOException 文件读取异常
 */
private static String extractDoc(File file) throws IOException {
    try (FileInputStream fis = new FileInputStream(file);
         HWPFDocument doc = new HWPFDocument(fis);
         WordExtractor extractor = new WordExtractor(doc)) {
        return extractor.getText().trim();
    }
}

3.2 统一入口方法(自动识别格式+内容格式化)

/**
 * 统一读取Word文件文本内容
 * @param filePath Word文件绝对路径
 * @return 格式化后的纯文本(去除多余换行/空格)
 * @throws Exception 文件不存在/格式不支持/读取失败
 */
public static String getWordText(String filePath) throws Exception {
    File file = new File(filePath);
    // 校验文件合法性
    if (!file.exists()) {
        throw new FileNotFoundException("Word文件不存在:" + filePath);
    }
    if (!file.isFile()) {
        throw new IllegalArgumentException("路径非合法文件:" + filePath);
    }

    String rawText;
    // 按后缀识别文件格式,调用对应解析方法
    if (filePath.endsWith(".docx")) {
        rawText = extractDocx(file);
    } else if (filePath.endsWith(".doc")) {
        rawText = extractDoc(file);
    } else {
        throw new UnsupportedOperationException("不支持的文件格式:" + filePath + ",仅支持.doc/.docx");
    }

    // 格式化文本:去除多余换行、回车、制表符,保留单个空格
    return rawText.replaceAll("[\\r\\n\\t]+", "").replaceAll("\\s{2,}", " ");
}

四、核心设计说明

4.1 关键优化点

设计点解决的问题
区分doc/docx解析避免混用解析类导致的IllegalArgumentException(如用XWPFDocument解析.doc文件)
try-with-resources资源管理自动关闭文件流/文档对象,解决文件句柄泄漏问题
前置文件合法性校验提前拦截“文件不存在”“路径非文件”等基础异常,降低后续解析报错概率
文本格式化处理去除多余换行、制表符、连续空格,避免脏数据影响后续向量化效果

4.2 方法调用示例

// 调用示例
public static void main(String[] args) {
    try {
        String text = getWordText("D:/test.docx");
        System.out.println("解析后的文本内容:" + text);
    } catch (Exception e) {
        System.err.println("Word文件解析失败:" + e.getMessage());
        e.printStackTrace();
    }
}

五、注意事项

  1. 格式支持范围:仅支持.doc(Office 97-2003)和.docx(Office 2007+)格式,不支持WPS专属格式(如.wps);
  2. 异常处理:解析大文件(>100MB)时需增加超时控制,避免阻塞线程;
  3. 特殊内容处理:POI解析会忽略Word中的图片、表格格式,仅提取纯文本;若需解析表格内容,需额外适配XWPFTable/HWPFTable相关API;
  4. 编码问题:默认采用系统编码,若解析乱码,可在FileInputStream外层增加InputStreamReader指定编码(如UTF-8);
  5. 依赖冲突:若项目中存在其他POI版本,需统一版本号(建议5.2.5),避免NoClassDefFoundError

六、扩展建议

  1. 封装工具类:将解析方法封装为通用工具类,增加文件大小校验(如限制最大解析100MB);
  2. 异步解析:针对大批量Word文件,结合线程池实现异步解析,提升处理效率;
  3. 日志记录:增加解析日志(如文件路径、解析耗时、文本长度),便于问题排查;
  4. 容错处理:对损坏的Word文件增加重试机制,或返回空字符串避免程序崩溃。