知识库-向量化功能-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();
}
}
五、注意事项
- 格式支持范围:仅支持
.doc(Office 97-2003)和.docx(Office 2007+)格式,不支持WPS专属格式(如.wps); - 异常处理:解析大文件(>100MB)时需增加超时控制,避免阻塞线程;
- 特殊内容处理:POI解析会忽略Word中的图片、表格格式,仅提取纯文本;若需解析表格内容,需额外适配
XWPFTable/HWPFTable相关API; - 编码问题:默认采用系统编码,若解析乱码,可在
FileInputStream外层增加InputStreamReader指定编码(如UTF-8); - 依赖冲突:若项目中存在其他POI版本,需统一版本号(建议5.2.5),避免
NoClassDefFoundError。
六、扩展建议
- 封装工具类:将解析方法封装为通用工具类,增加文件大小校验(如限制最大解析100MB);
- 异步解析:针对大批量Word文件,结合线程池实现异步解析,提升处理效率;
- 日志记录:增加解析日志(如文件路径、解析耗时、文本长度),便于问题排查;
- 容错处理:对损坏的Word文件增加重试机制,或返回空字符串避免程序崩溃。