Skip to content

Commit b663c40

Browse files
took out general logic and added a threshold value
1 parent 1e3f293 commit b663c40

File tree

3 files changed

+73
-34
lines changed

3 files changed

+73
-34
lines changed

app/main/checks/presentation_checks/was_were_check.py

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,19 @@
1-
import re
21
from ..base_check import BasePresCriterion, answer
3-
from app.nlp.is_passive_was_were_sentence import is_passive_was_were_sentece
2+
from app.nlp.is_passive_was_were_sentence import CritreriaType, generate_output_text, get_was_were_sentences
43

54
class PresWasWereCheck(BasePresCriterion):
65
label = 'Проверка на пассивные конструкции, начинающиеся с Был/Была/Было/Были, которые можно убрать без потери смысла'
76
description = ''
87
id = 'pres_was_were_check'
98

10-
def __init__(self, file_info):
9+
def __init__(self, file_info, threshold=3):
1110
super().__init__(file_info)
11+
self.threshold = threshold
1212

1313
def check(self):
14-
detected = {}
15-
for slide_index, slide_text in enumerate(self.file.get_text_from_slides()):
16-
mock_slide_text = "Было проведено исследование. Было бы здорово. Как бы было здорово. Была проделана работа. Были сделаны шаги..."
17-
sentences = re.split(r'(?<=[.!?…])\s+', mock_slide_text)
18-
for sentence_index, sentence in enumerate(sentences):
19-
if is_passive_was_were_sentece(sentence):
20-
if slide_index not in detected:
21-
detected[slide_index] = []
22-
detected[slide_index].append(f'{sentence_index+1}: {sentence}')
23-
if len(detected):
24-
result_str = 'Обнаружены конструкции (Был/Была/Было/Были), которые можно удалить без потери смысла:<br><br>'
25-
for slide_index, messages in detected.items():
26-
result_str += f'Слайд №{slide_index+1}:<br>' + '<br>'.join(messages) + '<br><br>'
14+
detected_sentences, total_sentences = get_was_were_sentences(self.file, CritreriaType.PRESENTATION)
15+
if total_sentences > self.threshold:
16+
result_str = generate_output_text(detected_sentences, CritreriaType.PRESENTATION)
2717
result_score = 0
2818
else:
2919
result_str = 'Пройдена!'

app/main/checks/report_checks/was_were_check.py

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,21 @@
1-
import re
21
from ..base_check import BaseReportCriterion, answer
3-
from app.nlp.is_passive_was_were_sentence import is_passive_was_were_sentece
2+
from app.nlp.is_passive_was_were_sentence import CritreriaType, generate_output_text, get_was_were_sentences
43

54
class ReportWasWereCheck(BaseReportCriterion):
65
label = 'Проверка на пассивные конструкции, начинающиеся с Был/Была/Было/Были, которые можно убрать без потери смысла'
76
description = ''
87
id = 'report_was_were_check'
98

10-
def __init__(self, file_info):
9+
def __init__(self, file_info, threshold=3):
1110
super().__init__(file_info)
11+
self.threshold = threshold
1212

1313
def check(self):
1414
if self.file.page_counter() < 4:
1515
return answer(False, 'В отчёте недостаточно страниц. Нечего проверять.')
16-
detected = {}
17-
for page_index, page_text in self.file.pdf_file.get_text_on_page().items():
18-
sentences = re.split(r'(?<=[.!?…])\s+', page_text)
19-
for sentence_index, sentence in enumerate(sentences):
20-
if is_passive_was_were_sentece(sentence):
21-
if page_index not in detected:
22-
detected[page_index] = []
23-
detected[page_index].append(f'{sentence_index+1}: {sentence}')
24-
if len(detected):
25-
result_str = 'Обнаружены конструкции (Был/Была/Было/Были), которые можно удалить без потери смысла:<br><br>'
26-
for page_index, messages in detected.items():
27-
result_str += f'Страница №{page_index+1}:<br>' + '<br>'.join(messages) + '<br><br>'
28-
print(f'Страница №{page_index+1}:<br>' + '<br>'.join(messages) + '<br><br>')
29-
print()
16+
detected, total_sentences = get_was_were_sentences(self.file, CritreriaType.REPORT)
17+
if total_sentences > self.threshold:
18+
result_str = generate_output_text(detected, CritreriaType.REPORT)
3019
result_score = 0
3120
else:
3221
result_str = 'Пройдена!'

app/nlp/is_passive_was_were_sentence.py

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,51 @@
11
import re
22
import pymorphy2
33
import string
4+
from enum import Enum
45

56
morph = pymorphy2.MorphAnalyzer()
67

8+
9+
class CritreriaType(Enum):
10+
REPORT=0
11+
PRESENTATION=1
12+
13+
14+
def criteria_type_to_str(type: CritreriaType):
15+
if type == CritreriaType.REPORT:
16+
return "Страница"
17+
elif type == CritreriaType.PRESENTATION:
18+
return "Слайд"
19+
else:
20+
return "Элемент"
21+
22+
def get_content_by_file(file, type: CritreriaType):
23+
if type == CritreriaType.REPORT:
24+
return file.pdf_file.get_text_on_page().items()
25+
elif type == CritreriaType.PRESENTATION:
26+
return enumerate(file.get_text_from_slides())
27+
728
def clean_word(word):
829
punct = string.punctuation.replace('-', '')
930
return word.translate(str.maketrans('', '', punct))
1031

32+
1133
def is_passive_was_were_sentece(sentence):
34+
"""
35+
Примеры плохих предложений (пассивные конструкции с "Был*" - можно убрать):
36+
- Был проведен анализ данных
37+
- Была выполнена работа по исследованию
38+
- Было принято решение о внедрении
39+
- Были получены следующие результаты
40+
- Была создана база данных
41+
42+
Примеры хороших предложений ("Был*" нельзя убрать):
43+
- Было бы здорово получить новые данные
44+
- Был сильный скачок напряжения
45+
- Были времена, когда это казалось невозможным
46+
- Был студентом университета три года назад
47+
- Была программистом до выхода на пенсию
48+
"""
1249
first_words = re.split(r'\s+', sentence.strip(), maxsplit=2)
1350
if len(first_words) < 2:
1451
return False
@@ -23,4 +60,27 @@ def is_passive_was_were_sentece(sentence):
2360
second_word_parsed = morph.parse(second_word)[0]
2461
return ('PRTS' in second_word_parsed.tag and
2562
'pssv' in second_word_parsed.tag)
26-
return False
63+
return False
64+
65+
66+
def generate_output_text(detected_senteces, type: CritreriaType):
67+
output = 'Обнаружены конструкции (Был/Была/Было/Были), которые можно удалить без потери смысла:<br><br>'
68+
for index, messages in detected_senteces.items():
69+
output_type = criteria_type_to_str(type)
70+
output += f'{output_type}{index + 1}: <br>' + '<br>'.join(messages) + '<br><br>'
71+
return output
72+
73+
74+
def get_was_were_sentences(file, type: CritreriaType):
75+
detected = {}
76+
total_sentences = 0
77+
for page_index, page_text in get_content_by_file(file, type):
78+
sentences = re.split(r'(?<=[.!?…])\s+', page_text)
79+
for sentence_index, sentence in enumerate(sentences):
80+
if is_passive_was_were_sentece(sentence):
81+
total_sentences += 1
82+
if page_index not in detected:
83+
detected[page_index] = []
84+
truncated_sentence = sentence[:30] + '...' if len(sentence) > 30 else sentence
85+
detected[page_index].append(f'{sentence_index+1}: {truncated_sentence}')
86+
return detected, total_sentences

0 commit comments

Comments
 (0)