使用Tika进行文档解析抽取

1、文本内容抽取

文件搜索的第一要务是抽取文件内容,我们使用Apache Tika。
Apache Tika是一个用户文件类型检测和文件内容提取的库,Apache顶级项目,可检索超过1000中类型的文档,广泛应用于搜索引擎、内容分析、文本翻译、数字资产管理等。主要特点如下:
(1)统一解析器接口
(2)低内存占用
(3)快速处理
(4)灵活元数据
(5)解析器集成
(6)MIME类型检测
(7)语言检测
下载:https://tika.apache.org/download.html 下载相应jar包,单击Mirrors for tika-app-1.13.jar 选择合适的镜像源下载。
Tika可作为GUI工具使用,打开终端,切换到tika-app-1.13.jar所在目录,启动Tika,运行命令:java -jar tika-app-1.13.jar -g
在这里插入图片描述
打开一个文件,也可以是一个url。
在这里插入图片描述
可以看到,默认显示的是文档的元数据信息,如果想看更多内容,点击view可以查看文档元数据信息、格式化之后的文本内容、纯文本内容、核心内容、结构化文本以及递归转换过后的JSON文本。

2、搭建工程。

(1)将tika-app-1.13.jar导入IDEA或者eclipse中类路径下。
或者以下加入pom依赖:

    <!--tika用来解析抽取文档、PDF等
    https://mvnrepository.com/artifact/org.apache.tika/tika-core -->
    <dependency>
      <groupId>org.apache.tika</groupId>
      <artifactId>tika-core</artifactId>
      <version>1.13</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.tika/tika-parsers -->
    <dependency>
      <groupId>org.apache.tika</groupId>
      <artifactId>tika-parsers</artifactId>
      <version>1.13</version>
    </dependency>

(2)新建一个文件目录,用来存放测试文件,放5种DOC、DOCX、PDF、TXT、PPTX类型的文件。
(3)建一个TikaParsePDF的java类。

3、内容抽取

import org.apache.tika.exception.TikaException;
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.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * Created by grant on 2019/9/25.
 */
public class TikaParsePDF {
    public static void main(String[] args) throws IOException, TikaException, SAXException {
        String filepath = "resource/ParseFile/Spark SQL.pdf";
        //新建File对象
        File pdfFile = new File(filepath);
        //读入文件
        FileInputStream inputStream = new FileInputStream(pdfFile);
        //创建内容处理器对象
        BodyContentHandler handler = new BodyContentHandler();
        //创建元数据对象
        Metadata metadata = new Metadata();
        //创建内容解析器对象
        ParseContext parseContext = new ParseContext();
        //实例化PDFParser对象
        PDFParser parser = new PDFParser();
        //调用parse()方法解析文件
        parser.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());


    }
}

结果为:

文件属性信息:
date:2017-04-11T08:00:43Z
pdf:unmappedUnicodeCharsPerPage:0
pdf:PDFVersion:1.7
pdf:docinfo:title:
xmp:CreatorTool:
Company:
Keywords:
access_permission:modify_annotations:true
access_permission:can_print_degraded:true
subject:
dcterms:created:2017-04-11T08:00:43Z
Last-Modified:2017-04-11T08:00:43Z
dcterms:modified:2017-04-11T08:00:43Z
dc:format:application/pdf; version=1.7
Last-Save-Date:2017-04-11T08:00:43Z
pdf:docinfo:creator_tool:
access_permission:fill_in_form:true
pdf:docinfo:keywords:
pdf:docinfo:modified:2017-04-11T08:00:43Z
meta:save-date:2017-04-11T08:00:43Z
pdf:encrypted:false
modified:2017-04-11T08:00:43Z
pdf:docinfo:custom:SourceModified:D:20170411162843+08'28'
cp:subject:
pdf:docinfo:subject:
Content-Type:application/pdf
pdf:docinfo:creator:
dc:subject:
meta:creation-date:2017-04-11T08:00:43Z
created:2017-04-11T08:00:43Z
Comments:
access_permission:extract_for_accessibility:true
access_permission:assemble_document:true
xmpTPg:NPages:12
Creation-Date:2017-04-11T08:00:43Z
pdf:charsPerPage:20
access_permission:extract_content:true
pdf:docinfo:custom:Company:
access_permission:can_print:true
SourceModified:D:20170411162843+08'28'
pdf:docinfo:custom:Comments:
meta:keyword:
producer:
access_permission:can_modify:true
pdf:docinfo:producer:
pdf:docinfo:created:2017-04-11T08:00:43Z


pdf文件中的内容:

Spark SQL的最佳搭档Dataframe

• Spark SQL是Spark的核心组件之一,于20144月随Spark 1.0版一同面世,在Spark 1.3当

中,Spark SQL终于从alpha(内测版本)阶段毕业。

• Spark 1.3更加完整的表达了Spark SQL的愿景:让开发者用更精简的代码处理尽量少的数据

,同时让Spark SQL自动优化执行过程,以达到降低开发成本,提升数据分析执行效率的目

的。

• 与RDD类似,DataFrame也是一个分布式数据容器。然而DataFrame更像传统数据库的二维

表格,除了数据以外,还掌握数据的结构信息,即schema。同时,与Hive类似,

DataFrame也支持嵌套数据类型(struct、array和map)。从API易用性的角度上 看,

DataFrame API提供的是一套高层的关系操作,比函数式的RDD API要更加友好,门槛更低

上述使用的PDFParser,还可以解析图像、音频如(MP3)、视频如(MP4)等,其他类型的接口为:

//解析MS Office文档
OOXMLParser parser = new OOXMLParser();
//解析文本文件
TXTParser parser = new TXTParser();
//解析HTML文件
HtmlParser parser = new HtmlParser();
//解析XML文件
XMLParser parser = new XMLParser();
//解析class文件
ClassParser parser = new ClassParser();

4、自动解析

在这里插入图片描述
(1)使用Tika对象提取文档内容

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

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

/**
 * Created by grant on 2019/9/25.
 */
public class TikaExtraction {
    public static void main(String[] args) throws IOException, TikaException {
        Tika tika = new Tika();
        //新建各种存放文件的files文件夹
        File fileDir = new File("TikaFiles");
        //如果文件夹路径错误,退出程序
        if(!fileDir.exists()){
            System.out.println("文件夹不存在,请检查!");
            System.exit(0);
        }
        //获取文件夹下所有文件,存放在File数组中
        File[] fileArr = fileDir.listFiles();
        String fileContent;
        for (File file : fileArr) {
            fileContent = tika.parseToString(file);//自动解析
            System.out.println("Extracted Content: "+fileContent);
        }
    }
}

(2)使用Parser对象提取内容

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

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

/**
 * Created by grant on 2019/9/25.
 */
public class ParserExtraction {
    public static void main(String[] args) throws IOException, TikaException, SAXException {
        Tika tika = new Tika();
        //新建各种存放文件的files文件夹
        File fileDir = new File("TikaFiles");
        //如果文件夹路径错误,退出程序
        if(!fileDir.exists()){
            System.out.println("文件夹不存在,请检查!");
            System.exit(0);
        }
        //获取文件夹下所有文件,存放在File数组中
        File[] fileArr = fileDir.listFiles();
        //创建内容处理器对象
        BodyContentHandler handler = new BodyContentHandler();
        //创建元数据对象
        Metadata metadata = new Metadata();
        FileInputStream inputStream = null;
        Parser parser = new AutoDetectParser();
        //自动检测分词器
        ParseContext context = new ParseContext();
        for (File file : fileArr) {
            inputStream = new FileInputStream(file);
            parser.parse(inputStream,handler,metadata,context);
            System.out.println(file.getName() + ":\n" + handler.toString());
        }

    }
}

使用parser接口自动提取与tika对象提取的区别在于实例化对象不一样,AutoDetectParser是CompositeParser的子类,它能够自动解析文件类型,并使用相应的方法把接收到的文档自动发送给最接近的解析器类。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值