使用Apache Tika实现内容分析
使用Apache Tika實現內容分析
Apache Tika可以抽取不同類型的內容和元信息的開源工具,如word、excel、pdf,甚至多媒體文件如JPEG、MP4。所有基于文本的和多媒體文件都可以使用通用接口進行解析,這使得Tika成為功能強大且用途廣泛的內容分析庫。
本文將介紹Apache Tika,包括解析API、如何自動監測文檔內容類型,同時提供示例說明。
引用類庫
為了使用Apache Tika,我們需要通過maven引入依賴:
<dependency><groupId>org.apache.tika</groupId><artifactId>tika-parsers</artifactId><version>1.17</version> </dependency>讀者可以查找合適的版本。
解析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。因此,大多數解析器實現類僅適配這些外部類庫。下面,我們將了解如何使用處理程序和元數據參數來提取文檔的內容和元數據。為了方便,我們能使用Tika的門面類調用解析器Api。
自動監測
Apache Tika可以根據文檔本身而無需額外信息則可以自動檢測文檔的類型和語言。
檢測文檔類型
可以通過Detector接口的實現類檢測文檔類型,其僅有一個方法:
MediaType detect(java.io.InputStream input, Metadata metadata) throws IOException方法帶有文檔流和其元數據參數,返回MediaType對象用于描述文檔最佳可能相關類型。
元數據并不是探測器所依賴的唯一信息來源,還可以使用對應在文件開頭的特殊模式的魔術字節,或者將檢測過程委托給更合適的檢測器。
事實上,探測器算法依賴實現。舉例說明,默認探測器首先使用魔術字節,然后是元數據屬性。如果還不能獲得文檔類型,則使用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,但實際真實類型仍然能被檢測:
@Testpublic 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文件的開頭。
為了簡潔,我們可以使用Tika的門面類重寫之前的方法:
抽取文檔內容
下面我們使用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 ...測試內容代碼:
@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類實現更多解析過程控制。
總結
以上是生活随笔為你收集整理的使用Apache Tika实现内容分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 例题:索洛模型——弹性与收敛速度
- 下一篇: 如何进行在线教育app开发