O Apache Tika é uma biblioteca para extração de texto da maioria dos formatos de arquivo, incluindo PDF, DOC e PPT. O Tika tem uma interface simplificada faz a extração do conteúdo, tornando-a uma biblioteca fácil de operar. Seus principais usos estão ligados ao processo de indexação em mecanismos de busca, análise de conteúdo (jornalismo, por exemplo) e até mesmo tradução (usando APIs pagas).
A análise de conteúdo inclui a extração de metadados. Metadados são informações que descrevem um recurso, no caso do Tika, um arquivo. São dados como data de criação, linguagem, formato, permissões, assunto, autores, título e palavras-chave. Quanto mais metadados estiverem disponíveis, mais precisa será a análise do conteúdo do arquivo.
Escrita em Java, o Tika é uma bilioteca popular, fácil de usar e em constante atualização. Por isso é usado em diversos outros softwares, como o Apache Solr. O Tika é um FOSS (free and open-source software), assim, Sua API é extensível para que você crie suas funcionalidades personalizadas.
Além da extração de conteúdo, as funcionalidades do Tika incluem:
- Tika Server: disponibiliza seus recursos via RESTful API, que será o tema deste artigo;
- Identifica o MIME type, com o padrão
type/subtype
, por exemploimage/png
; - Identifica metadados: por exemplo, em um PDF os metadados são
pdf:PDFVersion
,access_permission
,language
,dc:format
eCreation-Date
(mais detalhes a seguir); - Identifica o idioma do texto;
- Tradução de texto: por meio das APIs pagas da Microsoft Translator Text, Google Cloud Translation ou Lingo24;
- OCR: é integrado ao Tesseract OCR para extrair conteúdo de imagens.
Usos mais avançados
No início do projeto, o Tika fazia apenas a extração de texto, contudo, nas versões mais recentes ele foi integrado com outras bibliotecas para usos mais avançados (não detalhados neste texto):
- Visão computacional: por exemplo a geração legenda de imagens;
- Machine learning (ML): integração com ferramentas de ML, como TensorFlow e Mahout;
- Processamento de linguagem natural (PLN): integração com ferramentas de NLP, como OpenNLP e NLTK.
Tika Server
Neste artigo veremos como usar o Tika Server e como podemos aproveitar as funcionalidades por meio de sua API RESTful. A instalação será feita via Docker.
A escolha do Tika Server com Docker traz escalabilidade para a solução. Ou seja, para pequenas cargas podemos usar apenas um ou dois containers, aumentando de acordo com a demanda.
Nos exemplos vamos subir dois containers, um com OCR habilitado e outro sem OCR. Isso é importante porque o OCR demanda muito processamento e pode degradar a performance da aplicação. Em aplicações com muita demanda por OCR é essencial ter um conjunto de containers separados unicamente para processar essas imagens. Com isso, o fluxo pode ser direcionado para cada container de acordo com a necessidade.
Instalação via Docker
A imagem do Docker para os exemplos está disponível no Docker Hub do apache/tika, e a versão mais recente é a 1.24, que usa Java 11. Começamos baixando a versão 1.24 (sem OCR) e 1.24-full (com OCR).
docker pull apache/tika:1.24
docker pull apache/tika:1.24-full
Para iniciar os containers usamos os comandos a seguir:
docker run -it \
--name tika-server-ocr \
-d \
-p 9998:9998 \
apache/tika:1.24-full
docker run -it \
--name tika-server \
-d \
-p 9997:9998 \
apache/tika:1.24
Como visto, o servidor com OCR está na porta 9997 e o servidor sem OCR está na porta 9997. Com essa decisão, podemos escolher fazer ou não o OCR das imagens. Podemos conferir se os servidores estão funcionando pelas URLS http://localhost:9998/
e http://localhost:9997/
, como visto na imagem a seguir.
Para ver o log do servidor usamos o comando docker logs tika-server-ocr
e o resultado deve ser algo assim, mostrando que o serviço está disponível na porta 9998, no caso do servidor com OCR:
May 02, 2020 3:38:37 PM org.apache.tika.config.InitializableProblemHandler$3 handleInitializableProblem
WARNING: org.xerial's sqlite-jdbc is not loaded.
Please provide the jar on your classpath to parse sqlite files.
See tika-parsers/pom.xml for the correct version.
INFO Starting Apache Tika 1.24 server
INFO Setting the server's publish address to be http://0.0.0.0:9998/
INFO Logging initialized @1831ms to org.eclipse.jetty.util.log.Slf4jLog
INFO jetty-9.4.24.v20191120; built: 2019-11-20T21:37:49.771Z; git: 363d5f2df3a8a28de40604320230664b9c793c16; jvm 11.0.6+10-post-Ubuntu-1ubuntu118.04.1
INFO Started ServerConnector@7fc44dec{HTTP/1.1,[http/1.1]}{0.0.0.0:9998}
INFO Started @1924ms
WARN Empty contextPath
INFO Started o.e.j.s.h.ContextHandler@5bda80bf{/,null,AVAILABLE}
INFO Started Apache Tika server at http://0.0.0.0:9998/
Idiomas no Tesseract OCR
Na instalação padrão, os idiomas disponíveis no Tesseract são English (default), French, German, Italian, e Spanish. Para adicionar novos idiomas precisamos acessar o terminal do container pelo Docker e executar os comandos a seguir para instalar, por exemplo, o idioma Português. A escolha correta do idioma do texto permite maior precisão do reconhecimento dos caracteres.
docker exec -it tika-server-ocr /bin/bash
apt-get update
apt-get install tesseract-ocr-por
Códigos HTTP
Os códigos HTTP usados no Tika Server são:
- 200 Ok: requisição completada com sucesso;
- 204 No content: requisição completada com sucesso e resultado vazio;
- 422 Unprocessable Entity: Mime-type não suportado, documento criptografado etc;
- 500 Error: erro para processar o documento.
Metadados
O primeiro exemplo é a extração de metadados de um PDF. A partir daqui vamos usar o aplicativo curl
e alguns arquivos de teste em formato PDF, DOCX, ODT, TXT, PNG e JPG.
curl -T test.pdf http://localhost:9998/meta
Cada tipo de arquivo tem uma lista de metadados diferentes. Para mostrar um metadado específico, por exemplo, o Content-type
, use a URL:
curl -T test.pdf http://localhost:9998/meta/Content-Type
É possível escolher o formato do resultado. De acordo com a documentação disponível em http://localhost:9998/
podemos escolher entre texto, CSV e JSON. Para mostrar a saída em texto puro use a URL:
curl -T test.pdf http://localhost:9998/meta/Content-Type --header "Accept: text/plain"
Para ter o resultado do metadado X-Parsed-By
em CSV:
curl -T test.pdf http://localhost:9998/meta/X-Parsed-By --header "Accept: text/csv"
Por fim, para ter o resultado do metadado Creation-Date
em JSON:
curl -T test.odt http://localhost:9998/meta/Creation-Date --header "Accept: application/json"
Extração de texto
A extração de texto é a principal funcionalidade do Tika. Para fazer a extração do conteúdo do arquivo test.docx
com o servidor Tika use a URL:
curl -T test.docx http://localhost:9998/tika
No caso anterior, o Tika identifica o tipo de arquivo antes de selecionar o parser
adequado. Se souber o tipo de arquivo, o Tika pode escolher diretamente o parser
apropriado.
curl -T test.pdf http://localhost:9998/tika --header "Content-type: application/pdf"
Para arquivos grandes, o Tika suporta multipart
:
curl -F upload=@test.pdf http://localhost:9998/tika/form
MIME types
Os MIME types suportados pelo Tika são: application, audio, chemical, image, message, model, multipart, text, video e x-conference. A lista completa pode ser conferida na URL http://localhost:9998/mime-types
.
OCR
O Tika tem integração com o Tesseract OCR para extrair o conteúdo de imagens. A forma mais simples de fazer o OCR de um arquivo PNG é:
curl -T test.png http://localhost:9998/tika
Novamente, se souber o tipo de arquivo e o idioma podemos indicar o Content-type
. Para mudar o idioma do OCR, por exemplo para para Português, use o parâmetro X-Tika-OCRLanguage
:
curl -T test.jpg http://localhost:9998/tika \
--header "Content-type: image/jpeg" \
--header "X-Tika-OCRLanguage: por"
Identificar idioma
Para identificar o idioma do texto de um arquivo podemos usar a URL:
curl -T test.odt http://localhost:9998/language/stream
Para identificar um texto a URL é:
curl -X PUT --data "yo no hablo español muy bien" http://localhost:9998/language/string
Conclusão
O Apache Tika é um projeto extremamente útil e o Tika Server acrescenta uma camada a mais de facilidade com a API RESTful. Desta forma, é possível acessar as funcionalidades do Tika a partir de praticamente qualquer linguagem de programação por meio dos web services. Com o Docker, a solução pode atender a diferentes cargas de trabalho. No exemplo mostrado, foram criados dois containers, um com suporte a OCR e outro sem esse suporte, de forma que a aplicação possa escolher se é necessário ou não fazer o OCR da imagem.
Referência
https://cwiki.apache.org/confluence/display/TIKA/TikaServer
https://cwiki.apache.org/confluence/display/TIKA/TikaOCR
https://opensourceconnections.com/blog/2019/11/26/tika-and-tesseract-outside-of-solr/
Marcos, quando eu chamo “curl -T 0044165641_507620504708_20201002.pdf http://localhost:9998/meta” dá erro no terminal dizendo “O parâmetro não pode ser processado porque o nome de parâmetro ‘T’ é ambíguo. Coincidências
possíveis incluem: -TimeoutSec -TransferEncoding.”. Como posso simular?