Necesito ayuda con un proyecto de ML que estoy tratando de crear actualmente.
Recibo muchas facturas de muchos proveedores diferentes, todos en su propio diseño único. Necesito extraer 3 elementos clave de las facturas. Estos 3 elementos están ubicados en una tabla / partidas individuales para todas las facturas.
Los 3 elementos son:
- 1 : número de tarifa (dígito)
- 2 : Cantidad (siempre un dígito)
- 3 : Importe total de la línea (valor monetario)
Consulte la siguiente captura de pantalla, donde he marcado estos campos en una factura de muestra.
Comencé este proyecto con un enfoque de plantilla, basado en expresiones regulares . Sin embargo, esto no era escalable en absoluto y terminé con toneladas de reglas diferentes.
Espero que el aprendizaje automático pueda ayudarme aquí, ¿o tal vez una solución híbrida?
El común denominador
En todas mis facturas, a pesar de los diferentes diseños, cada línea de pedido siempre constará de un número de tarifa . Este número de tarifa siempre tiene 8 dígitos y siempre está formateado de una de las formas siguientes:
- xxxxxxxx
- xxxx.xxxx
- xx.xx.xx.xx
(Donde "x" es un dígito de 0 a 9).
Además , como puede ver en la factura, hay un precio unitario y un monto total por línea. La cantidad que necesitaré siempre es la más alta para cada línea.
La salida
Para cada factura como la anterior, necesito la salida para cada línea. Esto podría ser, por ejemplo, algo como esto:
{
"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"
}
A dónde ir desde aquí?
No estoy seguro de qué es lo que estoy buscando hacer en el aprendizaje automático y, de ser así, en qué categoría. ¿Es visión por computadora? PNL? Reconocimiento de entidad con nombre?
Mi pensamiento inicial fue:
- Convierta la factura en texto. (Todas las facturas están en archivos PDF con texto, por lo que puedo usar algo como
pdftotext
obtener los valores textuales exactos) - Crear personalizada entidades nombradas para
quantity
,tariff
yamount
- Exportar las entidades encontradas.
Sin embargo, siento que me podría estar perdiendo algo.
¿Alguien puede ayudarme en la dirección correcta?
Editar:
Vea a continuación algunos ejemplos más de cómo puede verse una sección de la tabla de facturas:
Edición 2:
Consulte a continuación las tres imágenes de muestra, sin los bordes / cuadros delimitadores:
Tariff No.:
or$
) o la columna a la que pertenece (aquí puede ayudarlo a guardar la información espacial de las letras, si alguna herramienta de OCR hace eso). Creo que no necesita entrar en el aprendizaje automático con este problema (aparte del OCR prefabricado), ni PNL (no es lenguaje natural). Sin embargo, sin ver qué tan bien funcionan estas herramientas con sus datos, solo podemos especular cuál es el siguiente paso y qué es necesario: DRespuestas:
Estoy trabajando en un problema similar en la industria de la logística y confía en mí cuando digo que estas tablas de documentos vienen en innumerables diseños. Numerosas compañías que han resuelto algo y están mejorando en este problema se mencionan como en
La categoría a la que me gustaría someter este problema sería el aprendizaje multimodal , porque tanto las modalidades textuales como las de imagen contribuyen mucho en este problema. Aunque los tokens OCR juegan un papel vital en la clasificación de valor de atributo, su posición en la página, el espaciado y las distancias entre caracteres son características muy importantes en la detección de límites de tablas, filas y columnas. El problema se vuelve aún más interesante cuando las filas se dividen en páginas, o algunas columnas llevan valores no vacíos.
Mientras que el mundo académico y las conferencias usan el término Procesamiento inteligente de documentos , en general para extraer campos singulares y datos tabulares. El primero es más conocido por la clasificación de valor de atributo y el segundo es famoso por la extracción de tablas o la extracción de estructura repetida, en la literatura de investigación.
En nuestra incursión en el procesamiento de estos documentos semiestructurados durante los 3 años, siento que lograr precisión y escalabilidad es un viaje largo y arduo. Las soluciones que ofrecen el enfoque de escalabilidad / 'plantilla libre' tienen un corpus anotado de documentos comerciales semiestructurados del orden de decenas de miles, si no millones. Aunque este enfoque es una solución escalable, es tan bueno como los documentos en los que se ha capacitado. Si sus documentos provienen del sector de logística o seguros, que son conocidos por sus diseños complejos, y necesitan ser muy precisos debido a los procedimientos de cumplimiento, una solución 'basada en plantillas' sería la panacea para sus enfermedades. Se garantiza que dará más precisión.
Si necesita enlaces a investigaciones existentes, mencione en los comentarios a continuación y me complacerá compartirlos.
Además, recomendaría usar pdfparser 1 sobre pdf2text o pdfminer porque el primero proporciona información de nivel de caracteres en archivos digitales con un rendimiento significativamente mejor.
Estaría encantado de incorporar cualquier comentario, ya que esta es mi primera respuesta aquí.
fuente
Aquí hay un intento de usar OpenCV, la idea es:
Obtener imagen binaria. Cargamos la imagen, la ampliamos usando
imutils.resize
para ayudar a obtener mejores resultados de OCR (ver Tesseract mejorar la calidad ), convertir a escala de grises, luego el umbral de Otsu para obtener una imagen binaria (1 canal).Eliminar las líneas de la cuadrícula de la tabla. Creamos núcleos horizontales y verticales, luego realizamos operaciones morfológicas para combinar contornos de texto adyacentes en un solo contorno. La idea es extraer una fila de ROI como una pieza para OCR.
Extraer el ROI de la fila. Nos encontramos con contornos continuación, ordenar, de arriba a abajo usando
imutils.contours.sort_contours
. Esto garantiza que recorramos cada fila en el orden correcto. Desde aquí, iteramos a través de los contornos, extraemos el ROI de la fila usando Numpy slicing, OCR usando Pytesseract , y luego analizamos los datos.Aquí está la visualización de cada paso:
Imagen de entrada
Imagen binaria
Morph cerca
Visualización de iteración a través de cada fila
ROI de fila extraída
Resultado de los datos de la factura de salida:
Desafortunadamente, obtengo resultados mixtos al probar la segunda y tercera imagen. Este método no produce excelentes resultados en las otras imágenes, ya que el diseño de las facturas es diferente. Sin embargo, este enfoque muestra que es posible utilizar técnicas de procesamiento de imágenes tradicionales para extraer la información de la factura con el supuesto de que tiene un diseño de factura fijo.
Código
fuente