3.3、Lucene文件检索实战 —— 文本内容抽取


3.3.1 Tika 简介

3.3.2、Tika下载

3.3.3、搭建工程

3.3.4、内容抽取

3.3.5、自动解析

-—————————————–

代码仓库:https://gitee.com/carloz/lucene-learn/tree/master/tika-demo

-—————————————–

3.3.1 Tika 简介

Apache Tika 用于 文件类型检测 和 文件内容提取;

使用目标群体: 搜索引擎、 内容索引和分析工具;

编程语言:Java;

  • Tika 可以检测超过1000种不同类型的文档,比如 DOC、DOCX、PPT、PPTX、TXT、PDF;
  • 所有的文本类型 都可以通过一个简单的接口被解析;
  • 广泛应用于 搜索引擎、内容分析、文本翻译、数字资产管理 等领域;
  • 通过一个通用的API提取 多种文件格式 的内容;

Tika特点:

  • 统一解析器接口
  • 低内存占用
  • 快速处理
  • 灵活元数据
  • 解析器集成
  • MIME类型检测
  • 语言检测

3.3.2、Tika下载

官网:https://tika.apache.org/download.html

下载地址:http://mirror.bit.edu.cn/apache/tika/tika-app-1.20.jar

以 GUI 的方式打开:java -jar tika-app-1.20.jar -g

使用 File -> open 代开一个本地文件,查看提取完成以后的数据

3.3.3、搭建工程——Java中使用Tika

1、创建Maven工程 TikaDemo

2、添加pom引用

1
2
3
4
5
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-app</artifactId>
<version>1.20</version>
</dependency>

3、工程根目录下 新建 files文件夹, 存放 待提取的测试文件

4、新建名为 TikaParsePdfDemo.java

1566710783346

3.3.4、内容抽取——提取PDF文件的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.learn.tikademo;

import org.apache.tika.exception.TikaException;
import org.apache.tika.io.TikaInputStream;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.pdf.PDFParser;
import org.apache.tika.sax.BodyContentHandler;
import org.xml.sax.SAXException;

import java.io.*;

/**
* 3.3.4 Tika提供PDF文件内容
*/
public class TikaParsePdfDemo {
public static void main(String[] args) throws FileNotFoundException, IOException, TikaException, SAXException {
// 文件路径
String filepath = "files/IKAnalyzer中文分词器V2012使用手册.pdf";
// 新建File对象
File pdfFile = new File(filepath);
// 创建 内容处理器对象
BodyContentHandler handler = new BodyContentHandler();
// 创建 元数据对象
Metadata metadata = new Metadata();
// 读入文件
// FileInputStream inputStream = new FileInputStream(pdfFile);
InputStream inputStream = TikaInputStream.get(pdfFile);
// 创建解析器对象
ParseContext parseContext = new ParseContext();
// 实例化 PDFParser 对象
PDFParser pdfParser = new PDFParser();
// 调用 parse() 方法解析文件
pdfParser.parse(inputStream, handler, metadata, parseContext);
// 遍历元数据内容
System.out.println("文件属性信息");
for (String name : metadata.names()) {
System.out.println(name + ":" + metadata.get(name));
}
// 打印 pdf 文件中的内容
System.out.println("pdf 文件中的内容:");
System.out.println(handler.toString());

}
}

  • PDFParser —— 用于解析 PDF 文件; PDFParser pdfParser = new PDFParser();
  • OOXMLParser —— 用于解析 MS Office 文件;OOXMLParser ooxmlParser = new OOXMLParser();
  • TXTParser —— 用于解析 文本文件; TXTParser txtParser = new TXTParser();
  • HtmlParser —— 用于解析 HTML 文件;HtmlParser htmlParser = new HtmlParser();
  • XMLParser —— 用于解析 XML 文件;XMLParser xmlParser = new XMLParser();
  • ClassParser —— 用于解析 class 文件;ClassParser classParser = new ClassParser();

Tika还可以解析 图像、音频(如 MP3)、视频(如MP4)等多种类型的文件

3.3.5、自动解析

上述解析pdf的例子如下:确定PDF文件 -> 实例化PDFParser -> 提取内容;

强大之处:Tika可以 先判断文件类型, 再根据文档类型实例化解析接口;

自动解析文档过程

  1. 传任意类型文件到 Tika ==> Tika 自身检测文件类型;
  2. Tika解析器库,根据 文件类型,选择合适的解析器;
  3. 解析完成后,对文档内容 进行提取,元数据提取;

两种解析方案

  • 使用Tika对象解析
  • 使用Parse接口解析

使用Tika对象解析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.learn.tikademo;

import org.apache.tika.Tika;
import org.apache.tika.exception.TikaException;

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

/**
* 3.3.5、自动解析 —— 使用Tika对象解析
* 1、传任意类型文件到 Tika ==> Tika 自身检测文件类型;
* 2、Tika解析器库,根据 文件类型,选择合适的解析器;
* 3、解析完成后,对文档内容 进行提取,元数据提取;
*/
public class TikaExtractionDemo {
public static void main(String[] args) throws IOException, TikaException {
Tika tika = new Tika();
// 新建存放各种文件的文件里 files
File fileDir = new File("files");
// 如果文件夹路径错误,退出程序
if (!fileDir.exists()) {
System.out.println("文件夹不存在,请检查");
System.exit(0);
}
// 获取文件夹下的所有文件,存放在File数组中
File[] fileArr = fileDir.listFiles();
String fileContent;
for (File f : fileArr) {
fileContent = tika.parseToString(f); // 自动解析
System.out.println("Extracted Content: " + fileContent);
}
}
}

使用Parse接口解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package com.learn.tikademo;

import org.apache.tika.exception.TikaException;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.Parser;
import org.apache.tika.sax.BodyContentHandler;
import org.xml.sax.SAXException;

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

/**
* 3.3.5、自动解析 —— 使用Parse接口解析
* 1、传任意类型文件到 Tika ==> Tika 自身检测文件类型;
* 2、Tika解析器库,根据 文件类型,选择合适的解析器;
* 3、解析完成后,对文档内容 进行提取,元数据提取;
*/
public class ParserExtractionDemo {
public static void main(String[] args) throws FileNotFoundException, IOException, SAXException, TikaException {
// 新建存放各种文件的文件里 files
File fileDir = new File("files");
// 如果文件夹路径错误,退出程序
if (!fileDir.exists()) {
System.out.println("文件夹不存在,请检查");
System.exit(0);
}

Metadata metadata = new Metadata(); // 创建元数据对象
Parser parser = new AutoDetectParser();
ParseContext parseContext = new ParseContext(); // 自动检测分词器

// 获取文件夹下的所有文件,存放在File数组中
FileInputStream inputStream = null;
File[] fileArr = fileDir.listFiles();
for (File f : fileArr) {
inputStream = new FileInputStream(f);
BodyContentHandler handler = new BodyContentHandler(); // 创建内容处理器对象
parser.parse(inputStream, handler, metadata, parseContext);
System.out.println("ParserExtractionDemo-" + f.getName() + ":\n" + handler.toString());
}
}
}

运行结果查询: