Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/main/check_packs/pack_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
["water_in_the_text_check"],
["report_task_tracker"],
["report_was_were_check"],
["references_in_chapter_check"],
]

DEFAULT_TYPE = 'pres'
Expand Down
96 changes: 96 additions & 0 deletions app/main/checks/report_checks/lit_ref_in_spec_chapter.py

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Лучше не смешивать общую логику с логикой по аннотации, а разделить поведение критерия в целом (оставив возможность параметризации)
0) общая задача подсчет количества ссылок в конкретном разделе

  1. оценка кол-ва по порогам (пороги задаются целыми числами)
    • если максимальный порог = 0 -> в разделе не должно быть ссылок на литературу (пишем соответствующий фидбек)
      • поскольку в целом, не только для аннотации может быть введено ограничение/запрет на ссылки
    • иначе - обычное поведение (оцениванием вхождение в допустимый диапазон)

Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
import re
from .style_check_settings import StyleCheckSettings
from ..base_check import BaseReportCriterion, answer


class LitRefInChapter(BaseReportCriterion):
label = "Проверка количества ссылок на источники в определенном разделе"
description = ''
id = 'references_in_chapter_check'

def __init__(self, file_info, min_ref_value=0.5, max_ref_value=1, headers_map=None):
super().__init__(file_info)
self.chapters_for_lit_ref = {}
self.lit_ref_count = {}
self.min_ref_value = min_ref_value
self.max_ref_value = max_ref_value
if headers_map:
self.config = headers_map
else:
self.config = 'VKR_HEADERS' if (self.file_type['report_type'] == 'VKR') else 'LR_HEADERS'

def late_init(self):
self.chapters = self.file.make_chapters(self.file_type['report_type'])
self.headers_main = self.file.get_main_headers(self.file_type['report_type'])
if self.headers_main in StyleCheckSettings.CONFIGS.get(self.config):
self.chapters_for_lit_ref = StyleCheckSettings.CONFIGS.get(self.config)[self.headers_main][
'chapters_for_lit_ref']
else:
if 'any_header' in StyleCheckSettings.CONFIGS.get(self.config):
self.chapters_for_lit_ref = StyleCheckSettings.CONFIGS.get(self.config)['any_header'][
'chapters_for_lit_ref']

def check(self):
if self.file.page_counter() < 4:
return answer(False, "В отчете недостаточно страниц. Нечего проверять.")
self.late_init()
if not self.chapters_for_lit_ref:
return answer(True, 'Для загруженной работы данная проверка не предусмотрена.')
result = []
result_str = f'Пройдена!'
currant_head = ''
chapter_for_check = 0
ref_in_annotation = False
for chapter in self.chapters:
header = chapter["text"].lower()
if currant_head:
self.lit_ref_count[currant_head].append(chapter['number'])
if currant_head in self.chapters_for_lit_ref:
chapter_for_check += 1
ref_count = len(self.search_references(self.lit_ref_count[currant_head][0],
self.lit_ref_count[currant_head][1]))
if ref_count > self.chapters_for_lit_ref[currant_head][1] or ref_count < \
self.chapters_for_lit_ref[currant_head][0]:
result.append(f'«{currant_head[0].upper() + currant_head[1:]}» : {ref_count}')
if currant_head == 'аннотация' or currant_head == 'annotation':
ref_in_annotation = True
self.lit_ref_count[header] = [chapter['number'], ]
currant_head = header
if result:
if chapter_for_check > 0:
ref_value = round((chapter_for_check - len(result)) / chapter_for_check, 2)
else:
ref_value = 1.0
result_str = (f'Доля соответствия количества ссылок необходимому в требуемых разделах равна {ref_value}'
f'<br><b>Количество ссылок на источники не удовлетворяет допустимому в следующих разделах:</b> <br> {"<br>".join(res for res in result)}'
f'<br><b> Допустимые пороги количества ссылок:</b> <br>'
f'{"<br>".join(f"«{chapter.capitalize()}»: от {limit[0]} до {limit[1]}" for chapter, limit in self.chapters_for_lit_ref.items())}')
result_str += '<b>В аннотации не должно быть ссылок на литературу.</b>' if ref_in_annotation else ''
if ref_value >= self.max_ref_value and not ref_in_annotation:
return answer(1, f'Пройдена!')
elif ref_value >= self.min_ref_value and not ref_in_annotation:
return answer(ref_value, f'Частично пройдена! {result_str}')
else:
return answer(0, f'Не пройдена! {result_str}')
elif ref_in_annotation:
return answer(0, 'В аннотации не должно быть ссылок на литературу.')
else:
return answer(1, result_str)

def search_references(self, start_par, end_par):
array_of_references = []
for i in range(start_par, end_par):
if isinstance(self.file.paragraphs[i], str):
detected_references = re.findall(r'\[[\d \-,]+\]', self.file.paragraphs[i])
else:
detected_references = re.findall(r'\[[\d \-,]+\]', self.file.paragraphs[i].paragraph_text)
if detected_references:
for reference in detected_references:
for one_part in re.split(r'[\[\],]', reference):
if re.match(r'\d+[ \-]+\d+', one_part):
start, end = re.split(r'[ -]+', one_part)
for k in range(int(start), int(end) + 1):
array_of_references.append((k))
elif one_part != '':
array_of_references.append(int(one_part))
return array_of_references
8 changes: 7 additions & 1 deletion app/main/checks/report_checks/style_check_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ class StyleCheckSettings:
"style": HEADER_1_STYLE,
"docx_style": ["heading 2"],
"headers": ["ОПРЕДЕЛЕНИЯ, ОБОЗНАЧЕНИЯ И СОКРАЩЕНИЯ", "ВВЕДЕНИЕ", "ЗАКЛЮЧЕНИЕ", "СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ"],
"chapters_for_lit_ref": {},
"unify_regex": None,
"regex": HEADER_REGEX,
"banned_words": STD_BANNED_WORDS,
Expand Down Expand Up @@ -195,7 +196,9 @@ class StyleCheckSettings:
"Методы обоснования",
"Статья",
],
"chapters_for_lit_ref": {},
"header_for_report_section_component": "Поставленная цель и задачи",
"headers_for_lit_count": [],
"unify_regex": None,
"regex": HEADER_REGEX,
"banned_words": STD_BANNED_WORDS,
Expand All @@ -211,7 +214,9 @@ class StyleCheckSettings:
"Характеристика выводов",
"Статья",
],
"chapters_for_lit_ref": {},
"header_for_report_section_component": "",
"headers_for_lit_count": [],
"unify_regex": None,
"regex": HEADER_REGEX,
"banned_words": STD_BANNED_WORDS,
Expand Down Expand Up @@ -250,11 +255,11 @@ class StyleCheckSettings:
"docx_style": ["heading 2"],
"headers": ["Принцип отбора аналогов",
"Критерии сравнения аналогов",
"Таблица сравнения аналогов",
"Выводы по итогам сравнения",
"Выбор метода решения",
"Список использованных источников"
],
"chapters_for_lit_ref": {},
"unify_regex": None,
"regex": HEADER_REGEX,
"banned_words": STD_BANNED_WORDS,
Expand All @@ -275,6 +280,7 @@ class StyleCheckSettings:
"Заключение",
"Список использованных источников"
],
"chapters_for_lit_ref": {},
"unify_regex": None,
"regex": HEADER_REGEX,
"banned_words": STD_BANNED_WORDS,
Expand Down
Loading