采取ApacheTika实现功能分析版权声明

原创
小哥 2年前 (2022-12-26) 阅读数 44 #大杂烩

使用Apache Tika实施内容分析
Apache Tika可以提取不同类型内容和元信息的开源工具,例如word、excel、pdf甚至多媒体文件JPEG、MP4。所有基于文本的和多媒体文件都可以使用通用接口进行解析Tika成为功能强大且多功能的内容分析库。

本文将介绍Apache Tika,包括解析API如何自动监控文档内容类型,以及示例。

引用类库
为了使用Apache Tika我们需要通过maven引入依赖关系:

org.apache.tika tika-parsers 1.17

读者可以找到正确的版本。

解析API
解析API是Tika的核心功能抽象了解析操作的复杂性,仅依赖于一种方法:

void parse(
InputStream stream,
ContentHandler handler,
Metadata metadata,
ParseContext context)
throws IOException, SAXException, TikaException

我们简要解释了方法参数:

stream,从需要分析的文档创建。InputStream实例
handler,从输入文档接收解析XHTML SAX事件顺序ContentHandler对象,该对象处理事件并以特定形式导出结果。
metadata,元数据对象,它在解析器中传递元数据属性
context具有上下文敏感信息ParseContext实例,用于自定义分析过程。
如果从输入流读取失败,parse方法抛出IOException异常,无法分析从流获取的文档并引发TikaException异常,处理器无法处理事件并将其抛出。SAXException异常。

当解析文档时,Tika尽可能重用现有的解析库,例如Apache POI或PDFBox因此,大多数解析器实现类只适应这些外部类库。接下来,我们将了解如何使用处理程序和元数据参数来提取文档的内容和元数据。为了方便,我们可以使用Tikadoor类调用解析器。Api。

自动监测
Apache Tika可以基于文档本身自动检测文档的类型和语言,而无需附加信息。

检测文档类型
可以通过Detector接口的实现类检测文档类型,并且只有一个方法:

MediaType detect(java.io.InputStream input, Metadata metadata) throws IOException
1
方法及其元数据参数,返回MediaType对象用于描述最佳相关类型的文档。

元数据不是探测器所依赖的唯一信息源,您还可以使用与文件开头的特殊模式相对应的神奇字节,或者将检测过程委托给更合适的检测器。

事实上,检测器算法依赖于实现。例如,默认探测首先使用magic字节,然后是元数据属性。如果无法获取文档类型,请使用service loader找到所有有效的探测器,然后依次尝试。

语言检测
除了文档类型之外,Tika也可以在没有元数据信息的情况下识别其语言。
Tika早期版本,使用LanguageIdentifier 实例检测文档语言。然而LanguageIdentifier对于web已弃用对该服务的支持。

语言检测服务现在传递抽象类LanguageDetector子类。使用web服务,您还可以访问成熟的在线翻译服务,如谷歌翻译或Microsoft Translator。为简洁起见,我们将不详细讨论这些服务。

Tika实战举例
本节通过示例进行描述Tika特性,示例方法封装在一个类中:

public class TikaAnalysis {
// illustration methods
}

检测文档类型
以下代码可以检测InputStream对应文档类型:

public static String detectDocTypeUsingDetector(InputStream stream)
throws IOException {
Detector detector = new DefaultDetector();
Metadata metadata = new Metadata();

MediaType mediaType = detector.detect(stream, metadata);
return mediaType.toString();
}

假设我们有一个pdf文件位于类路径下,扩展名被故意修改txt去误导tika,但仍然可以检测到实际的实数类型:

@Test
public void whenUsingDetector_thenDocumentTypeIsReturned() throws IOException {
InputStream stream = this.getClass().getClassLoader()
.getResourceAsStream("tika.txt");
String mediaType = TikaAnalysis.detectDocTypeUsingDetector(stream);

assertEquals("application/pdf", mediaType);
stream.close();
}

显然,错误的文件扩展名不允许tika错误,因为pdf中的神奇字节pdf文件的开头。
为了简洁起见,我们可以使用Tikadoor类重写之前的方法:

public static String detectDocTypeUsingFacade(InputStream stream)
throws IOException {

Tika tika = new Tika();
String mediaType = tika.detect(stream);
return mediaType;
}

提取文档内容
下面我们使用Parser API提取文件内容并返回结果字符串:

public static String extractContentUsingParser(InputStream stream)
throws IOException, TikaException, SAXException {

Parser parser = new AutoDetectParser();
ContentHandler handler = new BodyContentHandler();
Metadata metadata = new Metadata();
ParseContext context = new ParseContext();

parser.parse(stream, handler, metadata, context);
return handler.toString();
}

类路径下有word文件,内容如下:

Apache Tika - a content analysis toolkit
The Apache Tika™ toolkit detects and extracts metadata and text ...
1
2
测试内容代码:

@Test
public void whenUsingParser_thenContentIsReturned()
throws IOException, TikaException, SAXException {
InputStream stream = this.getClass().getClassLoader()
.getResourceAsStream("tika.docx");
String content = TikaAnalysis.extractContentUsingParser(stream);

assertThat(content,
containsString("Apache Tika - a content analysis toolkit"));
assertThat(content,
containsString("detects and extracts metadata and text"));

stream.close();
}

当然,使用Tika上课会更方便:

public static String extractContentUsingFacade(InputStream stream)
throws IOException, TikaException {

Tika tika = new Tika();
String content = tika.parseToString(stream);
return content;
}

提取元数据
除了文档内容之外,Parser API也能提取元数据:

public static Metadata extractMetadatatUsingParser(InputStream stream)
throws IOException, SAXException, TikaException {

Parser parser = new AutoDetectParser();
ContentHandler handler = new BodyContentHandler();
Metadata metadata = new Metadata();
ParseContext context = new ParseContext();

parser.parse(stream, handler, metadata, context);
return metadata;
}

在类路径中tika.xlsx单元测试文件:

@Test
public void whenUsingParser_thenMetadataIsReturned()
throws IOException, TikaException, SAXException {
InputStream stream = this.getClass().getClassLoader()
.getResourceAsStream("tika.xlsx");
Metadata metadata = TikaAnalysis.extractMetadatatUsingParser(stream);

assertEquals("org.apache.tika.parser.DefaultParser",
metadata.get("X-Parsed-By"));
assertEquals("Microsoft Office User", metadata.get("creator"));

stream.close();
}

当然,也可以通过另一个版本。Tika类实现:

public static Metadata extractMetadatatUsingFacade(InputStream stream)
throws IOException, TikaException {
Tika tika = new Tika();
Metadata metadata = new Metadata();

tika.parse(stream, metadata);
return metadata;
}

总结
文本介绍了内容分析工具Apache Tike。使用其Parser和Detechtor API,可以自动检测文档类型,并且还可以提取其内容和元数据。对于特定场景,我们可以自定义Parser和Detechtor类以实现更多的解析过程控制。


作者:neweastsun
来源:CSDN
原文:https://blog.csdn.net/neweastsun/article/details/79859286
版权声明:本文为博主原创文章,转载请附上博客链接!

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门