Preciso de assistência com um projeto de ML que atualmente estou tentando criar.
Recebo muitas faturas de vários fornecedores diferentes - tudo em um layout exclusivo. Preciso extrair três elementos-chave das faturas. Esses três elementos estão todos localizados em uma tabela / itens de linha para todas as faturas.
Os 3 elementos são:
- 1 : Número da tarifa (dígito)
- 2 : Quantidade (sempre um dígito)
- 3 : valor total da linha (valor monetário)
Consulte a captura de tela abaixo, onde eu marquei esses campos em uma amostra da fatura.
Comecei este projeto com uma abordagem de modelo, com base em expressões regulares . Isso, no entanto, não era escalável e acabei com toneladas de regras diferentes.
Espero que o aprendizado de máquina possa me ajudar aqui - ou talvez uma solução híbrida?
O denominador comum
Em todas as minhas faturas, apesar dos diferentes layouts, cada item de linha sempre será composto por um número de tarifa . Esse número de tarifa é sempre de 8 dígitos e é sempre formatado da seguinte maneira:
- xxxxxxxx
- xxxx.xxxx
- xx.xx.xx.xx
(Onde "x" é um dígito de 0 a 9).
Além disso , como você pode ver na fatura, existe um preço unitário e um valor total por linha. A quantidade que precisarei é sempre a mais alta para cada linha.
A saída
Para cada fatura como a acima, preciso da saída de cada linha. Por exemplo, isso pode ser algo como isto:
{
"line":"0",
"tariff":"85444290",
"quantity":"3",
"amount":"258.93"
},
{
"line":"1",
"tariff":"85444290",
"quantity":"4",
"amount":"548.32"
},
{
"line":"2",
"tariff":"76109090",
"quantity":"5",
"amount":"412.30"
}
Para onde ir daqui?
Não sei ao certo o que estou procurando fazer se enquadra no aprendizado de máquina e, em caso afirmativo, em qual categoria. É visão computacional? PNL? Reconhecimento de entidade nomeada?
Meu pensamento inicial era:
- Converta a fatura em texto. (As faturas são todas em PDFs com texto, para que eu possa usar algo como
pdftotext
para obter os valores textuais exatos) - Criar personalizado entidades nomeadas para
quantity
,tariff
eamount
- Exporte as entidades encontradas.
No entanto, sinto que posso estar perdendo alguma coisa.
Alguém pode me ajudar na direção certa?
Editar:
Veja abaixo mais alguns exemplos de como pode ser uma seção da tabela de faturas:
Edição 2:
Veja abaixo as três imagens de exemplo, sem as caixas de bordas / bordas:
Tariff No.:
ou$
) ou a coluna à qual ele pertence (aqui pode ajudar a salvar as informações espaciais das letras, se alguma ferramenta de OCR fizer isso). Eu acredito que você não precisa entrar no aprendizado de máquina com esse problema (além do OCR pré-fabricado), nem da PNL (não é uma linguagem natural). No entanto, sem ver como essas ferramentas funcionam com seus dados, podemos apenas especular qual é o próximo passo e o que é necessário: DRespostas:
Estou trabalhando em um problema semelhante no setor de logística e confie em mim quando digo que essas tabelas de documentos vêm em diversos layouts. Inúmeras empresas que resolveram um pouco e estão melhorando esse problema são mencionadas como
A categoria em que eu gostaria de colocar esse problema seria a aprendizagem multimodal , porque as modalidades textual e de imagem contribuem bastante nesse problema. Embora os tokens de OCR desempenhem um papel vital na classificação de atributo-valor, sua posição na página, espaçamento e distâncias entre caracteres são características muito importantes na detecção de limites de tabela, linha e coluna. O problema fica ainda mais interessante quando as linhas quebram nas páginas ou algumas colunas carregam valores não vazios.
Enquanto o mundo acadêmico e as conferências usam o termo Processamento Inteligente de Documentos , em geral, para extrair campos singulares e dados tabulares. O primeiro é mais conhecido pela classificação de atributo-valor e o segundo é famoso por extração de tabela ou extração de estrutura repetida, na literatura de pesquisa.
Em nossa incursão no processamento desses documentos semiestruturados ao longo dos 3 anos, sinto que alcançar precisão e escalabilidade é uma jornada longa e árdua. As soluções que oferecem escalabilidade / abordagem 'sem modelo' têm anotado corpus de documentos comerciais semiestruturados na ordem de dezenas de milhares, se não milhões. Embora essa abordagem seja uma solução escalável, é tão boa quanto os documentos em que foi treinada. Se seus documentos provêm do setor de logística ou seguro, conhecidos por seus layouts complexos e precisam ser super precisos devido aos procedimentos de conformidade, uma solução 'baseada em modelo' seria a panacéia para seus males. É garantido para dar mais precisão.
Se você precisar de links para pesquisas existentes, mencione nos comentários abaixo e será um prazer compartilhá-los.
Além disso, eu recomendaria o uso do pdfparser 1 sobre o pdf2text ou pdfminer porque o primeiro fornece informações sobre o nível de caractere em arquivos digitais com desempenho significativamente melhor.
Ficaria feliz em incorporar qualquer feedback, pois esta é minha primeira resposta aqui.
fonte
Aqui está uma tentativa de usar o OpenCV, a ideia é:
Obter imagem binária. Carregamos a imagem, aumentamos usando
imutils.resize
para ajudar a obter melhores resultados de OCR (consulte o Tesseract para melhorar a qualidade ), convertemos em escala de cinza e, em seguida, o limite do Otsu para obter uma imagem binária (1 canal).Remova as linhas de grade da tabela. Criamos um núcleo horizontal e vertical e, em seguida, executamos operações morfológicas para combinar contornos de texto adjacentes em um único contorno. A idéia é extrair uma linha de ROI como uma peça para o OCR.
Extrair ROIs de linha. Nós encontrar contornos em seguida, classificar a partir de cima para baixo usando
imutils.contours.sort_contours
. Isso garante que iteremos por cada linha na ordem correta. A partir daqui, iteramos pelos contornos, extraímos a linha ROI usando o faturamento Numpy, o OCR usando o Pytesseract e depois analisamos os dados.Aqui está a visualização de cada etapa:
Imagem de entrada
Imagem binária
Morph fechar
Visualização da iteração através de cada linha
ROIs de linhas extraídas
Resultado dos dados da fatura de saída:
Infelizmente, obtenho resultados variados ao experimentar a segunda e a terceira imagem. Este método não produz grandes resultados nas outras imagens, pois o layout das faturas é todo diferente. No entanto, essa abordagem mostra que é possível usar técnicas tradicionais de processamento de imagem para extrair as informações da fatura, supondo que você tenha um layout fixo de fatura.
Código
fonte