770: gaps_title_and_text#794
Conversation
HadronCollider
left a comment
There was a problem hiding this comment.
- Следите за мерж-конфликтами и тестами CI - это вам необходимо их исправлять, а не мне
- Такой результат на любом из загруженных мною файлов -
Ошибка про проверке разрывов между заголовком и текстом: 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']: |
There was a problem hiding this comment.
header.get('child') превращает это в короткую строку и один вызов
| 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 |
There was a problem hiding this comment.
Для каждого встреченного заголовка вы запускаете поиск по всем страницам отчета, ещё и каждый раз извлекая по новой текст с каждой страницы pdf
- представляете, сколько будет только эта проверка выполняться при 100 страницах, 20 заголовках и 200 студентах?
| 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 |
There was a problem hiding this comment.
in ещё и для больших строк не самая быстрая - уменьшите 4 вызова до 2
Условно
in1 = str_1 in text_on_page
in2 = str_2 in text_on_page
| 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) |
There was a problem hiding this comment.
Про то, что так точно делать не надо - см. комментарий к search
- соберите все заголовки заранее
- оптимизируйте обход отчета при поиске - очевидно, что если вы 10й заголовок встретили на странице 50, 11й заголовок на первых 50 (или 49) явно не появится - какой смысл смотреть весь текст на всех страницы?
| full_text = "" | ||
| for child in header['child']: | ||
| if child.get('text'): | ||
| full_text += child['text'] + " " |
There was a problem hiding this comment.
А если разделитель между двумя child['text'] не - как вы потом найдете этот же текст на странице PDF, если сформировали его не так как он выглядит на самом деле?
| if len(full_text) >= chars_count: | ||
| break |
There was a problem hiding this comment.
Проверить длину и прервать цикл можно и без выполнения условия if child.get('text'):
|
|
||
| class ReportGapsBetweenTitleAndTextCheck(BaseReportCriterion): | ||
| label = "Проверка разрывов между заголовком и текстом" | ||
| _description = "Не должно быть разрывов между заголовком и текстом. Когда заголовок на одной странице, а текст уже на другой." |
There was a problem hiding this comment.
Заменить на Не должно быть висячих заголовков (заголовок и абзац текста расположены на разных страницах)
| if list(list_page_num) == 0: | ||
| return answer(True, "Проверка разрывов между заголовком и текстом пройдена!") | ||
|
|
||
| return answer(False, f"Проверка разрывов между заголовком и текстом не пройдена! Страницы, на которых найдено несоответствие: {'\n'.join(list_page_num)}") |
There was a problem hiding this comment.
Добавьте инструкцию / описание того как исправить
|
@HadronCollider исправил Ваши замечания. Также обнаружил, возможно, баг с парсингом файла в pdf. На одном скрине фрагмент текста в word 2021, затем сохраненный на моей системе с помощью word в формате pdf и после уже скрин pdf после после парсинга (текст "поднимается" к заголовку).
|
79564ba to
7607dbc
Compare



No description provided.