Apache Tikaによるコンテンツ分析

Apache Tikaによるコンテンツ分析

1. 概要

Word、Excel、PDFなどのApache Tika is a toolkit for extracting content and metadata from various types of documents、またはJPEGやMP4などのマルチメディアファイル。

すべてのテキストベースおよびマルチメディアファイルは、共通のインターフェイスを使用して解析できるため、Tikaはコンテンツ分析用の強力で汎用性の高いライブラリになります。

この記事では、解析APIや、ドキュメントのコンテンツタイプを自動的に検出する方法など、ApacheTikaの概要を説明します。 このライブラリの操作を説明するために、作業例も提供されます。

2. 入門

Apache Tikaを使用してドキュメントを解析するには、Mavenの依存関係が1つだけ必要です。


    org.apache.tika
    tika-parsers
    1.17

このアーティファクトの最新バージョンはhereにあります。

3. Parser API

The Parser API is the heart of Apache Tika, abstracting away the complexity of the parsing operations。 このAPIは単一のメソッドに依存しています。

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

このメソッドのパラメータの意味は次のとおりです。

  • stream解析対象のドキュメントから作成されたInputStreamインスタンス

  • handler入力ドキュメントから解析された一連のXHTML SAXイベントを受信するContentHandlerオブジェクト。このハンドラーはイベントを処理し、結果を特定の形式でエクスポートします

  • metadataパーサーの内外でメタデータプロパティを伝達するMetadataオブジェクト

  • contextは、構文解析プロセスをカスタマイズするために使用される、コンテキスト固有の情報を運ぶParseContextインスタンスです。

parseメソッドは、入力ストリームからの読み取りに失敗した場合はIOExceptionをスローし、ストリームから取得したドキュメントを解析できない場合はTikaExceptionをスローし、ハンドラーの場合はSAXExceptionをスローします。イベントを処理できません。

ドキュメントを解析するとき、Tikaは、Apache POIやPDFBoxなどの既存のパーサーライブラリを可能な限り再利用しようとします。 その結果、Parserの実装クラスのほとんどは、そのような外部ライブラリへの単なるアダプタです。

セクション5では、handlerパラメータとmetadataパラメータを使用してドキュメントのコンテンツとメタデータを抽出する方法を説明します。

便宜上、ファサードクラスTikaを使用してParserAPIの機能にアクセスできます。

4. 自動検出

Apache Tikaは、追加情報ではなくドキュメント自体に基づいて、ドキュメントのタイプとその言語を自動的に検出できます。

4.1. 文書タイプの検出

The detection of document types can be done using an implementation class of the Detector interface、単一のメソッドがあります:

MediaType detect(java.io.InputStream input, Metadata metadata)
  throws IOException

このメソッドは、ドキュメントとそれに関連するメタデータを取得し、ドキュメントのタイプに関する最良の推測を説明するMediaTypeオブジェクトを返します。

検出器が依存する情報源はメタデータだけではありません。 検出器は、ファイルの先頭付近にある特殊なパターンであるマジックバイトを使用したり、検出プロセスをより適切な検出器に委任したりすることもできます。

実際、検出器で使用されるアルゴリズムは実装に依存します。

たとえば、デフォルトのディテクターは、最初にマジックバイトを処理し、次にメタデータプロパティを処理します。 この時点でコンテンツタイプが見つからない場合は、サービスローダーを使用して、使用可能なすべての検出器を検出し、それらを順番に試します。

4.2. 言語検出

ドキュメントの種類に加えて、Tikaはメタデータ情報の助けがなくてもその言語を識別することもできます。

Tikaの以前のリリースでは、ドキュメントの言語はLanguageIdentifierインスタンスを使用して検出されます。

ただし、LanguageIdentifierは非推奨になり、Webサービスが優先されます。これは、Getting Startedのドキュメントでは明確にされていません。

言語検出サービスは、抽象クラスLanguageDetectorのサブタイプを介して提供されるようになりました。 Webサービスを使用すると、Google TranslateやMicrosoft Translatorなどの本格的なオンライン翻訳サービスにもアクセスできます。

簡潔にするために、これらのサービスについては詳しく説明しません。

5. ティカの行動

このセクションでは、実例を使用してApache Tikaの機能を説明します。

イラストメソッドはクラスにラップされます:

public class TikaAnalysis {
    // illustration methods
}

5.1. ドキュメントタイプの検出

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();
}

クラスパスにtika.txtという名前のPDFファイルがあるとします。 このファイルの拡張子は、分析ツールをだまそうとするために変更されました。 文書の実際のタイプは、テストによって引き続き検出および確認できます。

@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();
}

ファイルの先頭にあるマジックバイト%PDFのおかげで、ファイル拡張子が間違っていても、Tikaが正しいメディアタイプを見つけられないことは明らかです。

便宜上、Tikaファサードクラスを使用して検出コードを書き直し、同じ結果を得ることができます。

public static String detectDocTypeUsingFacade(InputStream stream)
  throws IOException {

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

5.2. コンテンツの抽出

次に、ファイルのコンテンツを抽出し、Parser APIを使用して結果をStringとして返します。

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();
}

このコンテンツを含むクラスパスにMicrosoft 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;
}

5.3. メタデータの抽出

ドキュメントのコンテンツに加えて、ParserAPIはメタデータを抽出することもできます。

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;
}

クラスパスにMicrosoft Excelファイルが存在する場合、このテストケースでは、抽出されたメタデータが正しいことを確認します。

@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("Author"));

    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;
}

6. 結論

このチュートリアルでは、Apache Tikaを使用したコンテンツ分析に焦点を当てました。 Using the Parser and Detector APIs, we can automatically detect the type of a document, as well as extract its content and metadata

高度なユースケースでは、カスタムParserクラスとDetectorクラスを作成して、解析プロセスをより細かく制御できます。

このチュートリアルの完全なソースコードはover on GitHubにあります。