TIKA - 內容提取



Tika 使用各種解析器庫從給定的解析器中提取內容。它選擇合適的解析器來提取給定的文件型別。

對於解析文件,通常使用 Tika 門面類的 parseToString() 方法。下面顯示瞭解析過程涉及的步驟,這些步驟由 Tika ParsertoString() 方法抽象出來。

Parsing Process

抽象解析過程 -

  • 最初,當我們將文件傳遞給 Tika 時,它會使用其可用的合適的型別檢測機制並檢測文件型別。

  • 一旦知道文件型別,它就會從其解析器儲存庫中選擇合適的解析器。解析器儲存庫包含利用外部庫的類。

  • 然後將文件傳遞給選擇的解析器,該解析器將解析內容,提取文字,並對不可讀格式丟擲異常。

使用 Tika 進行內容提取

下面是使用 Tika 門面類從檔案中提取文字的程式 -

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

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

import org.xml.sax.SAXException;

public class TikaExtraction {
	
   public static void main(final String[] args) throws IOException, TikaException {

      //Assume sample.txt is in your current directory		        
      File file = new File("sample.txt");
      
      //Instantiating Tika facade class
      Tika tika = new Tika();
      String filecontent = tika.parseToString(file);
      System.out.println("Extracted Content: " + filecontent);
   }		 
}

將上述程式碼儲存為 TikaExtraction.java 並從命令提示符執行 -

javac TikaExtraction.java 
java TikaExtraction

下面是 sample.txt 的內容。

Hi students welcome to tutorialspoint

它給你以下輸出 -

Extracted Content: Hi students welcome to tutorialspoint

使用 Parser 介面進行內容提取

Tika 的 parser 包提供了幾個介面和類,使用這些介面和類我們可以解析文字文件。下面是 **org.apache.tika.parser** 包的框圖。

Parser Interface

有幾個可用的解析器類,例如 pdf 解析器、Mp3Passer、OfficeParser 等,分別解析各個文件。所有這些類都實現瞭解析器介面。

CompositeParser

給定的圖表顯示了 Tika 的通用解析器類:**CompositeParser** 和 **AutoDetectParser**。由於 CompositeParser 類遵循組合設計模式,因此您可以將一組解析器例項用作單個解析器。CompositeParser 類還允許訪問所有實現解析器介面的類。

AutoDetectParser

這是 CompositeParser 的子類,它提供自動型別檢測。使用此功能,AutoDetectParser 使用組合方法自動將傳入的文件傳送到相應的解析器類。

parse() 方法

除了 parseToString() 之外,您還可以使用 parser 介面的 parse() 方法。此方法的原型如下所示。

parse(InputStream stream, ContentHandler handler, Metadata metadata, ParseContext context)

下表列出了它作為引數接受的四個物件。

序號 物件和描述
1

InputStream stream

包含檔案內容的任何 Inputstream 物件

2

ContentHandler handler

Tika 將文件作為 XHTML 內容傳遞給此處理程式,然後使用 SAX API 處理文件。它提供了對文件中內容的高效後處理。

3

Metadata metadata

元資料物件既用作文件元資料的源又用作目標。

4

ParseContext context

此物件用於客戶端應用程式希望自定義解析過程的情況。

示例

下面是一個示例,演示瞭如何使用 parse() 方法。

**步驟 1** -

要使用 parser 介面的 parse() 方法,請例項化任何為該介面提供實現的類。

有單獨的解析器類,如 PDFParser、OfficeParser、XMLParser 等。您可以使用任何這些單獨的文件解析器。或者,您可以使用 CompositeParser 或 AutoDetectParser,它們在內部使用所有解析器類並使用合適的解析器提取文件的內容。

Parser parser = new AutoDetectParser();
   (or)
Parser parser = new CompositeParser();  
   (or)        
object of any individual parsers given in Tika Library 

**步驟 2** -

建立處理程式類物件。下面列出了三個內容處理程式 -

序號 類和描述
1

BodyContentHandler

此類選取 XHTML 輸出的主體部分並將該內容寫入輸出寫入器或輸出流。然後它將 XHTML 內容重定向到另一個內容處理程式例項。

2

LinkContentHandler

此類檢測並選取 XHTML 文件的所有 H-Ref 標記,並轉發這些標記以供網路爬蟲等工具使用。

3

TeeContentHandler

此類有助於同時使用多個工具。

由於我們的目標是從文件中提取文字內容,因此請例項化 BodyContentHandler,如下所示 -

BodyContentHandler handler = new BodyContentHandler( );

**步驟 3** -

建立 Metadata 物件,如下所示 -

Metadata metadata = new Metadata();

**步驟 4** -

建立任何輸入流物件,並將應提取的檔案傳遞給它。

FileInputstream

透過將檔案路徑作為引數傳遞來例項化檔案物件,並將此物件傳遞給 FileInputStream 類的建構函式。

**注意** - 傳遞給檔案物件的路徑不應包含空格。

這些輸入流類的問題在於它們不支援隨機訪問讀取,而這對於有效地處理某些檔案格式是必需的。為了解決此問題,Tika 提供了 TikaInputStream。

File  file = new File(filepath)
FileInputStream inputstream = new FileInputStream(file);
   (or)
InputStream stream = TikaInputStream.get(new File(filename));

**步驟 5** -

建立解析上下文物件,如下所示 -

ParseContext context =new ParseContext();

**步驟 6** -

例項化解析器物件,呼叫 parse 方法,並傳遞所有必需的物件,如下面的原型所示 -

parser.parse(inputstream, handler, metadata, context);

下面是使用解析器介面進行內容提取的程式 -

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

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;

public class ParserExtraction {
	
   public static void main(final String[] args) throws IOException,SAXException, TikaException {

      //Assume sample.txt is in your current directory
      File file = new File("sample.txt");
      
      //parse method parameters
      Parser parser = new AutoDetectParser();
      BodyContentHandler handler = new BodyContentHandler();
      Metadata metadata = new Metadata();
      FileInputStream inputstream = new FileInputStream(file);
      ParseContext context = new ParseContext();
      
      //parsing the file
      parser.parse(inputstream, handler, metadata, context);
      System.out.println("File content : " + Handler.toString());
   }
}

將上述程式碼儲存為 ParserExtraction.java 並從命令提示符執行 -

javac  ParserExtraction.java 
java  ParserExtraction

下面是 sample.txt 的內容

Hi students welcome to tutorialspoint

如果執行上述程式,它將為您提供以下輸出 -

File content : Hi students welcome to tutorialspoint
廣告

© . All rights reserved.