Document format not supported (for example mkv) response 415 will be returned
-
Service checks if the POST-request has the file part. The application accesses the file from the
- files dictionary on the request object. If there is no file, the service returns 400.
The ParsedDocument structure is returned, the structure is returned as a Json format.
-
Dedoc supports linear and tree format. In linear format every documents line is a child of the root. In
-tree structure dedoc tries to reconstruct logical structure of the document as tree
attachments: List[ ParsedDocument ] (optional field) -
- attached documents, returned only if the condition for processing attached files is set. See the "with_attachment" parameter in the POST-request
-
-
-
-
DocumentMetadata
-
Contains document meta-information (for example file name, size, access time).
page_id: integer (optional field) - page number on which the table begins. Can be null.
-
-
-
TreeNode
-
Contains document tree structure
-
-
node_id : string (required field) - document item identifier. It is unique in for one tree (i.e. in this tree there will not be another such node_id, but in attachment it can occur).
- The identifier has the form 0.2.1 where each number symbolizes a serial number at an appropriate level
- иерархии. For example node_id 0.2.1 means that this element is the second subhead of the third chapter. The first number is the root of the document. Numbering goes from 0.
-
-
text: string (required field) - element text;
-
annotations: List[ Annotation ] (required field) - the field describes any properties of the text, for example, boldness, font size, etc.
-
-
metadata: ParagraphMetadata (required field) -
- meta-information relevant to the entire subparagraph, such as page number and position on this page.
-
-
subparagraphs: List[ TreeNode ] (required field) -
- "children" of the current item (for example, sub-chapters for a chapter). The structure of "children" is similar to the current one.
-
end : integer (required field) - annotation end index.
- The index of the last character (associated with this annotation) + 1.
- For example, if the first character is annotated, then start = 0, end = 1;
- if all line is annotated, then start = 0, end = length of s.
-
name : string (required field) - annotation type (size, italic etc).
AlignmentAnnotation : text alignment. The value of "name" field = "alignment".
- "value" field may be "left" (left alignment), "right" (right alignment),
- "both" (alignment on both sides), "center" (center alignment).
-
BoldAnnotation : bold text. The value of "name" field = "bold".
- "value" may be "True", if the font is bold and "False" otherwise.
-
IndentationAnnotation : indent from the left edge of the page.
- For documents in docx format, we mean the indentation from the inner borders of the document
- (margin is not taken into account). The value of "name" field = "indentation".
- "value" may be any real number converted to a string.
- For docx documents, the indent is measured in twentieths of a point (1/1440 of an inch).
-
ItalicAnnotation : italic text. The value of "name" field = "italic".
- "value" may be "True", if the text is in italics and "False" otherwise.
-
SizeAnnotation : font size in points (1/72 of an inch). The value of "name" field = "size".
- "value" may be any real number converted to a string.
-
StyleAnnotation : the name of the style applied to the text, for example, "heading 1".
- The value of "name" field = "style".
- "value" may be any string.
-
Table Annotation : table reference. The value of "name" field = "table".
- "value" field = unique identifier of the table.
-
UnderlinedAnnotation : underlined text. The value of "name" field = "underlined".
- "value" may be "True", if the text is underlined and "False" otherwise.
-
-
-
ParagraphMetadata
-
Contains paragraph meta information
-
-
paragraph_type : string (required field) - paragraph type (paragraph, list item and so on).
- Possible values depend on the type of document.
- Default values: ['root', 'paragraph', 'raw_text', 'list', 'list_item', 'named_header']
- Values for document_type 'law': ['root', 'raw_text', 'struct_unit', 'item', 'article', 'subitem',
- 'footer', 'header', 'title', 'part']
-
-
predicted_classes : Dict[str -> float] (optional field) - classifier results, paragraph type
- is the probability that the paragraph is of this type, the list of keys depends on the type of document.
-
-
page_id : integer (optional field) - page on which this paragraph begins.
-
line_id : integer (optional field) - The line number on which this paragraph begins.
docker run -p 1231:1231 --rm dedoc_container:latest python3 /dedoc/main.py
-
-
-> Service should rise at port 1231
-
-
Service parameters are configured in the config file (dedoc_project/dedoc/config.py)
-
The config is a python file, so you can use everything that standard python can do, for example, calculate the maximum file size as 512 * 1024 * 1024
-
How to use
-
You can send the file using the POST request to the address
- host:1231/upload
-
The name of the downloaded file should appear on the form
-
-
Additional query options:
-
-
language: string - document recognition language. The default value is "rus+eng". Available values: "rus+eng", "rus", "eng".
-
with_attachments: boolean - option including analysis of attached files. The option is False by default. Available values: True, False.
-
return_format: str - an option to return the response in pretty_json, html, json or tree form.
- The default value is json. Use the pretty_json, tree and html format for debug only.
- Warning: html-format is used only for viewing the recognition result (in a readable form).
- For further analysis, we recommend using the output json format.
-
structure_type: string - type output structure ('linear' or 'tree')
Structure of additional metadata for different file types
-
-
Для всех файлов помещенных или загруженных в/из облака
-
-
bucket_name: str (required field) - bucket name in which the file is located.
- Included when analyzing a file from a cloud storage (example: "dedoc")
-
cloud_file_path: str (required field) absolute path in the "bucket_name" on the cloud.
-
-
-
-
Docx/doc/odt files
-
-
document_subject: str (optional field) - the topic of the content of the document.
-
keywords: str (optional field) - a delimited set of keywords to support searching and indexing.
-
category: str (optional field) - a categorization of the content of this document. Example values for this property might include: Resume, Letter, Financial Forecast, Proposal, Technical Presentation, and so on.
-
author: str (optional field) - an entity primarily responsible for making the content of the document.
-
last_modified_by: str (optional field) - the user who performed the last modification. The identification is environment-specific. Examples include a name, email address, or employee ID.
-
created_date: str (optional field) - date of creation of the resource.
-
modified_date: str (optional field) - date on which the resource was changed.
-
last_printed_date: str (optional field) - the date and time of the last printing.
-
-
-
\ No newline at end of file
diff --git a/dedoc/api/static/html_eng/supported_formats.html b/dedoc/api/static/html_eng/supported_formats.html
deleted file mode 100644
index 731a6789..00000000
--- a/dedoc/api/static/html_eng/supported_formats.html
+++ /dev/null
@@ -1,96 +0,0 @@
-
-
-
- Supported Formats
-
-
-
If you use a non-standard separator, you can pass its value in the "delimiter" parameter into POST-request.
- For example delimiter=";". Use cases you can find in dedoc_project/dedoc/tests/test_api_csv.py
-
Формат документа не поддерживается (например на документ .mkv система вернет ответ 415
-
Сервис проверяет есть ли POST-запросе файл. Приложение берет файл из словаря files объекта запроса.
- В случае отсутствия файла, система возвращает 400
-
-
-
\ No newline at end of file
diff --git a/dedoc/api/static/html_rus/form_input.html b/dedoc/api/static/html_rus/form_input.html
deleted file mode 100644
index 0d6630af..00000000
--- a/dedoc/api/static/html_rus/form_input.html
+++ /dev/null
@@ -1,75 +0,0 @@
-
-
-
-
- Загрузка файла
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/dedoc/api/static/html_rus/format_description.html b/dedoc/api/static/html_rus/format_description.html
deleted file mode 100644
index 7f338393..00000000
--- a/dedoc/api/static/html_rus/format_description.html
+++ /dev/null
@@ -1,152 +0,0 @@
-
-
-
-
- Структура распознанного документа
-
-
-
Структура распознанного документа
-
Возвращается структура ParsedDocument, структура возвращается в виде Json.
-
Dedoc поддерживает линейную и древовидную структуру. В случае линейной структуры все строки документа являются
- наследниками корня дерева. В случае древовидной структуры (tree) dedoc пытается восстановить логическую структуру
- документа в виде дерева.
-
-
-
ParsedDocument
-
-
version: str (обязательное поле) -
- версия Dedoc
-
-
warnings: List[str] (обязательное поле) -
- любые ворнинги, возникшие в процессе обработки документа
-
content: DocumentContent (обязательное поле) - разобранная
- структура документа
-
-
attachments: List[ ParsedDocument ] (необязательное поле) -
- вложенные документы, возвращается только
- если задано условие обработки вложенных файлов.
-
page_id: int (необязательное поле) - номер страницы на которой начинается таблица.
-
-
-
TreeNode. Древовидная структура документа.
-
-
node_id : str (обязательное поле) - идентификатор элемента документа. Уникален в рамках одного
- дерева (т.е. в этом дереве не будет другого такого node_id, а в attachment может встретиться)
- Идентификатор имеет вид 0.2.1 где каждое число символизирует порядковый номер на соотвтетствующем уровне
- иерархии. Например node_id 0.2.1 означает что этот элемент это вторая подглова третьей главы
- (нумерация с 0, первое число это корень документа);
-
-
text: str (обязательное поле) - текст элемента;
-
annotations: List[ Annotation ] (обязательное поле) - поле описывает
- какие-либо свойства текста, например жирность, размер шрифта etc.
-
-
metadata: ParagraphMetadata (обязательное поле) -
- метоинформация, относящаяся ко всему субпараграфу, например номер страницы и положение на этой странице.
-
-
subparagraphs: List[ TreeNode ] (обязательное поле) -
- "дети" текущего элемента (например подглавы для главы). Структура "детей" аналогична текущей.
-
-
-
-
-
Annotation. Аннотации текста.
-
-
start : int (обязательное поле) - индекс начала аннотации.
-
end : int (обязательное поле) - индекс конца аннотации.
- Равен индексу последнего символа (относящегося к данной аннотации) + 1.
- Например, если в строке проаннотирован только первый символ, то start = 0, end = 1;
- если проаннотирована вся строка s, то start = 0, end = длина s.
-
name : string (обязательное поле) - тип аннотации (размер шрифта, курсив и т.д.).
-
value : str (обязательное поле) - значение аннотации
- (подробнее в ConcreteAnnotations).
-
-
-
Concrete annotations. Конкретные виды аннотаций.
-
-
AlignmentAnnotation : выравнивание текста. Значение поля name = "alignment".
- Значением поля value может быть "left" (выравнивание по левому краю), "right" (выравнивание по правому краю),
- "both" (выравнивание по обоим краям), "center" (выравнивание по центру).
-
BoldAnnotation : жирность текста. Значение поля name = "bold".
- Значением поля value может быть "True", если шрифт жирный и "False" иначе.
-
IndentationAnnotation : отступ от левого края страницы.
- Для документов в формате docx хранится отступ от внутренних границ документа
- (не учитывается отступ от края страницы). Значение поля name = "indentation".
- Значением поля value может быть любое действительное число, сконвертированное в строку.
- Для документов в формате docx отступ измеряется в двадцатых пункта (1/1440 дюйма).
-
ItalicAnnotation : выделен ли текст курсивом. Значение поля name = "italic".
- Значением поля value может быть "True", если текст выделен курсивом и "False" иначе.
-
SizeAnnotation : размер шрифта в пунктах (1/72 дюйма). Значение поля name = "size".
- Значением поля value может быть любое действительное число, сконвертированное в строку.
-
StyleAnnotation : название стиля, примененного к тексту, например, "heading 1".
- Значение поля name = "style".
- Значением поля value может быть любая строка.
-
Table Annotation : является ли строка ссылкой на таблицу. Значение поля name = "table".
- Значение поля value = уникальный идентификатор таблицы.
-
UnderlinedAnnotation : выделен ли текст подчеркиванием. Значение поля name = "underlined".
- Значением поля value может быть "True", если текст выделен подчеркиванием и "False" иначе.
-
-
-
ParagraphMetadata. Метаинформация, относящаяся к параграфу.
-
-
paragraph_type : str (обязательное поле) - тип параграфа (заголовок, элемент списка и так далее).
- Возможные значения зависят от типа документа.
- Значения по умолчанию: ['root', 'paragraph', 'raw_text', 'list', 'list_item', 'named_header']
- Значения для типа документа='law': ['root', 'raw_text', 'struct_unit', 'item', 'article', 'subitem',
- 'footer', 'header', 'title', 'part']
-
-
predicted_classes : Dict[str -> float] (необязательное поле) - результаты работы
- классификатора,
- тип параграфа -> вероятность того, что параграф относится к такому типу, список ключей зависит от типа
- документа.
-
-
page_id : int (необязательное поле) - страница на которой начинается этот параграф.
-
line_id : int (необязательное поле) - номер строки, на которой начинается этот параграф.
docker run -p 1231:1231 --rm dedoc_container:latest python3 /dedoc/main.py
-
-
-> Cервис поднимется на порту 1231
-
Параметры можно указать в конфигурационном файле (dedoc_project/dedoc/config.py)
-
Конфиг это файл на языке python, поэтому можно пользоваться
- всем, что умеет стандартный python, например вычислять максимальный размер файла как 512 * 1024 * 1024
-
-
Как использовать
-
Необходимо отправить файл с помощью POST запроса по адресу
- host:1231/upload
- Имя вгруженного файла должно появиться на форме.
-
-
Дополнительные опции запроса:
-
-
language: str - язык рапознавания документа. По-умолчанию установлено значение "rus+eng".
- Доступные значения: "rus+eng", "rus", "eng".
-
with_attachments: boolean - опция включающая анализ вложенных файлов. По-умолчанию установлено
- значение False. Доступные значения True, False.
-
return_format: str - опция для возврата ответа в html-виде, в виде дерева или в виде json.
- Возможные значения html, tree, json, pretty_json
- По-умолчанию установлено значение json, остальные методы стоит использовать только для дебага
- Предупреждение: html-формат используется исключительно для просмотра результата распознавания (в читабельном виде).
- В целях дальнейшего разбора рекомендуем использовать выходной json-формат.
-
structure_type: string - тип выходной структуры ('linear' или 'tree')
keywords: str (необязательное поле) - набор ключевых слов с разделителями для поддержки поиска и индексации.
-
category: str (необязательное поле) - категоризация содержимого документа. Примеры значений этого свойства могут включать: резюме, письмо, финансовый прогноз, предложение, техническую презентацию и т.д.
-
author: str (необязательное поле) - имя автора содержимого документа.
-
last_modified_by: str (необязательное поле) - Пользователь, выполнивший последнюю модификацию. Идентификация зависит от среды. Примеры включают имя, адрес электронной почты или идентификатор сотрудника.
-
created_date: str (необязательное поле) - дата создания документа.
-
modified_date: str (необязательное поле) - последняя дата модификации документа.
-
last_printed_date: str (необязательное поле) - дата и время последней печати документа.
-
-
-
\ No newline at end of file
diff --git a/dedoc/api/static/html_rus/supported_formats.html b/dedoc/api/static/html_rus/supported_formats.html
deleted file mode 100644
index c7cb4820..00000000
--- a/dedoc/api/static/html_rus/supported_formats.html
+++ /dev/null
@@ -1,96 +0,0 @@
-
-
-
-
- Поддерживаемые форматы
-
-
-
Если вы используете нестандартный разделитель, вы можете задать его значение в параметре "delimiter" вашего POST-запроса.
- Например delimiter=";". Примеры использования вы можете найти в dedoc_project/dedoc/tests/test_api_csv.py
-
-
\ No newline at end of file
diff --git a/dedoc/api/static/realistic_json.json b/dedoc/api/static/realistic_json.json
deleted file mode 100644
index 8dac0b64..00000000
--- a/dedoc/api/static/realistic_json.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "next_page": "Next Page »",
- "type": "news",
- "platform": "infosecnews",
- "start_url": "https://infosecnews.org",
- "next_page-href": "https://www.infosecnews.org/page/3/",
- "news_link": "Leading privacy and cybersecurity law firm investigates Tandem Diabetes Care data breach",
- "news_link-href": "https://www.infosecnews.org/leading-privacy-and-cybersecurity-law-firm-investigates-tandem-diabetes-care-data-breach/",
- "title": "Leading privacy and cybersecurity law firm investigates Tandem Diabetes Care data breach",
- "publication_date": "April 20, 2020",
- "author": "William Knowles",
- "text": [
- "We take the privacy and confidentiality of our customers’ information very seriously and apologize for any inconvenience or concern this incident may cause our customers.",
- "With the next sentence…",
- "Tandem Diabetes Care, Inc. (“Tandem”) is committed to protecting the confidentiality and security of our customers’ information. Regrettably, this notice is to inform our customers of a recent phishing incident that may have involved some customer information.",
- "Some customer information is “reputational risk management code” for only 140,781 customers.",
- "We are continuing to invest heavily in cyber security and data protection safeguards. We are also implementing additional email security controls, strengthening our user authorization and authentication processes, and limiting the types of data permitted to be transferred via email.",
- "On January 17, 2020, Tandem Diabetes Care learned that an unauthorized person gained access to a Tandem employee’s email account through a security incident commonly known as “phishing.”",
- "Once we learned about the incident, we immediately secured the account and a cyber security firm was engaged to assist in our investigation. Our investigation determined that a limited number of Tandem employee email accounts may have been accessed by an unauthorized user between January 17, 2020 and January 20, 2020.",
- "Through the investigation, Tandem Diabetes Care learned that some customers’ information may have been contained in one or more of the Tandem email accounts affected by the incident. The affected email accounts may have contained customer names, contact information, information related to those customers’ use of Tandem’s products or services, clinical data regarding their diabetes therapy, and in a few limited instances, Social Security numbers.",
- "On LinkedIn, Tandem Diabetes Care lists some 935 employees, but only three security people (understandably some of the security team might have temporarily pulled their profiles offline) and currently Tandem is looking for a Security Analyst II and a VP, Information Technology but neither of the job descriptions mention having knowing how to perform phishing exercises.",
- "While you would think all this bad news is terrible for Tandem Diabetes Care’s stock price, guess again, when the data breach was submitted to the U.S. Department of Health and Human Services on March 13, 2020, TNDM – Tandem Diabetes Care, Inc closed at $46.55 a share and closed on Apri 18, 2020 at $72.94 a share.",
- "So it should come to no surprised that Stueve Siegel Hanson LLP, a small Kansas City law firm known for their eight-figure legal outcomes would explore legal options for this data breach.",
- "KANSAS CITY, Mo., April 1, 2020 /PRNewswire-PRWeb/ — Stueve Siegel Hanson LLP, a national leader in privacy and cybersecurity litigation, is investigating the data breach at Tandem Diabetes Care, Inc. that compromised the sensitive personal information of 140,000 patients, the firm announced today.",
- "On January 17, Tandem discovered its email system had been hacked through a “phishing” scheme. An internal investigation showed several employee email accounts were compromised for three days between January 17 and January 20. The compromised information included names, email addresses, contact information, Social Security numbers and a range of patient data, including details related to customers’ use of Tandem products or services, and clinical data about diabetes therapy.",
- "Tandem announced the data breach on March 16 and said it would notify affected customers. Individuals who receive these notifications can contact Stueve Siegel Hanson at 816.714.7105 or online to discuss their legal options.",
- "Recognized by Law360 as “Cybersecurity & Privacy Group of the Year,” Stueve Siegel Hanson has prosecuted cases involving the largest data breaches in U.S. history, securing billions of dollars for affected customers. In 2019, the firm’s work included:"
- ],
- "url": "https://www.infosecnews.org/leading-privacy-and-cybersecurity-law-firm-investigates-tandem-diabetes-care-data-breach/"
-}
\ No newline at end of file
diff --git a/dedoc/api/static/styles.css b/dedoc/api/static/styles.css
deleted file mode 100644
index 0fe1f2f5..00000000
--- a/dedoc/api/static/styles.css
+++ /dev/null
@@ -1,43 +0,0 @@
-.content {
- max-width: 1200px;
- margin: 0 auto;
-}
-
-.body-upload {
- margin: 5px;
- background: #A6A6A6
-}
-
-.body-2 {
- margin: 15px;
-}
-
-/* Tab Navigation */
-.nav-tabs {
- margin: 0;
- padding: 0;
- border: 0;
-}
-.nav-tabs > li > a {
- background: #DADADA;
- border-radius: 0;
- box-shadow: inset 0 -8px 7px -9px rgba(0,0,0,.4),-2px -2px 5px -2px rgba(0,0,0,.4);
-}
-.nav-tabs > li.active > a,
-.nav-tabs > li.active > a:hover {
- background: #F5F5F5;
- box-shadow: inset 0 0 0 0 rgba(0,0,0,.4),-2px -3px 5px -2px rgba(0,0,0,.4);
-}
-
-/* Tab Content */
-.tab-pane {
- background: #F5F5F5;
- box-shadow: 0 0 4px rgba(0,0,0,.4);
- border-radius: 0;
- text-align: left;
- padding: 10px;
-}
-
-.red {
- color:#f00
-}
\ No newline at end of file
diff --git a/dedoc/api/static/swagger/components/annotation.json b/dedoc/api/static/swagger/components/annotation.json
deleted file mode 100644
index 239422be..00000000
--- a/dedoc/api/static/swagger/components/annotation.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "Annotation": {
- "type": "object",
- "description": "Аннотации текста",
- "properties": {
- "start": {
- "type": "integer",
- "format": "int32",
- "description": "индекс начала аннотации",
- "required": true
- },
- "end": {
- "type": "integer",
- "format": "int32",
- "description": "индекс конца аннотации",
- "required": true
- },
- "value": {
- "type": "string",
- "description": "значение аннотации. Может содержать название стиля (тогда начинается со строки \"style:\") или другие значения",
- "required": true,
- "enum": ["style: имя_шрифта", "bold", "italic", "underground"]
- }
- }
- }
-}
\ No newline at end of file
diff --git a/dedoc/api/static/swagger/components/document_content.json b/dedoc/api/static/swagger/components/document_content.json
deleted file mode 100644
index 73835129..00000000
--- a/dedoc/api/static/swagger/components/document_content.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "DocumentContent": {
- "type": "object",
- "description": "Структура содержимого документа",
- "properties": {
- "tables":{
- "type": "array",
- "items": {
- "$ref": "table.json#/Table"
- }
- },
- "structure": {
- "$ref": "tree_node.json#/TreeNode"
- }
-
- }
- }
-}
\ No newline at end of file
diff --git a/dedoc/api/static/swagger/components/document_metadata.json b/dedoc/api/static/swagger/components/document_metadata.json
deleted file mode 100644
index 9fa6e885..00000000
--- a/dedoc/api/static/swagger/components/document_metadata.json
+++ /dev/null
@@ -1,54 +0,0 @@
-{
- "DocumentMetadata": {
- "type": "object",
- "description": "Метаинформация документа",
- "properties": {
- "file_name": {
- "type": "string",
- "required": true,
- "description": "file name",
- "example": "example.odt"
- },
- "bucket_name": {
- "type": "string",
- "required": false,
- "description": "bucket name in which the file is located. Included when analyzing a file from a cloud storage",
- "example": "dedoc"
- },
- "size": {
- "type": "integer",
- "format": "int32",
- "required": true,
- "description": "file size in bytes",
- "example": "20060"
- },
- "modified_time": {
- "type": "integer",
- "format": "int32",
- "required": true,
- "description": "modification date of the document in the format UnixTime",
- "example": "1590579805"
- },
- "created_time": {
- "type": "integer",
- "format": "int32",
- "required": true,
- "description": "creation date of the document in the format UnixTime",
- "example": "1590579805"
- },
- "access_time": {
- "type": "integer",
- "format": "int32",
- "required": true,
- "description": "file access date in format UnixTime",
- "example": "1590579805"
- },
- "file_type": {
- "type": "string",
- "required": false,
- "description": "mime-type file",
- "example": "application/vnd.oasis.opendocument.text"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/dedoc/api/static/swagger/components/paragraph_metadata.json b/dedoc/api/static/swagger/components/paragraph_metadata.json
deleted file mode 100644
index 1c5a434f..00000000
--- a/dedoc/api/static/swagger/components/paragraph_metadata.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "ParagraphMetadata": {
- "type": "object",
- "description": "Метаинформация, относящаяся к параграфу",
- "properties": {
- "paragraph_type": {
- "type": "string",
- "required": true,
- "description": "тип параграфа (заголовок, элемент списка и так далее).. Возможные значения зависят от типа документа. Значения по умолчанию: ['root', 'paragraph', 'raw_text', 'list', 'list_item', 'named_header'] Значения для типа документа='law': ['root', 'raw_text', 'struct_unit', 'item', 'article', 'subitem', 'footer', 'header', 'title', 'part'] "
- },
- "predicted_classes": {
- "required": false,
- "type": "object",
- "description": "результаты работы классификатора, [{ тип параграфа: вероятность }]. Вероятность - это вероятность отношения параграфа к такому типу, список типов параграфов зависит от типа документа"
- },
- "page_id": {
- "type": "integer",
- "format": "int32",
- "description": "страница, с которой начинается этот параграф",
- "required": false
- },
- "line_id": {
- "type": "integer",
- "format": "int32",
- "description": "номер строки, с которой начинается этот параграф",
- "required": false
- }
- }
- }
-}
\ No newline at end of file
diff --git a/dedoc/api/static/swagger/components/parsed_document.json b/dedoc/api/static/swagger/components/parsed_document.json
deleted file mode 100644
index 5ef3c76d..00000000
--- a/dedoc/api/static/swagger/components/parsed_document.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "ParsedDocument": {
- "type": "object",
- "properties": {
- "metadata": {
- "$ref": "document_metadata.json#/DocumentMetadata"
- },
- "content": {
- "$ref": "document_content.json#/DocumentContent"
- },
- "attachments": {
- "type": "array",
- "required": false,
- "items": {
- "$ref": "#/ParsedDocument"
- }
- }
- }
- }
-}
\ No newline at end of file
diff --git a/dedoc/api/static/swagger/components/table.json b/dedoc/api/static/swagger/components/table.json
deleted file mode 100644
index 75138184..00000000
--- a/dedoc/api/static/swagger/components/table.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "Table": {
- "type": "object",
- "description": "Распознанные таблицы",
- "required": true,
- "properties": {
- "cells": {
- "type": "array",
- "items": {
- "type": "array",
- "items": {
- "type": "string",
- "format": "string",
- "description": "Ячейка содрежит текст"
- }
- },
- "description": "список списков строк таблицы, строка таблицы представляет из себя списко содержимого ячеек. Ячейка содрежит текст"
- },
- "metadata": {
- "$ref": "table_metadata.json#/TableMetadata"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/dedoc/api/static/swagger/components/table_metadata.json b/dedoc/api/static/swagger/components/table_metadata.json
deleted file mode 100644
index ce575a07..00000000
--- a/dedoc/api/static/swagger/components/table_metadata.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "TableMetadata": {
- "type": "object",
- "description": "Метаинформация таблицы",
- "properties": {
- "page_id": {
- "type": "integer",
- "format": "int32",
- "required": false,
- "description": "номер страницы на которой начинается таблица"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/dedoc/api/static/swagger/components/tree_node.json b/dedoc/api/static/swagger/components/tree_node.json
deleted file mode 100644
index ea45e685..00000000
--- a/dedoc/api/static/swagger/components/tree_node.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "TreeNode": {
- "type": "object",
- "description": "Древовидная структура документа",
- "properties": {
- "node_id": {
- "type": "string",
- "description": "идентификатор элемента документа. Уникален в рамках одного дерева (т.е. в этом дереве не будет другого такого node_id, а в attachment может встретиться) Идентификатор имеет вид 0.2.1 где каждое число символизирует порядковый номер на соотвтетствующем уровне иерархии.",
- "required": true,
- "example": "0.2.1"
- },
- "text": {
- "type": "string",
- "description": "текст элемента",
- "required": true
- },
- "annotations": {
- "type": "array",
- "items": {
- "$ref": "annotation.json#/Annotation"
- },
- "description": "описывает какие-либо свойства текста, например жирность, размер шрифта и т.д.",
- "required": true
- },
- "metadata": {
- "$ref": "paragraph_metadata.json#/ParagraphMetadata"
- },
- "subparagraphs": {
- "type": "array",
- "items": {
- "$ref": "#/TreeNode"
- },
- "description": "\"дети\" типа \"TreeNode\" текущего элемента (например подглавы для главы). Структура \"детей\" аналогична текущей.",
- "required": true
- }
- }
- }
-}
\ No newline at end of file
diff --git a/dedoc/api/static/swagger/swagger.json b/dedoc/api/static/swagger/swagger.json
deleted file mode 100644
index 9c8b143b..00000000
--- a/dedoc/api/static/swagger/swagger.json
+++ /dev/null
@@ -1,177 +0,0 @@
-{
- "openapi": "3.0.1",
- "info": {
- "description": "API description",
- "version": "1.0.0",
- "title": "Automatic structure document extractor",
- "license": {
- "name": "MIT",
- "url": "https://opensource.org/licenses/MIT"
- }
- },
- "servers": [
- {
- "url": "/"
- }
- ],
- "tags": [
- {
- "name": "Upload File",
- "description": "Example API for requesting and return document structure requests"
- }
- ],
- "paths": {
- "/upload": {
- "post": {
- "tags": [
- "Upload File"
- ],
- "summary": "Returns reconized document structure",
- "requestBody": {
- "content": {
- "multipart/form-data": {
- "schema": {
- "type": "object",
- "properties": {
- "file": {
- "type": "string",
- "format": "binary"
- }
- }
- }
- }
- }
- },
- "parameters": [
- {
- "in": "query",
- "name": "language",
- "required": false,
- "description": "язык рапознавания документа.",
- "schema": {
- "type": "string",
- "default": "rus+eng",
- "enum": ["rus+eng", "rus", "eng"]
- }
- },
- {
- "in": "query",
- "name": "with_attachments",
- "required": false,
- "description": "опция включающая анализ вложенных файлов.",
- "schema": {
- "type": "boolean",
- "default": false
- }
- },
- {
- "in": "query",
- "name": "return_html",
- "required": false,
- "description": "опция для возврата ответа в html-виде.",
- "schema": {
- "type": "boolean",
- "default": false
- }
- },
- {
- "in": "query",
- "name": "document_type",
- "required": false,
- "description": "тип документа. ",
- "schema": {
- "type": "string",
- "enum": ["", "law", "article"],
- "default": ""
- }
- },
- {
- "in": "query",
- "name": "structure_type",
- "required": false,
- "description": "тип выходной структуры (линейная или древовидная)",
- "schema": {
- "type": "string",
- "enum": ["linear", "tree"],
- "default": "linear"
- }
- },
- {
- "in": "query",
- "name": "pdf_with_text_layer",
- "required": false,
- "description": "опция плагина Docreader для извлечения текста из текстового слоя в PDF или с помощью OCR-методов из изображения документов.",
- "schema": {
- "type": "boolean",
- "default": false
- }
- },
- {
- "in": "query",
- "name": "orient_analysis_cells",
- "required": false,
- "description": "опция плагина Docreader модуля распознавания таблиц включение анализа повернутых ячеек в заголовках таблиц.",
- "schema": {
- "type": "boolean",
- "default": false
- }
- },
- {
- "in": "query",
- "name": "orient_cell_angle",
- "required": false,
- "description": "опция плагина Docreader для установки ориентации ячеек в заголовках таблиц. \"90\" - ячейки повернуты на 90 градусов по часовой стрелке, \"270\" - ячейки повернуты на 90 градусов против часовой стрелки (или 270 по часовой)",
- "schema": {
- "type": "string",
- "enum": [
- "90",
- "270"
- ],
- "default": "270"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "OK",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/ParsedDocument"
- }
- }
- }
- }
- }
- }
- }
- },
- "components": {
- "schemas": {
- "ParsedDocument": {
- "$ref": "components/parsed_document.json#/ParsedDocument"
- },
- "DocumentMetadata": {
- "$ref": "components/document_metadata.json#/DocumentMetadata"
- },
- "DocumentContent": {
- "$ref": "components/document_content.json#/DocumentContent"
- },
- "Table": {
- "$ref": "components/table.json#/Table"
- },
- "TableMetadata": {
- "$ref": "components/table_metadata.json#/TableMetadata"
- },
- "TreeNode": {
- "$ref": "components/tree_node.json#/TreeNode"
- },
- "Annotation": {
- "$ref": "components/annotation.json#/Annotation"
- },
- "ParagraphMetadata": {
- "$ref": "components/paragraph_metadata.json#/ParagraphMetadata"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/dedoc/api/static/train_dataset/refit_classifier.html b/dedoc/api/static/train_dataset/refit_classifier.html
deleted file mode 100644
index f59f2642..00000000
--- a/dedoc/api/static/train_dataset/refit_classifier.html
+++ /dev/null
@@ -1,67 +0,0 @@
-
-
-
-
- Dedoc | Обучение классификаторов
-
-
-
-
-
-
-
Дообучение классификаторов
-
-
Классификатор типа строк
-
- Переобучение классификаторов происходит с помощью скриптов dedoc/scripts/train_clf_type_line_classifier.py,
- где clf_type - тип классификатора (tz, law, diploma).
-
-
-
Классификатор ориентации изображения документа
-
- Переобучение классификатора ориентации происходит с помощью скрипта dedoc/scripts/train_acc_orientation_classifier.py
-
-
- -t TRAIN, --train TRAIN (--train True) или проверка модели (--train False)
-
-
-
-
-
- -s CHECKPOINT_SAVE, --checkpoint_save CHECKPOINT_SAVE путь до весов checkpoint.pth для сохранения (используется только для этапа тренировки)
-
-
-
-
-
- -l CHECKPOINT_LOAD, --checkpoint_load CHECKPOINT_LOAD путь до весов checkpoint.pth, которые будут загружены в модель
-
-
-
-
-
- -f FROM_CHECKPOINT, --from_checkpoint FROM_CHECKPOINT флаг устанавливается, если обучение нужно продолжить из чекпоинта, указанного в CHECKPOINT_LOAD
-
-
-
-
-
- -d INPUT_DATA_FOLDER, --input_data_folder INPUT_DATA_FOLDER путь до папки с тренировочными (подпапка train) и тестовыми данными (подпапка test).
-
-
-
\ No newline at end of file
diff --git a/dedoc/api/train_dataset/api_args.py b/dedoc/api/train_dataset/api_args.py
deleted file mode 100644
index 53eb0d2c..00000000
--- a/dedoc/api/train_dataset/api_args.py
+++ /dev/null
@@ -1,30 +0,0 @@
-from typing import Optional
-
-from fastapi import Body
-
-from dedoc.api.api_args import QueryParameters
-
-
-class TrainDatasetParameters(QueryParameters):
- type_of_task: Optional[str]
- task_size: Optional[str]
-
- def __init__(self,
- type_of_task: Optional[str] = Body(description="Type of the task to create", default=None), # noqa
- task_size: Optional[str] = Body(description="Maximum number of images in one task", default=None), # noqa
-
- document_type: Optional[str] = Body(default=None), # noqa
- pdf_with_text_layer: Optional[str] = Body(default=None), # noqa
- language: Optional[str] = Body(default=None), # noqa
- need_header_footer_analysis: Optional[str] = Body(default=None), # noqa
-
- **data: dict) -> None:
-
- super().__init__(**data)
- self.type_of_task: str = type_of_task or ""
- self.task_size: str = task_size or "250"
-
- self.document_type = document_type or ""
- self.pdf_with_text_layer = pdf_with_text_layer or "auto"
- self.language = language or "rus+eng"
- self.need_header_footer_analysis = need_header_footer_analysis or "false"
diff --git a/dedoc/api/train_dataset/api_collect_train_dataset.py b/dedoc/api/train_dataset/train_dataset_api.py
similarity index 89%
rename from dedoc/api/train_dataset/api_collect_train_dataset.py
rename to dedoc/api/train_dataset/train_dataset_api.py
index 047edfe7..4493b51d 100644
--- a/dedoc/api/train_dataset/api_collect_train_dataset.py
+++ b/dedoc/api/train_dataset/train_dataset_api.py
@@ -1,15 +1,18 @@
+import dataclasses
import logging
import os
import shutil
+from dataclasses import dataclass
+from typing import Optional
import uvicorn
-from fastapi import Depends, FastAPI, File, Request, Response, UploadFile
+from fastapi import Depends, FastAPI, File, Form, Request, Response, UploadFile
from fastapi.staticfiles import StaticFiles
from starlette.responses import FileResponse, HTMLResponse
from starlette.templating import Jinja2Templates
+from dedoc.api.api_args import QueryParameters
from dedoc.api.dedoc_api import _get_static_file_path
-from dedoc.api.train_dataset.api_args import TrainDatasetParameters
from dedoc.api.train_dataset.async_archive_handler import AsyncHandler
from dedoc.config import get_config
from dedoc.dedoc_manager import DedocManager
@@ -21,16 +24,28 @@
from dedoc.train_dataset.train_dataset_utils import get_path_original_documents
from dedoc.utils.utils import calculate_file_hash
+
+@dataclass
+class TrainDatasetParameters(QueryParameters):
+ type_of_task: Optional[str] = Form("law_classifier",
+ enum=[
+ "law_classifier", "tz_classifier", "diploma_classifier", "header_classifier", "paragraph_classifier",
+ "tables_classifier"
+ ],
+ description="Type of the task to create")
+ task_size: Optional[str] = Form("250", description="Maximum number of images in one task")
+
+
config = get_config()
PORT = config["api_port"]
-static_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "static")
+static_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "web")
static_files_dirs = config.get("static_files_dirs")
logger = config.get("logger", logging.getLogger())
app = FastAPI()
-app.mount("/static", StaticFiles(directory=static_path), name="static")
+app.mount("/web", StaticFiles(directory=static_path), name="web")
templates = Jinja2Templates(directory=os.path.join(static_path, "train_dataset"))
manager = DedocManager(config=config)
@@ -161,7 +176,7 @@ def upload_archive(file: UploadFile = File(...), query_params: TrainDatasetParam
Run the whole pipeline of task making.
"""
clear()
- parameters = query_params.dict(by_alias=True)
+ parameters = dataclasses.asdict(query_params)
uid = handler.handle(file=file, parameters=parameters)
return HTMLResponse(f'Successfully handle file. UID=
+
+
\ No newline at end of file
diff --git a/dedoc/api/static/train_dataset/download.html b/dedoc/api/web/train_dataset/download.html
similarity index 100%
rename from dedoc/api/static/train_dataset/download.html
rename to dedoc/api/web/train_dataset/download.html
diff --git a/dedoc/api/static/train_dataset/form_input_archive.html b/dedoc/api/web/train_dataset/form_input_archive.html
similarity index 68%
rename from dedoc/api/static/train_dataset/form_input_archive.html
rename to dedoc/api/web/train_dataset/form_input_archive.html
index baa474b7..d50f5b73 100644
--- a/dedoc/api/static/train_dataset/form_input_archive.html
+++ b/dedoc/api/web/train_dataset/form_input_archive.html
@@ -3,15 +3,10 @@
Загрузка файла
-
-
-
+
+
-
-
@@ -29,7 +24,9 @@
Распознавание структуры документа
pdf_with_text_layer
@@ -37,18 +34,15 @@
Распознавание структуры документа
-
+
@@ -60,7 +54,8 @@
Распознавание структуры документа
-
-
diff --git a/dedoc/api/static/train_dataset/info_labeling_mode.html b/dedoc/api/web/train_dataset/info_labeling_mode.html
similarity index 72%
rename from dedoc/api/static/train_dataset/info_labeling_mode.html
rename to dedoc/api/web/train_dataset/info_labeling_mode.html
index 9ef6caa6..1fe3ddfb 100644
--- a/dedoc/api/static/train_dataset/info_labeling_mode.html
+++ b/dedoc/api/web/train_dataset/info_labeling_mode.html
@@ -3,7 +3,6 @@
Dedoc | prepare label data
-
@@ -13,7 +12,7 @@
Процесс создания датасетов и обучения классификаторов
Шаг 1 - Формирование заданий для системы разметки
-
+
Запустите dedoc в режиме разметки путем включения строки labeling_mode=True в ваш конфиг файл config.py.
@@ -23,23 +22,16 @@
Шаг 1 - Формирование заданий для системы р
Для формирования заданий для внешней системы разметки идем сюда и загружаем подготовленный архив с необходимыми параметрами.
- Информация по обучению классификаторов строк и классификатора ориентации изображений
- находится тут.
-
-
-
Шаг 4 - Удаление данных для разметки
-
- Тут можно удалить промежуточные данные,
- используемые при создании заданий на разметку.
+ Тут можно удалить промежуточные данные, используемые при создании заданий на разметку.
diff --git a/dedoc/attachments_handler/attachments_handler.py b/dedoc/attachments_handler/attachments_handler.py
index 1392277a..37f4f98c 100644
--- a/dedoc/attachments_handler/attachments_handler.py
+++ b/dedoc/attachments_handler/attachments_handler.py
@@ -62,7 +62,6 @@ def handle_attachments(self, document_parser: "DedocManager", document: Unstruct
parameters_copy = copy.deepcopy(parameters)
parameters_copy["is_attached"] = True
- parameters_copy["attachment"] = attachment
parameters_copy["recursion_deep_attachments"] = str(recursion_deep_attachments)
try:
diff --git a/dedoc/dedoc_manager.py b/dedoc/dedoc_manager.py
index 0079d5c6..ee308f1a 100644
--- a/dedoc/dedoc_manager.py
+++ b/dedoc/dedoc_manager.py
@@ -4,6 +4,7 @@
import tempfile
from typing import Dict, Optional
+from dedoc.api.api_args import QueryParameters
from dedoc.common.exceptions.dedoc_error import DedocError
from dedoc.config import get_config
from dedoc.data_structures import ParsedDocument, UnstructuredDocument
@@ -54,6 +55,8 @@ def __init__(self, config: Optional[dict] = None, manager_config: Optional[dict]
self.attachments_handler = manager_config.get("attachments_handler", None)
assert self.attachments_handler is not None, "Attachments handler shouldn't be None"
+ self.default_parameters = QueryParameters().to_dict()
+
def parse(self, file_path: str, parameters: Optional[Dict[str, str]] = None) -> ParsedDocument:
"""
Run the whole pipeline of the document processing.
@@ -63,7 +66,8 @@ def parse(self, file_path: str, parameters: Optional[Dict[str, str]] = None) ->
:param parameters: any parameters, specify how to parse file (see API parameters documentation for more details)
:return: parsed document
"""
- parameters = {} if parameters is None else parameters
+ parameters = self.__init_parameters(parameters)
+ self.logger.info(f"Get file {os.path.basename(file_path)} with parameters {parameters}")
try:
return self.__parse_no_error_handling(file_path=file_path, parameters=parameters)
@@ -129,6 +133,15 @@ def __parse_no_error_handling(self, file_path: str, parameters: Dict[str, str])
self.logger.info(f"Finish handle {file_name}")
return parsed_document
+ def __init_parameters(self, parameters: Optional[dict]) -> dict:
+ parameters = {} if parameters is None else parameters
+ result_parameters = {}
+
+ for parameter_name, parameter_value in self.default_parameters.items():
+ result_parameters[parameter_name] = parameters.get(parameter_name, parameter_value)
+
+ return result_parameters
+
def __save(self, file_path: str, classified_document: UnstructuredDocument) -> None:
save_line_with_meta(lines=classified_document.lines, config=self.config, original_document=os.path.basename(file_path))
shutil.copy(file_path, os.path.join(get_path_original_documents(self.config), os.path.basename(file_path)))
diff --git a/dedoc/main.py b/dedoc/main.py
index e80ef2e4..30b7f1f1 100644
--- a/dedoc/main.py
+++ b/dedoc/main.py
@@ -20,7 +20,7 @@ def main() -> None:
config = get_config()
if config.get("labeling_mode", False):
- from api.train_dataset.api_collect_train_dataset import run_special_api # noqa
+ from api.train_dataset.train_dataset_api import run_special_api # noqa
run_special_api()
else:
main()
diff --git a/dedoc/readers/pdf_reader/pdf_image_reader/pdf_image_reader.py b/dedoc/readers/pdf_reader/pdf_image_reader/pdf_image_reader.py
index fa43f173..28ee7775 100644
--- a/dedoc/readers/pdf_reader/pdf_image_reader/pdf_image_reader.py
+++ b/dedoc/readers/pdf_reader/pdf_image_reader/pdf_image_reader.py
@@ -47,9 +47,7 @@ def __init__(self, *, config: dict) -> None:
"""
super().__init__(config=config)
self.scew_corrector = SkewCorrector()
- self.column_orientation_classifier = ColumnsOrientationClassifier(on_gpu=False,
- checkpoint_path=get_config()["resources_path"],
- config=config)
+ self.column_orientation_classifier = ColumnsOrientationClassifier(on_gpu=False, checkpoint_path=get_config()["resources_path"], config=config)
self.binarizer = AdaptiveBinarizer()
self.ocr = OCRLineExtractor(config=config)
self.logger = config.get("logger", logging.getLogger())
diff --git a/tests/unit_tests/test_misc_dedoc_manager.py b/tests/unit_tests/test_misc_dedoc_manager.py
index 536d2eaf..d13f2a50 100644
--- a/tests/unit_tests/test_misc_dedoc_manager.py
+++ b/tests/unit_tests/test_misc_dedoc_manager.py
@@ -14,10 +14,9 @@ class TestDedocManager(TestCase):
def test_parse_file(self) -> None:
filename = "csv_tab.tsv"
- result = self.dedoc_manager.parse(os.path.join(self.path, "csv_tab.tsv"))
+ result = self.dedoc_manager.parse(os.path.join(self.path, filename))
cells = result.content.tables[0].cells
self.assertEqual(filename, result.metadata.file_name)
- self.assertEqual(filename, result.metadata.file_name)
self.assertLessEqual(["1", "2", "3"], [cell.get_text() for cell in cells[0]])
self.assertLessEqual(["2", "1", "5"], [cell.get_text() for cell in cells[1]])
self.assertLessEqual(["5", "3", "1"], [cell.get_text() for cell in cells[2]])