内容提取(Content Extraction)
Tika使用各种解析器库从给定的解析器中提取内容。 它选择正确的解析器来提取给定的文档类型。
对于解析文档,通常使用Tika facade类的parseToString()方法。 下面显示的是解析过程中涉及的步骤,这些步骤由Tika ParsertoString()方法提取。
摘要解析过程 -
最初,当我们将文档传递给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 xnip
它为您提供以下输出 -
Extracted Content: Hi students welcome to xnip
使用分析器接口进行内容提取
Tika的解析器包提供了几个接口和类,我们可以使用它们解析文本文档。 下面给出了org.apache.tika.parser包的框图。
有几个可用的解析器类,例如pdf解析器,Mp3Passer,OfficeParser等,可以单独解析各个文档。 所有这些类都实现了解析器接口。
CompositeParser (CompositeParser)
给出的图表显示了Tika的通用解析器类: CompositeParser和AutoDetectParser 。 由于CompositeParser类遵循复合设计模式,因此您可以将一组解析器实例用作单个解析器。 CompositeParser类还允许访问实现解析器接口的所有类。
AutoDetectParser
这是CompositeParser的子类,它提供自动类型检测。 使用此功能,AutoDetectParser使用复合方法自动将传入的文档发送到相应的解析器类。
parse() method
与parseToString()一起,您还可以使用解析器接口的parse()方法。 该方法的原型如下所示。
parse(<a href="http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html?is-external=true" rel="nofollow" target="_blank">InputStream</a> stream, <a href="http://docs.oracle.com/javase/6/docs/api/org/xml/sax/ContentHandler.html?is-external=true" rel="nofollow" target="_blank">ContentHandler</a> handler, <a href="https://tika.apache.org/1.6/api/org/apache/tika/metadata/Metadata.html" rel="nofollow" target="_blank">Metadata</a> metadata, <a href="https://tika.apache.org/1.6/api/org/apache/tika/parser/ParseContext.html" rel="nofollow" target="_blank">ParseContext</a> context)
下表列出了它作为参数接受的四个对象。
Sr.No. | 对象和描述 |
---|---|
1 | InputStream stream 包含文件内容的任何Inputstream对象 |
2 | ContentHandler handler Tika将文档作为XHTML内容传递给此处理程序,然后使用SAX API处理文档。 它提供了对文档中内容的有效后处理。 |
3 | Metadata metadata 元数据对象既用作文档元数据的源也是目标。 |
4 | ParseContext context 此对象用于客户端应用程序要自定义解析过程的情况。 |
例子 (Example)
下面给出了一个示例,显示了如何使用parse()方法。
Step 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
Step 2 -
创建一个处理程序类对象。 以下是三个内容处理程序 -
Sr.No. | 类和描述 |
---|---|
1 | BodyContentHandler 此类选择XHTML输出的正文部分,并将该内容写入输出编写器或输出流。 然后,它将XHTML内容重定向到另一个内容处理程序实例。 |
2 | LinkContentHandler 此类检测并选取XHTML文档的所有H-Ref标记,并转发这些标记以供Web爬虫等工具使用。 |
3 | TeeContentHandler 该类有助于同时使用多个工具。 |
由于我们的目标是从文档中提取文本内容,因此实例化BodyContentHandler,如下所示 -
BodyContentHandler handler = new BodyContentHandler( );
Step 3 -
创建Metadata对象,如下所示 -
Metadata metadata = new Metadata();
Step 4 -
创建任何输入流对象,并传递应提取给它的文件。
FileInputstream
通过将文件路径作为参数传递来实例化文件对象,并将此对象传递给FileInputStream类构造函数。
Note - 传递给文件对象的路径不应包含空格。
这些输入流类的问题在于它们不支持随机访问读取,这是有效处理某些文件格式所必需的。 要解决此问题,Tika提供了TikaInputStream。
File file = new File(filepath)
FileInputStream inputstream = new FileInputStream(file);
(or)
InputStream stream = TikaInputStream.get(new File(filename));
Step 5 -
创建一个解析上下文对象,如下所示 -
ParseContext context =new ParseContext();
Step 6 -
实例化解析器对象,调用解析方法,并传递所需的所有对象,如下面的原型所示 -
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 xnip
如果你执行上面的程序,它会给你以下输出 -
File content : Hi students welcome to xnip