Skip to content

Extração de texto com Tika Server

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 exemplo image/png;
  • Identifica metadados: por exemplo, em um PDF os metadados são pdf:PDFVersion, access_permission, language, dc:format e Creation-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.

Serviços do Tika Server.

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"
Crédito: Unsplash.

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/

https://www.manning.com/books/tika-in-action

1 thought on “Extração de texto com Tika Server”

  1. 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?

Leave a Reply

Your email address will not be published. Required fields are marked *

Marco Reis
Privacy Overview

This website uses cookies so that we can provide you with the best user experience possible. Cookie information is stored in your browser and performs functions such as recognising you when you return to our website and helping our team to understand which sections of the website you find most interesting and useful.