Apache Tika-コンテンツ解析抽出ツールセット(a content analysis toolkit)


概要
      Apache Tika toolkitは、word、ppt、xml、csv、pptなどの様々なドキュメントのタイプを自動的に検出し、ドキュメントのメタデータとテキストの内容を抽出することができます.Tikaは既存のドキュメント解析ライブラリを統合し、統合されたインタフェースを提供し、異なるタイプのドキュメントに対する解析をより簡単にします.Tikaは検索エンジンインデックス、コンテンツ分析、変換などに非常に役立ちます.
サポートされているドキュメントのフォーマット
    詳細は「」を参照してください.http://tika.apache.org/1.5/formats.html
  • HyperText Markup Language
  • XML and derived formats
  • Microsoft Office document formats
  • OpenDocument Format
  • Portable Document Format
  • Electronic Publication Format
  • Rich Text Format
  • Compression and packaging formats
  • Text formats
  • Feed and Syndication formats
  • Audio formats
  • Image formats
  • Video formats
  • Java class files and archives
  • The mbox format
  • CAD formats
  • Font formats
  • Executable programs and libraries

  • プロセス
        Tikaは1つのparserと1つのcontentHandlerによってドキュメントの分析と処理を行い、parserは特定のドキュメントの解析を担当し、処理が必要な場合にcontentHandlerを呼び出して解析内容の処理を行う.contentHandler(org.xml.sax)はsax解析を処理するためのプログラムインタフェースであり、parserがノード間の情報やノード自体の情報など、特定のコンテンツを解析すると、必要に応じてcontentHandlerに関する処理方法が呼び出される.すなわち,1つは解析を担当し,1つは処理を担当し,両者は互いに協力し合い,最終的には一定の手段で情報を返す.
         Parserはインタフェースであり,異なるドキュメントを処理する際に,具体的な解析を実現するために具体的な解析器を探す必要がある.TikaはMimeTypeによって、1つのドキュメントがどのようなタイプであるかを識別し、そのタイプに応じて対応するparserを探すという1つのドキュメントの具体的な識別作業を実現する.最後に、parse作業を完了するために、特定の実装parserを呼び出す.
        ContentHandlerもインタフェースであり,異なる情報を処理する際には,自分で特定の情報処理クラスを呼び出す必要がある.一般に,文書内の内容(すなわち情報のある場所)のみに関心を持つ場合は,WriteOutContentHandlerを用いることができる.このhandlerは、解析された情報をoutputまたはwriteを介して呼び出し者が提供する出力ストリームに出力し、最終的にこのwriterのデータを読み出すことができる.
         これらの情報に加えて、ドキュメントのタイトル、著者、contentTypeなど、処理中に解析および保存する必要がある情報もあります.tikaでは、これらの情報はMetadataというオブジェクトに保存されます.metadataは、特定のドキュメントに関連する多くの値を保存し、mapの形式で対応するメタデータ情報値を保存します.wordの場合、Author、Keywordsなどの情報が保存されます.これらの情報は、いくつかの重要な情報を使用してドキュメントを取得するのに役立ちます.
    プライマリインタフェース
        org.apache.tika.parser.Parser
    /*
    	 * 
    	 *              XHTML SAX  
    	 * 
    	 *     metadata               
    	 * 
    	 *           ,           
    	 * 
    	 * @param stream the document stream (input)
         * @param handler handler for the XHTML SAX events (output)
         * @param metadata document metadata (input and output)
         * @param context parse context
         * @throws IOException if the document stream could not be read
         * @throws SAXException if the SAX events could not be processed
         * @throws TikaException if the document could not be parsed
         */
        void parse(
                InputStream stream, ContentHandler handler,
                Metadata metadata, ParseContext context)
                throws IOException, SAXException, TikaException;

        org.xml.sax.ContentHandler
        これは、ほとんどのSAXアプリケーションが実装するインタフェースです.
        アプリケーションが基本分析イベントの通知を得る必要がある場合は、このインタフェースを実装し、SAX parserでインスタンスを登録する必要があります.解析器はこのインスタンスを使用してelementのstart,endなどのドキュメント関連イベントをレポートします.
    コードの例
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    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.ContentHandler;
    import org.xml.sax.SAXException;
    
    public class WordParserDemo {
    	public static final String INPATH = "E:/test.xlsx";
    	public static final String OUTPATH = "data.txt";
    
    	public static void main(String[] args) throws IOException, SAXException,
    			TikaException {
    		//   97-2003 microsoft office  
    		// Parser parser = new OfficeParser();
    		//   microsoft office 2007       ,  
    		// Parser parser = new OOXMLParser();
    		//       AutoDetectParser
    		parseFile(INPATH, OUTPATH);
    	}
    
    	public static boolean parseFile(String inFile, String outFile) {
    		boolean result = false;
    		InputStream in = null;
    		OutputStream out = null;
    		try {
    			//    、   
    			in = new BufferedInputStream(new FileInputStream(new File(inFile)));
    			out = new BufferedOutputStream(new FileOutputStream(
    					new File(outFile)));
    
    			//   metadata
    			Metadata meta = new Metadata();
    			meta.add(Metadata.CONTENT_ENCODING, "utf-8");
    			meta.set(Metadata.RESOURCE_NAME_KEY, inFile);
    
    			//   contentHandler (     WriteOutContentHandler)
    			ContentHandler handler = new BodyContentHandler(out);
    
    			//   parser
    			Parser parser = new AutoDetectParser();
    
    			//     
    			parser.parse(in, handler, meta, new ParseContext());
    
    			//   metadata  
    			for (String name : meta.names()) {
    				System.out.println(name + ":" + meta.get(name));
    			}
    		} catch (Exception e) {
    			result = false;
    			System.out.println(e.getMessage());
    		} finally {
    			try {
    				if (in != null)
    					in.close();
    				if(out != null)
    					out.close();
    			} catch (IOException e1) {
    				System.out.println(e1.getMessage());
    			}
    		}
    		return result;
    	}
    }

    リファレンス
    pache.org/1.5/formats.html
    http://blog.csdn.net/an74520/article/details/20380739