From 04480fb9c3d34019aee7b3a189ad65cff1af4790 Mon Sep 17 00:00:00 2001 From: Alexander Golodkov Date: Tue, 5 Sep 2023 13:57:46 +0300 Subject: [PATCH 1/4] fixed examples directory --- examples/README.md | 25 ++++++++++ examples/create_structured_document.py | 11 +++++ examples/create_unstructured_document.py | 39 +++++++++------ examples/example.jpg | Bin 0 -> 30805 bytes examples/example_converter.py | 19 ------- examples/example_doc_parser.py | 14 +++--- examples/example_img_parser.py | 31 ++++++++++++ examples/example_manager_input.py | 41 +++++++++++----- examples/example_pdf_parser.py | 60 +++++++++++++++++++++++ examples/example_post.py | 2 + examples/example_with_text_layer.pdf | Bin 0 -> 6832 bytes examples/example_without_text_layer.pdf | Bin 0 -> 29056 bytes 12 files changed, 189 insertions(+), 53 deletions(-) create mode 100644 examples/README.md create mode 100644 examples/create_structured_document.py create mode 100644 examples/example.jpg delete mode 100644 examples/example_converter.py create mode 100644 examples/example_img_parser.py create mode 100644 examples/example_pdf_parser.py create mode 100644 examples/example_with_text_layer.pdf create mode 100644 examples/example_without_text_layer.pdf diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 00000000..d5ad697d --- /dev/null +++ b/examples/README.md @@ -0,0 +1,25 @@ +# Examples of document parsing with Dedoc + +This directory contains files with examples of using Dedoc to process different types of documents. + +It's worth starting with the `example_manager_input.py` file. It describes examples of document processing using the `DedocManager` class. +This is the easiest way, since this class automatically determines the format of the file being processed and calls the necessary readers. + +As shown in corresponding examples, you can create this manager with following lines: +``` +from dedoc.config import get_config +from dedoc import DedocManager + +manager = DedocManager(config=get_config()) +``` +And after that you can get parsed document with one simple line, just replace `"your_file_name"` with the path to your chosen file: +``` +parsed_document = manager.parse(file_path="your_file_name") +``` +To get more information, look at Dedoc usage tutorial. + +If you want to call a specific parser, you can look at some examples in this directory. File `example_doc_parser.py` shows how you can use `DocxReader`, +`example_pdf_parser.py` shows examples with PDF file parsing. In order to parse img-like file you can call `PdfImageReader` like it's shown in +`example_img_parser.py`. + +Also you can look at the example of using a post-request to parse documents while Dedoc container is working. This example is written in `example_post.py`. \ No newline at end of file diff --git a/examples/create_structured_document.py b/examples/create_structured_document.py new file mode 100644 index 00000000..0a4d468d --- /dev/null +++ b/examples/create_structured_document.py @@ -0,0 +1,11 @@ +# noqa +from create_unstructured_document import unstructured_document +from dedoc.structure_constructors import TreeConstructor + +# to create structured document you can use TreeConstructor and apply it to unstructured document +# in this example we'll use unstructured_document from create_unstructured_document.py +structure_constructor = TreeConstructor() +parsed_document = structure_constructor.structure_document(document=unstructured_document, + structure_type="tree") + +print(parsed_document.to_dict()) diff --git a/examples/create_unstructured_document.py b/examples/create_unstructured_document.py index a8c327d1..de27cd87 100644 --- a/examples/create_unstructured_document.py +++ b/examples/create_unstructured_document.py @@ -1,12 +1,13 @@ +# noqa # in this example we create UnstructuredDocument, lets construct document corresponding to example.docx -from dedoc.data_structures import LineWithMeta -from dedoc.data_structures import ParagraphMetadata -from dedoc.data_structures import Table +from dedoc.data_structures import LineMetadata, Table, UnstructuredDocument from dedoc.data_structures import TableMetadata - +from dedoc.data_structures import LineWithMeta # First of all lets create some table, table consist of cells (list of rows, and row is a list of strings -from dedoc import HierarchyLevel +from dedoc.data_structures import HierarchyLevel +from dedoc.metadata_extractors import BaseMetadataExtractor + table_cells = [ ["N", "Second name", "Name", "Organization", "Phone", "Notes"], @@ -15,7 +16,7 @@ # table also has some metadata, lets assume that our table is on first page table_metadata = TableMetadata(page_id=0) -# finally lets build table +# let's build table table = Table(cells=table_cells, metadata=table_metadata) # Documents also contain some text. @@ -23,13 +24,7 @@ # but unstructured document consist of flat list of lines with text and metadata # hierarchy structure hidden in HierarchyLevel attribute of LineWithMeta # lets build firs line, it is document tree root: -text = "DOCUMENT TITLE" -metadata = ParagraphMetadata( - paragraph_type="title", - predicted_classes=None, - page_id=0, - line_id=0 -) + # hierarchy level define position of this line in document tree. hierarchy_level = HierarchyLevel( @@ -42,8 +37,14 @@ # if can_be_multiline is true than several lines in a row with same level_1, level_2 and paragraph_type # will be merged in one tree node can_be_multiline=True, - paragraph_type="title" + line_type="header" ) +text = "DOCUMENT TITLE" +metadata = LineMetadata(page_id=0, + line_id=1, + tag_hierarchy_level=None, + hierarchy_level=hierarchy_level, + other_fields=None) # Annotations: one may specify some information about some part of the text, for example that some word # written in italic font. @@ -51,11 +52,14 @@ line1 = LineWithMeta( line=text, - hierarchy_level=hierarchy_level, metadata=metadata, annotations=annotations ) +unstructured_document = UnstructuredDocument(tables=[table], + lines=[line1], + attachments=[]) + # I hope you understand some concepts of the LineWithMeta, but you may ask why it need level_1 and level_2 # parameters. Why is only level_1 not enough. Imagine that we have lists like these: # 1. 1.1. 1.2.1.1. and so on, It may be difficult to restrict the length of the list with @@ -63,3 +67,8 @@ # HierarchyLevel(1, 1) for 1. # HierarchyLevel(1, 2) for 1.1. # HierarchyLevel(1, 4) for 1.2.1.1. and so on +unstructured_document = BaseMetadataExtractor().add_metadata(document=unstructured_document, + directory="./", + filename="example.docx", + converted_filename="example.doc", + original_filename="example.docx") diff --git a/examples/example.jpg b/examples/example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..afd13dc27603df2e84390d67676e45b11866b222 GIT binary patch literal 30805 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 RQ9PA`#c8i!Z)In#{ZH}`AJ_l@ literal 0 HcmV?d00001 From a777d6a9ba49259721fd1026849b4935db706ce0 Mon Sep 17 00:00:00 2001 From: Belyaeva Oksana Date: Wed, 6 Sep 2023 15:39:09 +0300 Subject: [PATCH 2/4] update readme --- examples/README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/examples/README.md b/examples/README.md index d5ad697d..39938547 100644 --- a/examples/README.md +++ b/examples/README.md @@ -22,4 +22,10 @@ If you want to call a specific parser, you can look at some examples in this dir `example_pdf_parser.py` shows examples with PDF file parsing. In order to parse img-like file you can call `PdfImageReader` like it's shown in `example_img_parser.py`. -Also you can look at the example of using a post-request to parse documents while Dedoc container is working. This example is written in `example_post.py`. \ No newline at end of file +Also you can look at the example of using a post-request to parse documents while Dedoc container is working. This example is written in `example_post.py`. + +You can check an example like this: +```bash +cd examples +python create_structured_document.py +``` \ No newline at end of file From a35fc55a39e061f22896831d14047bfe90b2692e Mon Sep 17 00:00:00 2001 From: Belyaeva Oksana Date: Wed, 6 Sep 2023 15:47:56 +0300 Subject: [PATCH 3/4] update installation.rst --- docs/source/getting_started/installation.rst | 24 +++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/docs/source/getting_started/installation.rst b/docs/source/getting_started/installation.rst index 2186aab7..70373dfc 100644 --- a/docs/source/getting_started/installation.rst +++ b/docs/source/getting_started/installation.rst @@ -105,8 +105,8 @@ to get the example of Tesseract installing for dedoc container or use next comma 3. Install the dedoc library via pip. ************************************* -To fulfil all the library requirements, you should have `torch~=1.11.0` and `torchvision~=0.12.0` installed. -You can install suitable for you versions of these libraries and install dedoc using pip command: +You need `torch~=1.11.0` and `torchvision~=0.12.0` installed. +If you already have torch and torchvision in your environment: .. code-block:: bash @@ -155,7 +155,7 @@ Below are the instructions for installing the package `virtualenvwrapper`: workon dedoc_env export PYTHONPATH=$PYTHONPATH:$(pwd) pip install -r requirements.txt - pip install torch=1.11.0 torchvision==0.12.0 -f https://download.pytorch.org/whl/torch_stable.html + pip install torch==1.11.0 torchvision==0.12.0 -f https://download.pytorch.org/whl/torch_stable.html python dedoc/main.py -c ./dedoc/config.py @@ -164,14 +164,22 @@ Install trusted torch (verified version) You can install a trusted library `torch` (as a verified version of the library, verified by tools developed by the Ivannikov Institute for System Programming of the Russian Academy of Sciences). -For `python3.9`: - .. code-block:: bash +First you need to install two required packages.: - pip install https://github.com/ispras/dedockerfiles/raw/master/wheels/torch-1.11.0a0+git137096a-cp39-cp39-linux_x86_64.whl - pip install https://github.com/ispras/dedockerfiles/raw/master/wheels/torchvision-0.12.0a0%2B9b5a3fe-cp39-cp39-linux_x86_64.whl + .. code-block:: bash + + sudo apt-get install -y mpich intel-mkl + +Second you need to install torch and torchvision from built wheels: For `python3.8`: .. code-block:: bash pip install https://github.com/ispras/dedockerfiles/raw/master/wheels/torch-1.11.0a0+git137096a-cp38-cp38-linux_x86_64.whl - pip install https://github.com/ispras/dedockerfiles/raw/master/wheels/torchvision-0.12.0a0%2B9b5a3fe-cp38-cp38-linux_x86_64.whl \ No newline at end of file + pip install https://github.com/ispras/dedockerfiles/raw/master/wheels/torchvision-0.12.0a0%2B9b5a3fe-cp38-cp38-linux_x86_64.whl + +For `python3.9`: + .. code-block:: bash + + pip install https://github.com/ispras/dedockerfiles/raw/master/wheels/torch-1.11.0a0+git137096a-cp39-cp39-linux_x86_64.whl + pip install https://github.com/ispras/dedockerfiles/raw/master/wheels/torchvision-0.12.0a0%2B9b5a3fe-cp39-cp39-linux_x86_64.whl \ No newline at end of file From ddbb283b38d84cc9c9c0a8c8e700307f0d10071f Mon Sep 17 00:00:00 2001 From: Belyaeva Oksana Date: Wed, 6 Sep 2023 16:43:38 +0300 Subject: [PATCH 4/4] update README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0d615b00..2a1e6d53 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ Dedoc is in demand for information analytic systems, information leak monitoring The library is intended for application use by developers of systems for automatic analysis and structuring of electronic documents, including for further search in electronic documents. # Online-Documentation -Relevant documentation of the dedoc is available [here]((https://dedoc.readthedocs.io/en/latest/)) +Relevant documentation of the dedoc is available [here](https://dedoc.readthedocs.io/en/latest/) # Installation instructions ****************************************