Extração de texto com Tika Server

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

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *