conjuncts / gmft

Lightweight, performant, deep table extraction
MIT License
31 stars 2 forks source link

gmft

give

me

formatted

tables!

Documentation Status

There are many pdfs out there, and many of those pdfs have tables. But despite a plethora of table extraction options, there is still no definitive extraction method.

About

gmft is a toolkit for converting pdf tables to many formats, including cropped image, text + positions, plaintext, csv, and pandas dataframes.

gmft is lightweight, performant, and high-throughput. gmft aims to "just work", offering strong performance with the default settings.

gmft relies on microsoft's Table Transformers, which qualitatively is the most performant and reliable of many tested alternatives. See the comparison here.

Install: pip install gmft

Quickstart: demo notebook, bulk extract.

Documentation: readthedocs

Why use gmft?

TL;DR: gmft is fast, lightweight, configurable, and gives great results. Check out the bulk extract notebook for approximate extraction quality.

Many Formats

gmft supports the following export options:

Cropped images are useful for directly feeding into a vision recognizer, like:

Cropped images are also excellent for verifying correctness of output.

Lightweight

No GPU necessary

Because of the relatively few dependencies and high throughput, gmft is very lightweight. This allows gmft to run on cpu.

High throughput

Benchmark using Colab's cpu indicates an approximate rate of ~1.381 s/page; converting to df takes ~1.168 s/table. See the comparison here. This makes gmft about 10x faster than alternatives like unstructured, nougat, and open-parse/unitable on cpu. Here's how:

Few dependencies

Many pdf extractors require detectron2, poppler, paddleocr, tesseract etc., many of which require additional external installation. Detectron2 is particularly difficult to install on windows. OCR models may require tesseract or paddleocr.

gmft can be installed in one line: pip install gmft. But it may help to have transformers and pytorch preinstalled.

gmft mostly relies on pypdfium2 and transformers. On the first run, gmft downloads Microsoft's TATR from huggingface, which requires ~270mB total and is saved to ~/.cache/huggingface/hub/models--microsoft--table-{transformer-detection, structure-recognition} and ~/.cache/huggingface/hub/models--timm--resnet18.a1_in1k.

Reliable

gmft uses Microsoft's Table Transformer (TATR), which is trained on a diverse dataset PubTables-1M. Many alternative methods were considered, and TATR was ultimately chosen for several reasons, among them high reliability.

The authors are confident that the extraction quality is unmatched. When the model fails, it is usually an OCR issue, merged cell, or false positive. Even in these cases, the text is still highly useable. Alignment of a value to its row/column header tends to be very accurate because of the underlying procedural algorithm.

UniTable is a newer model which achieves SOTA results in many datasets like PubLayNet and FinTabNet. Though we plan to support Unitable in the future, Unitable is much larger (~1.5 GB) and takes about x90 longer to run on cpu. Therefore, TATR is still used for its higher throughput. In addition, experimentation shows comparable quality. Contrary to gmft, Unitable may fail first through misalignment because of misplaced html tags. This may impact use cases where alignment is critical.

We invite the reader to explore the comparison notebooks to survey your own use cases and compare results.

Modular

As models are loaded from huggingface hub, you can fine-tune a model and use it by specifying a huggingface path.

By subclassing the BasePDFDocument and BasePage classes, you are also able to support other PDF extraction methods (like PyMuPDF, PyPDF, pdfplumber etc.).

By subclassing TableDetector and TableFormatter, alternative table detection and structure extraction methods are also possible.

Limitations

Multi-indices (multiple column headers) are not yet supported.

Slightly rotated tables will probably fail, especially large tables that are not perfectly level.

Acknowledgements

A tremendous thank you to the TATR authors: Brandon Smock, Rohith Pesala, and Robin Abraham, for making gmft possible. The image->csv step is highly inspired by TATR's inference.py code, but it has been rewritten with some adjustments for ease of use.

Thank you to Niels Rogge for porting TATR to huggingface and writing the visualization code.

Alternatives

See comparison.

Gmft focuses highly on pdf tables. Another great option is img2table, which is non-deep and attains great results.

Nougat is excellent for both pdf table extraction and document understanding. It outputs full mathpix markdown (.mmd), which includes latex formulas, bold/italics, and fully latex-typeset tables. However, a gpu is highly recommended.

For general document understanding, I recommend checking out open-parse, unstructured, surya, deepdoctection, and DocTR. Open-parse and unstructured do quite well on the same example pdfs in terms of extraction quality. Open-parse offers UniTable, a larger model which may achieve higher quality but runs much slower on cpu (see reliability section for more discussion.) Importantly, open-parse allows extraction of auxiliary information like headers, paragraphs, etc., useful for RAG.

License

gmft is released under MIT.

If you wish to use PyMuPDF, the file gmft/pdf_bindings/bindings_mu.py is available but is packaged separately. bindings_mu.py alone is released under AGPL 3.0.