【Java】ApacheTikaを使ってみた

Apache TikaはJava製のドキュメント分析およびメタデータ抽出ツールです。

tika

Apache Tikaを使ってみる

環境はOSX 10.10.2, Javaは1.7です。
Downloadからjarをダウンロードします。
使い方はGetting Startedを参照。

$ java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)
$ java -jar tika-app-1.7.jar --help
usage: java -jar tika-app.jar [option...] [file|port...]

Options:
    -?  or --help          Print this usage message
    -v  or --verbose       Print debug level messages
    -V  or --version       Print the Apache Tika version number

    -g  or --gui           Start the Apache Tika GUI
    -s  or --server        Start the Apache Tika server
    -f  or --fork          Use Fork Mode for out-of-process extraction

    --config=
        TikaConfig file. Must be specified before -g, -s or -f!

    -x  or --xml           Output XHTML content (default)
    -h  or --html          Output HTML content
    -t  or --text          Output plain text content
    -T  or --text-main     Output plain text content (main content only)
    -m  or --metadata      Output only metadata
    -j  or --json          Output metadata in JSON
    -y  or --xmp           Output metadata in XMP
    -J  or --jsonRecursive Output metadata and content from all
                           embedded files (choose content type
                           with -x, -h, -t or -m; default is -x)
    -l  or --language      Output only language
    -d  or --detect        Detect document type
    -eX or --encoding=X    Use output encoding X
    -pX or --password=X    Use document password X
    -z  or --extract       Extract all attachements into current directory
    --extract-dir=    Specify target directory for -z
    -r  or --pretty-print  For JSON, XML and XHTML outputs, adds newlines and
                           whitespace, for better readability

tオプションで全文, Tオプションで文中の主要な内容を抽出してくれるらしいです。また, mオプションでmetadataのみ, jオプションでjsonで出力できるらしい。

PDF

まずは, 英文のPDFから試してみます。

$ java -jar tika-app-1.7.jar -j pdf/deeplearning.pdf 
{"Content-Length":"1532059","Content-Type":"application/pdf","Creation-Date":"2015-03-13T23:06:48Z","Keywords":"","Last-Modified":"2015-03-13T23:06:48Z","Last-Save-Date":"2015-03-13T23:06:48Z","PTEX.Fullbanner":"This is pdfTeX using libpoppler, Version 3.141592-1.40.3-2.2 (Web2C 7.5.6) kpathsea version 3.5.6","X-Parsed-By":["org.apache.tika.parser.DefaultParser","org.apache.tika.parser.pdf.PDFParser"],"cp:subject":"","created":"Sat Mar 14 08:06:48 JST 2015","date":"2015-03-13T23:06:48Z","dc:format":"application/pdf; version\u003d1.4","dc:subject":"","dcterms:created":"2015-03-13T23:06:48Z","dcterms:modified":"2015-03-13T23:06:48Z","meta:creation-date":"2015-03-13T23:06:48Z","meta:keyword":"","meta:save-date":"2015-03-13T23:06:48Z","modified":"2015-03-13T23:06:48Z","pdf:PDFVersion":"1.4","pdf:encrypted":"false","producer":"pdfTeX-1.40.3","resourceName":"deeplearning.pdf","subject":"","trapped":"False","xmp:CreatorTool":"LaTeX with hyperref package","xmpTPg:NPages":"171"}

続いて, 日本語PDFです。 @TJO_datasci さんのslideを拝借させて頂きました。

$ java -jar tika-app-1.7.jar -j pdf/HikaLabo20150205_TJO.pdf 
{"Author":"ozt","Content-Length":"1962233","Content-Type":"application/pdf","Creation-Date":"2015-02-04T08:59:12Z","Last-Modified":"2015-02-04T08:59:12Z","Last-Save-Date":"2015-02-04T08:59:12Z","X-Parsed-By":["org.apache.tika.parser.DefaultParser","org.apache.tika.parser.pdf.PDFParser"],"created":"Wed Feb 04 17:59:12 JST 2015","creator":"ozt","date":"2015-02-04T08:59:12Z","dc:creator":"ozt","dc:format":"application/pdf; version\u003d1.5","dc:title":"最新業界事情から見るデータサイエンティストの「実像」","dcterms:created":"2015-02-04T08:59:12Z","dcterms:modified":"2015-02-04T08:59:12Z","meta:author":"ozt","meta:creation-date":"2015-02-04T08:59:12Z","meta:save-date":"2015-02-04T08:59:12Z","modified":"2015-02-04T08:59:12Z","pdf:PDFVersion":"1.5","pdf:encrypted":"false","producer":"Microsoft® PowerPoint® 2010","resourceName":"HikaLabo20150205_TJO.pdf","title":"最新業界事情から見るデータサイエンティストの「実像」","xmp:CreatorTool":"Microsoft® PowerPoint® 2010","xmpTPg:NPages":"40"}

日本語もしっかりでてきます。
HTMLで出力してみます。

$ java -jar tika-app-1.7.jar -h pdf/HikaLabo20150205_TJO.pdf 
<html xmlns="https://www.w3.org/1999/xhtml">
<head>
<meta name="meta:save-date" content="2015-02-04T08:59:12Z"/>
<meta name="Content-Length" content="1962233"/>
<meta name="Author" content="ozt"/>
<meta name="dcterms:created" content="2015-02-04T08:59:12Z"/>
<meta name="date" content="2015-02-04T08:59:12Z"/>
<meta name="creator" content="ozt"/>
<meta name="Creation-Date" content="2015-02-04T08:59:12Z"/>
<meta name="meta:author" content="ozt"/>
<meta name="created" content="Wed Feb 04 17:59:12 JST 2015"/>
<meta name="dc:format" content="application/pdf; version=1.5"/>
<meta name="xmp:CreatorTool" content="Microsoft&reg; PowerPoint&reg; 2010"/>
<meta name="resourceName" content="HikaLabo20150205_TJO.pdf"/>
<meta name="dc:title" content="最新業界事情から見るデータサイエンティストの「実像」"/>
<meta name="Last-Save-Date" content="2015-02-04T08:59:12Z"/>
...

HTML

過去に書いた記事のHTMLを喰わせてみます。

$ java -jar tika-app-1.7.jar -j html/blog.html 
{"Content-Encoding":"UTF-8","Content-Length":"56157","Content-Type":"text/html; charset\u003dUTF-8","X-Parsed-By":["org.apache.tika.parser.DefaultParser","org.apache.tika.parser.html.HtmlParser"],"article:author":"https://fisproject.net/author/admin/","article:modified_time":"2015-03-28T13:38:39+00:00","article:published_time":"2015-03-28T13:34:55+00:00","article:section":"Admin Diary","article:tag":["Golang","Julius"],"dc:title":"【音声認識】GolangでJulius-Clientの実装を試みる【cgo】 | FiS Project","description":["最近, Sirius: An Open Intelligent Personal Assistantが話題を集めていますが, 手軽に音声認識を行えるJuliusに関する話。 JuliusをGolangで扱う場合,","最近, Sirius: An Open Intelligent Personal Assistantが話題を集めていますが, 手軽に音声認識を行えるJuliusに関する話。      JuliusをGolangで扱う場合, 他の言語と同様2つのアプローチがあります。   ・JuliusLibを組み込む。Golangの場合cgoパッケージを用いる。 ..."],"fb:admins":"100000565632893","generator":"WordPress 4.1.1","keywords":"golang,julius","og:description":["最近, Sirius: An Open Intelligent Personal Assistantが話題を集めていますが, 手軽に音声認識を行えるJuliusに関する話。  JuliusをG","最近, Sirius: An Open Intelligent Personal Assistantが話題を集めていますが, 手軽に音声認識を行えるJuliusに関する話。      JuliusをGolangで扱う場合, 他の言語と同様2つのアプローチがあります。   ・JuliusLibを組み込む。Golangの場合cgoパッケージを用いる。 ..."],"og:image":"https://fisproject.net/wp-content/plugins/wordbooker/includes/wordbooker_blank.jpg","og:locale":"ja_JP","og:site_name":["FiS Project","FiS Project - WEB技術やGadget開発に関するBlog"],"og:title":["【音声認識】GolangでJulius-Clientの実装を試みる【cgo】","【音声認識】GolangでJulius-Clientの実装を試みる【cgo】"],"og:type":["article","article"],"og:url":["https://fisproject.net/2015/03/golang-julius/","https://fisproject.net/2015/03/golang-julius/"],"resourceName":"blog.html","title":"【音声認識】GolangでJulius-Clientの実装を試みる【cgo】 | FiS Project","viewport":"width\u003ddevice-width, initial-scale\u003d1.0, maximum-scale\u003d1.0, user-scalable\u003d0"}

続いて, WikipediaのLinuxページ。Tオプションはそれなりの結果の印象でした。

$ java -jar tika-app-1.7.jar -T html/Linux\ -\ Wikipedia.html 
Linux - WikipediaLinux
OSの系統
Unix系
開発状況
開発進行中
ソースモデル
FLOSS
初リリース
最新開発版リリース
対象市場
使用できる言語
多言語対応
パッケージ管理
多種
対応プラットフォーム
目次
Linuxの開発は、 フリーかつオープンソース なソフトウェアの共同開発として最も傑出した例のひとつである。Linuxカーネルのソースコードは無償で入手でき、 GNU 一般公衆利用許諾書 のもとにおいて、非営利・営利に関わらず誰でも自由に使用・修正・頒布できる。Linuxは、世界中の開発者の知識を取り入れるという方法によって、あらゆる方面に利用できる幅広い機能と柔軟性を獲得し、数多くのユーザの協力によって問題を修正していくことで高い信頼性を獲得した。
UNIX の歴史は、米国 AT&T のベル研究所において1969年に始まる。1971年に初めて公開され、初期は アセンブリ言語 のみで実装されていた(当時はそれが一般的なやり方だった)。その後、Unixは1973年に C言語 で書きなおされた。オペレーティングシステムを高級言語で記述するという先駆的な試みは、他のプラットフォームへの 移植 を容易にした。AT&Tは、反独占訴訟に対する1954年の同意判決によってコンピュータビジネスへの参入を禁じられており、なおかつこの同意判決では、電話以外の技術は「要求する者すべて」にライセンスを供与しなければならないと定められていた。開発者達はこれに素直に従って、求める者に対してUnixのソースコードを提供した [11] 。これによってUnixは即座に成長し、大学やビジネス界などで広く受けいれられることとなった。AT&Tの独占状態は1984年に解体され、ベル研究所は ウェスタン・エレクトリック の傘下になった。これによって法的な制限がなくなったため、ベル研究所はUnixを プロプライエタリ 製品として販売しはじめた。
...

WEBリソースを指定することもできます。

$ java -jar tika-app-1.7.jar -m https://www.yahoo.co.jp/
Content-Encoding: UTF-8
Content-Type: text/html; charset=utf-8
X-Parsed-By: org.apache.tika.parser.DefaultParser
X-Parsed-By: org.apache.tika.parser.html.HtmlParser
content-script-type: text/javascript
content-style-type: text/css
dc:title: Yahoo! JAPAN
description: 日本最大級のポータルサイト。検索、オークション、ニュース、メール、コミュニティ、ショッピング、など80以上のサービスを展開。あなたの生活をより豊かにする「ライフ・エンジン」を目指していきます。
robots: noodp
title: Yahoo! JAPAN

tika-serverを試してみた

Serverを起動すると, ClientからHTTPでRequestを投げ結果を受け取れます。オプションは以下の通りです。

$  java -jar tika-server-1.7.jar --help
usage: tikaserver
 -?,--help         this help message
 -h,--host    host name (default = localhost)
 -l,--log     request URI log level ('debug' or 'info')
 -p,--port    listen port (default = 9998)

サーバを起動します。

$  java -jar tika-server-1.7.jar --port=12345

全てのendpointはソースを見ないとわからないかも…

$ curl -T ./pdf/deeplearning.pdf https://localhost:12345/meta
"dc:subject",""
"meta:save-date","2015-03-13T23:06:48Z"
"subject",""
"dcterms:created","2015-03-13T23:06:48Z"
"date","2015-03-13T23:06:48Z"
"Creation-Date","2015-03-13T23:06:48Z"
"trapped","False"
"created","Sat Mar 14 08:06:48 JST 2015"
"cp:subject",""
"meta:keyword",""
"dc:format","application/pdf; version=1.4"
"xmp:CreatorTool","LaTeX with hyperref package"
"PTEX.Fullbanner","This is pdfTeX using libpoppler, Version 3.141592-1.40.3-2.2 (Web2C 7.5.6) kpathsea version 3.5.6"
"Keywords",""
"Last-Save-Date","2015-03-13T23:06:48Z"
"meta:creation-date","2015-03-13T23:06:48Z"
"dcterms:modified","2015-03-13T23:06:48Z"
"Last-Modified","2015-03-13T23:06:48Z"
"pdf:PDFVersion","1.4"
"X-Parsed-By","org.apache.tika.parser.DefaultParser","org.apache.tika.parser.pdf.PDFParser"
"modified","2015-03-13T23:06:48Z"
"xmpTPg:NPages","171"
"pdf:encrypted","false"
"producer","pdfTeX-1.40.3"
"Content-Type","application/pdf"

$ curl -T ./pdf/deeplearning.pdf https://localhost:12345/tika
...