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的核心组件之一,于2014年4月随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的子类,它能够自动解析文件类型,并使用相应的方法把接收到的文档自动发送给最接近的解析器类。