TIKA內容提取


Tika使用不同的解析器庫來提取給解析器的內容。它選擇了正確的語法分析器提取給定的文件型別。

解析檔案,一般用於Tika外觀facade類的parseToString()方法。下面顯示的是所涉及分析過程的步驟和這些由Tika的ParsertoString()方法提取。

Parsing Process

抽象的分析過程:

  • 最初,當我們傳一個檔案到Tika,它使用與之適合的型別檢測機制和檢測檔案型別。

  • 一旦文件型別是已知的,它選擇從解析器庫中合適的解析器。解析器庫中包含的類使用外部庫。

  • 然後將文件傳送到選擇將解析的內容,提取文字,並且還丟擲了不可讀格式異常解析器。

使用Tika內容提取

下面給出的是程式使用Tika facade 類從檔案中提取文字:

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 yiibai

它提供了以下的輸出:

Extracted Content: Hi students welcome to yiibai

使用Parser介面內容提取

Tika 解析器包提供了使用它可以分析一個文字文件的幾個介面和類。下面給出的是org.apache.tika.parser包的框架圖。

Parser Interface

有幾個可用的解析器類,如PDF格式分析器,Mp3Passer,OfficeParser等,逐一分析各自的檔案。所有這些類都實現了解析器介面。

CompositeParser

給出的圖表顯示Tika通用解析器類CompositeParser 主AutoDetectParser。由於CompositeParser類遵循複合設計模式,可以用一組解析器範例作為一個單獨的解析器。CompositeParser類也可以存取所有實現解析器介面的類。

AutoDetectParser

這是CompositeParser的子類,它提供了自動型別檢測。使用此功能,AutoDetectParser自動傳送收到的檔案到使用該複合方法適當分析器類。

parse()方法

除了parseToString(),還可以使用分析器介面的parse()方法。該方法的原型如下所示。

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

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

S.No. 物件及描述
1

InputStream stream

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

2

ContentHandler handler

Tika通過文件作為XHTML內容到此處理,此後該檔案正在使用SAX API處理。它提供了在一個檔案有效的後處理的內容。

3

Metadata metadata

後設資料物件是用來既作為源和檔案的後設資料的目標。

4

ParseContext context

此物件使用在如遇有用戶端應用程式想要客製化解析過程。

例如:

下面給出一個例子,說明如何使用 parse()方法。

步驟 1:

要使用解析器介面的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:

建立一個處理類的物件。下面給出的是三個內容處理程式:

S.No. 類及描述
1

BodyContentHandler

這個類採用XHTML輸出的主體部分,並寫入該內容到輸出寫入或輸出流。然後重定向XHTML內容到另一個內容處理程式範例。

2

LinkContentHandler

這個類檢測,並挑選XHTML文件的所有H-參考標籤和轉發那些使用類似網路爬蟲工具。

3

TeeContentHandler

這個類可以幫助在同時使用多個工具。

由於我們的目標是要提取的檔案的文字內容,範例化BodyContentHandler如下圖所示:

BodyContentHandler handler = new BodyContentHandler( );

步驟  3:

建立的後設資料物件,如下所示:

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 yiibai

它提供了以下的輸出:

File content : Hi students welcome to yiibai