Skip to content

770: gaps_title_and_text#794

Open
LapshinAE0 wants to merge 7 commits into
devfrom
770_gaps_title_and_text
Open

770: gaps_title_and_text#794
LapshinAE0 wants to merge 7 commits into
devfrom
770_gaps_title_and_text

Conversation

@LapshinAE0
Copy link
Copy Markdown
Collaborator

No description provided.

Copy link
Copy Markdown
Collaborator

@HadronCollider HadronCollider left a comment

Choose a reason for hiding this comment

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

  1. Следите за мерж-конфликтами и тестами CI - это вам необходимо их исправлять, а не мне
  2. Такой результат на любом из загруженных мною файлов - Ошибка про проверке разрывов между заголовком и текстом: sequence item 0: expected str instance, int found
    • 0 подробностей и понимания как исправить (мне, как проверяющему / разработчику, студенту и подавно)


def get_text_after_title(self, header, chars_count=40):

if 'child' not in header or not header['child']:
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.

header.get('child') превращает это в короткую строку и один вызов

Comment on lines +33 to +43
def search(self, str_1, str_2):
for page_num in range(1, self.file.page_counter() + 1):
text_on_page = self.file.pdf_file.text_on_page[page_num]

if str_1 in text_on_page and str_2 in text_on_page:
return page_num, True

if str_1 not in text_on_page and str_2 not in text_on_page:
continue

return page_num, False
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.

Для каждого встреченного заголовка вы запускаете поиск по всем страницам отчета, ещё и каждый раз извлекая по новой текст с каждой страницы pdf

  • представляете, сколько будет только эта проверка выполняться при 100 страницах, 20 заголовках и 200 студентах?

Comment on lines +37 to +41
if str_1 in text_on_page and str_2 in text_on_page:
return page_num, True

if str_1 not in text_on_page and str_2 not in text_on_page:
continue
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.

in ещё и для больших строк не самая быстрая - уменьшите 4 вызова до 2
Условно

in1 = str_1 in text_on_page
in2 = str_2 in text_on_page

Comment on lines +19 to +23
for header in headers:
if "heading" in header['style']:
page_num, perfom = self.search(header["text"], self.get_text_after_title(header))
if not perfom and page_num not in list_page_num:
list_page_num.append(page_num)
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.

Про то, что так точно делать не надо - см. комментарий к search

  1. соберите все заголовки заранее
  2. оптимизируйте обход отчета при поиске - очевидно, что если вы 10й заголовок встретили на странице 50, 11й заголовок на первых 50 (или 49) явно не появится - какой смысл смотреть весь текст на всех страницы?

full_text = ""
for child in header['child']:
if child.get('text'):
full_text += child['text'] + " "
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.

А если разделитель между двумя child['text'] не - как вы потом найдете этот же текст на странице PDF, если сформировали его не так как он выглядит на самом деле?

Comment on lines +55 to +56
if len(full_text) >= chars_count:
break
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.

Проверить длину и прервать цикл можно и без выполнения условия if child.get('text'):


class ReportGapsBetweenTitleAndTextCheck(BaseReportCriterion):
label = "Проверка разрывов между заголовком и текстом"
_description = "Не должно быть разрывов между заголовком и текстом. Когда заголовок на одной странице, а текст уже на другой."
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.

Заменить на Не должно быть висячих заголовков (заголовок и абзац текста расположены на разных страницах)

if list(list_page_num) == 0:
return answer(True, "Проверка разрывов между заголовком и текстом пройдена!")

return answer(False, f"Проверка разрывов между заголовком и текстом не пройдена! Страницы, на которых найдено несоответствие: {'\n'.join(list_page_num)}")
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.

Добавьте инструкцию / описание того как исправить

@LapshinAE0
Copy link
Copy Markdown
Collaborator Author

@HadronCollider исправил Ваши замечания. Также обнаружил, возможно, баг с парсингом файла в pdf. На одном скрине фрагмент текста в word 2021, затем сохраненный на моей системе с помощью word в формате pdf и после уже скрин pdf после после парсинга (текст "поднимается" к заголовку).
Я не уверен, корректно ли такое обрабатывание и в таких случаях мой критерий будет считаться пройденным, что в исходном документе не является правдой

pdf после обработки pdf word

@LapshinAE0 LapshinAE0 force-pushed the 770_gaps_title_and_text branch from 79564ba to 7607dbc Compare May 22, 2026 11:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants