Semi-structured document parser
srsparser is a library that translates semi-structured text documents (files with .docx extension) into a structured
form in accordance with JSON templates and contains natural language processing algorithms to analyze the resulting
structures.
The main idea
Let's consider the application of this library on the example of the technical assignment for developing of automated
system.
Based on the structure of the technical assignment described in
the GOST standard 34.602-89
the necessary sections are selected, and on their basis the tree structure of sections is compiled in JSON format. Each
section is represented by name and content (children — if it has subsections, otherwise — text). This step is done
manually.
The compiled section structure is transferred to the parser as a template. Example of the template:
{
"name": "Техническое задание",
"children": [
{
"text": "",
"name": "Общие сведения"
},
{
"text": "",
"name": "Назначение и цели создания (развития) системы"
},
{
"text": "",
"name": "Характеристика объектов автоматизации"
},
{
"name": "Требования к системе",
"children": [
{
"name": "Требования к системе в целом",
"children": [
{
"text": "",
"name": "Требования к структуре и функционированию системы"
},
{
"text": "",
"name": "Требования к численности и квалификации персонала системы и режиму его работы"
},
{
"text": "",
"name": "Показатели назначения"
},
{
"text": "",
"name": "Требования к надежности"
},
{
"text": "",
"name": "Требования к безопасности"
},
{
"text": "",
"name": "Требования к эргономике и технической эстетике"
},
{
"text": "",
"name": "Требования к транспортабельности для подвижных АС"
},
{
"text": "",
"name": "Требования к эксплуатации, техническому обслуживанию, ремонту и хранению компонентов системы"
},
{
"text": "",
"name": "Требования к защите информации от несанкционированного доступа"
},
{
"text": "",
"name": "Требования по сохранности информации при авариях"
},
{
"text": "",
"name": "Требования к защите от влияния внешних воздействий"
},
{
"text": "",
"name": "Требования к патентной чистоте"
},
{
"text": "",
"name": "Требования по стандартизации и унификации"
},
{
"text": "",
"name": "Дополнительные требования"
}
]
},
{
"text": "",
"name": "Требования к функциям (задачам)"
},
{
"name": "Требования к видам обеспечения",
"children": [
{
"text": "",
"name": "Требования к математическому обеспечению"
},
{
"text": "",
"name": "Требования к информационному обеспечению"
},
{
"text": "",
"name": "Требования к лингвистическому обеспечению"
},
{
"text": "",
"name": "Требования к программному обеспечению"
},
{
"text": "",
"name": "Требования к техническому обеспечению"
},
{
"text": "",
"name": "Требования к метрологическому обеспечению"
},
{
"text": "",
"name": "Требования к организационному обеспечению"
},
{
"text": "",
"name": "Требования к методическому обеспечению"
}
]
}
]
},
{
"text": "",
"name": "Состав и содержание работ по созданию системы"
},
{
"text": "",
"name": "Порядок контроля и приемки системы"
},
{
"text": "",
"name": "Требования к составу и содержанию работ по подготовке объекта автоматизации к вводу системы в действие"
},
{
"text": "",
"name": "Требования к документированию"
},
{
"text": "",
"name": "Источники разработки"
}
]
}
The parser reads the contents of a text document and tries to detect in it exactly those sections that are present in
the template. If the text document contains content corresponding to a section of the template, then it is entered in
the "text" field of the corresponding section of the template.
After filling the template with the contents of a text document, sections with empty "text" fields are removed from it,
and the filled template is converted to JSON format. Example of the filled template in JSON format:
{
"name": "Техническое задание",
"children": [
{
"text": "Полное наименование системы и ее условное обозначение: Конфигурация «Бухгалтерия предприятия» в среде «1С: Предприятие 8.1»....",
"name": "Общие сведения"
},
{
"text": "Подсистема оперативного учета должна содержать механизмы...",
"name": "Назначение и цели создания (развития) системы"
},
{
"text": "Объектом автоматизации является процесс учета расчетов с работниками по оплате труда в организации...",
"name": "Характеристика объектов автоматизации"
},
{
"name": "Требования к системе",
"children": [
{
"name": "Требования к системе в целом",
"children": [
{
"text": "Для наиболее эффективного функционирования системы помимо пользователя...",
"name": "Требования к численности и квалификации персонала системы и режиму его работы"
},
{
"text": "Система должна предусматривать возможность масштабирования по производительности...",
"name": "Показатели назначения"
},
{
"text": "Система должна сохранять работоспособность и обеспечивать восстановление своих функций при возникновении следующих внештатных ситуаций...",
"name": "Требования к защите от влияния внешних воздействий"
}
]
},
{
"text": "Подсистема оперативного учета должна осуществлять ввод и хранение оперативных данных системы...",
"name": "Требования к функциям (задачам)"
},
{
"name": "Требования к видам обеспечения",
"children": [
{
"text": "Не предъявляются;",
"name": "Требования к математическому обеспечению"
},
{
"text": "Уровень хранения данных в системе должен быть построен на основе современных СУБД...",
"name": "Требования к информационному обеспечению"
},
{
"text": "Система создана на основе языка программирования «1С 8.1»;",
"name": "Требования к лингвистическому обеспечению"
},
{
"text": "Для эффективного функционирования системы помимо пользователя необходим специалист по технической поддержке...",
"name": "Требования к метрологическому обеспечению"
},
{
"text": "Для эффективного функционирования системы помимо пользователя необходим специалист по технической поддержке...",
"name": "Требования к организационному обеспечению"
},
{
"text": "Для обеспечения целостности данных должны использоваться встроенные механизмы СУБД...",
"name": "Требования к методическому обеспечению"
}
]
}
]
},
{
"text": "Перечень стадий и этапов работ, а так же сроки их исполнения представлены в Таблице 2...",
"name": "Состав и содержание работ по созданию системы"
},
{
"text": "Приемочные испытания должны включать проверку: полноты и качества реализации необходимых функций...",
"name": "Порядок контроля и приемки системы"
},
{
"text": "Для подготовки объекта автоматизации к вводу системы в действие необходимо при помощи специалиста технической поддержки...",
"name": "Требования к составу и содержанию работ по подготовке объекта автоматизации к вводу системы в действие"
},
{
"text": "Разработке подлежит следующая документация: Инструкция пользователю; Инструкция программисту.",
"name": "Требования к документированию"
}
]
}
The last step is to save the filled template in JSON format in order to access the necessary sections of the technical
assignment without spending time searching for relevant information.
Preparing
Create the tree structure of sections in JSON format. The created JSON will act as a template. The required element is
the root element, so make sure that the entire structure is contained inside the children field of the root element.
{
"root element name": "root",
"children": [
*here is the sections*
]
}
Installation
To install srsparser:
pip install srsparser
To update srsparser:
pip install srsparser --upgrade
Usage
Parser
import json
from srsparser import Parser
TEMPLATE_PATH = "/path/to/template.json"
with open(TEMPLATE_PATH, encoding="UTF-8") as f:
template = json.load(f)
DOCX_PATH = "/path/to/doc1.docx"
parser = Parser(template)
structure = parser.parse_docx(DOCX_PATH)
print(structure)
LanguageProcessor
import json
from srsparser import Parser, LanguageProcessor, SectionsTree
TEMPLATE_PATH = "/path/to/template.json"
with open(TEMPLATE_PATH, encoding="UTF-8") as f:
template = json.load(f)
parser = Parser(template)
parsed_documents = []
for docx_path in ["/path/to/doc1.docx", "/path/to/doc2.docx", "/path/to/doc2.docx"]:
structure = parser.parse_docx(docx_path)
parsed_documents.append({
"name": docx_path,
"structure": structure
})
langproc = LanguageProcessor()
keywords = langproc.get_structure_keywords_pullenti(documents=parsed_documents,
document_name=parsed_documents[1]["name"],
section_name="Общие сведения")
print(keywords)
tree = SectionsTree(parsed_documents[1]["structure"])
structure_contents = tree.get_content(section_name="Характеристика объектов автоматизации")
keywords = langproc.get_keywords_pullenti(structure_contents)
print(keywords)
pairs = langproc.get_structure_tf_idf_pairs(documents=parsed_documents,
document_name=parsed_documents[0]["name"],
section_name="Требования к функциям (задачам)",
part_of_speech="NOUN",
smartirs="ntc")
print(pairs)
documents = [
"Подсистема оперативного учета должна содержать механизмы, позволяющие вводить в систему и хранить в ней "
"информацию о текущей деятельности организации.",
"Объектом автоматизации является процесс учета расчетов с работниками по оплате труда в организации, имеющей "
"специфические принципы формирования расчетных сумм, в части расчета этих сумм и сбора данных из документов "
"оперативного учета для проведения расчета.",
"Система должна сохранять работоспособность и обеспечивать восстановление своих функций при возникновении "
"внештатных ситуаций."
]
pairs = langproc.get_tf_idf_pairs(documents=documents,
part_of_speech="ADJF",
smartirs="lfc")
print(pairs)
pairs = langproc.get_structure_rationized_keywords(documents=parsed_documents,
document_name=parsed_documents[2]["name"],
section_name="Требования к системе",
smartirs="dnu")
print(pairs)
ratio = langproc.strings_similarity(documents[0], documents[1])
print(ratio)
sentences = langproc.sentenize(" ".join(documents))
print(sentences)
tokens = langproc.tokenize(text=documents[0],
part_of_speech="NOUN")
print(tokens)
words = ["Подсистема", "оперативного", "учета", "должна", "содержать", "механизмы", "позволяющие", "вводить", "систему",
"хранить", "ней", "информацию", "текущей", "деятельности", "организации"]
lemmas = langproc.lemmatize(words)
print(lemmas)
References