Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -968,8 +968,14 @@ def on_check_source_fields(description, product_name, benefits, key_message):
|
|
968 |
return check_source_fields(description, product_name, benefits, key_message)
|
969 |
|
970 |
|
971 |
-
def extract_failed_checks(checks_dict):
|
972 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
973 |
morph = pymorphy3.MorphAnalyzer()
|
974 |
|
975 |
lines = []
|
@@ -980,15 +986,152 @@ def extract_failed_checks(checks_dict):
|
|
980 |
return (p1, p2)
|
981 |
|
982 |
for rule_key, result in checks_dict.items():
|
983 |
-
# Определяем, было ли нарушение
|
984 |
if isinstance(result, tuple):
|
985 |
passed, reason = result
|
986 |
-
if not passed:
|
987 |
-
# например: "Запрещенные слова: успех"
|
988 |
lines.append(f"{rule_to_str(rule_key)}: {reason}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
989 |
elif result is False:
|
990 |
-
#
|
991 |
lines.append(f"{rule_to_str(rule_key)}: (без пояснения)")
|
|
|
992 |
return "\n".join(lines)
|
993 |
|
994 |
|
|
|
968 |
return check_source_fields(description, product_name, benefits, key_message)
|
969 |
|
970 |
|
971 |
+
def extract_failed_checks(checks_dict, exceptions_dict, context=""):
|
972 |
+
"""
|
973 |
+
Пробегаемся по результатам checks_dict.
|
974 |
+
Если есть (False, reason), выводим reason,
|
975 |
+
и при необходимости парсим reason, чтобы добавить исключения в exceptions_dict.
|
976 |
+
"""
|
977 |
+
import re
|
978 |
+
import pymorphy3
|
979 |
morph = pymorphy3.MorphAnalyzer()
|
980 |
|
981 |
lines = []
|
|
|
986 |
return (p1, p2)
|
987 |
|
988 |
for rule_key, result in checks_dict.items():
|
|
|
989 |
if isinstance(result, tuple):
|
990 |
passed, reason = result
|
991 |
+
if not passed:
|
|
|
992 |
lines.append(f"{rule_to_str(rule_key)}: {reason}")
|
993 |
+
# Пример: если rule_key == "double_verbs"
|
994 |
+
if rule_key == "double_verbs":
|
995 |
+
# Ищем "...: 2 глагола подряд: позволяет зачислять"
|
996 |
+
# Допустим reason = "Не пройдена проверка на 2 глагола подряд: позволяет зачислять"
|
997 |
+
match = re.search(r'2 глагола подряд:\s*(\S+)\s+(\S+)$', reason)
|
998 |
+
if match:
|
999 |
+
w1 = match.group(1)
|
1000 |
+
w2 = match.group(2)
|
1001 |
+
pair_lemma = lemma_pair(w1, w2)
|
1002 |
+
exceptions_dict.setdefault("double_verbs", set()).add(pair_lemma)
|
1003 |
+
|
1004 |
+
elif rule_key == "forbidden_words":
|
1005 |
+
# reason вроде: "Запрещенное слово: продукт"
|
1006 |
+
match = re.search(r'Запрещенное слово:\s*(\S+)', reason)
|
1007 |
+
if match:
|
1008 |
+
w = match.group(1)
|
1009 |
+
l, _ = lemmatize_word(w, morph)
|
1010 |
+
exceptions_dict.setdefault("forbidden_words", set()).add(l)
|
1011 |
+
|
1012 |
+
elif rule_key == "client_addressing":
|
1013 |
+
# reason вроде: "Есть приветствие: дорогая"
|
1014 |
+
match = re.search(r'приветствие:\s*(\S+)', reason, re.IGNORECASE)
|
1015 |
+
if match:
|
1016 |
+
w = match.group(1)
|
1017 |
+
l, _ = lemmatize_word(w, morph)
|
1018 |
+
exceptions_dict.setdefault("greetings", set()).add(l)
|
1019 |
+
|
1020 |
+
elif rule_key == "promises":
|
1021 |
+
# reason напр. "Не пройдена проверка: обещания => обещать"
|
1022 |
+
match = re.search(r'=>\s*(\S+)$', reason)
|
1023 |
+
if match:
|
1024 |
+
patt = match.group(1)
|
1025 |
+
exceptions_dict.setdefault("promises", set()).add(patt)
|
1026 |
+
|
1027 |
+
elif rule_key == "participles":
|
1028 |
+
# reason "Не пройдена проверка на причастие: повышающий"
|
1029 |
+
match = re.search(r'причастие:\s*(\S+)$', reason)
|
1030 |
+
if match:
|
1031 |
+
w = match.group(1)
|
1032 |
+
l, _ = lemmatize_word(w, morph)
|
1033 |
+
exceptions_dict.setdefault("participles", set()).add(l)
|
1034 |
+
|
1035 |
+
elif rule_key == "adverbial_participles":
|
1036 |
+
# reason: "деепричастие => рассматривая"
|
1037 |
+
match = re.search(r'деепричастие\s*=>\s*(\S+)$', reason)
|
1038 |
+
if match:
|
1039 |
+
w = match.group(1)
|
1040 |
+
l, _ = lemmatize_word(w, morph)
|
1041 |
+
exceptions_dict.setdefault("adverbial_participles", set()).add(l)
|
1042 |
+
|
1043 |
+
elif rule_key == "superlative_adjectives":
|
1044 |
+
# reason: "Не пройдена проверка на превосходную степень: сильнейший"
|
1045 |
+
match = re.search(r'превосходную степень:\s*(\S+)$', reason)
|
1046 |
+
if match:
|
1047 |
+
w = match.group(1)
|
1048 |
+
l, _ = lemmatize_word(w, morph)
|
1049 |
+
exceptions_dict.setdefault("superlative_adjectives", set()).add(l)
|
1050 |
+
|
1051 |
+
elif rule_key == "passive_voice":
|
1052 |
+
# reason: "Страдательный залог: построен"
|
1053 |
+
match = re.search(r'страдательный залог:\s*(\S+)$', reason)
|
1054 |
+
if match:
|
1055 |
+
w = match.group(1)
|
1056 |
+
l, _ = lemmatize_word(w, morph)
|
1057 |
+
exceptions_dict.setdefault("passive_voice", set()).add(l)
|
1058 |
+
|
1059 |
+
elif rule_key == "written_out_ordinals":
|
1060 |
+
# reason: "Порядковые числительные: десятый"
|
1061 |
+
match = re.search(r'порядковые числительные:\s*(\S+)$', reason)
|
1062 |
+
if match:
|
1063 |
+
w = match.group(1)
|
1064 |
+
exceptions_dict.setdefault("written_out_ordinals", set()).add(w)
|
1065 |
+
|
1066 |
+
elif rule_key == "repeating_conjunctions":
|
1067 |
+
# reason: "Повторяющиеся союзы: ...",
|
1068 |
+
match = re.search(r'союзы:\s*(\S+)', reason)
|
1069 |
+
|
1070 |
+
elif rule_key == "introductory_phrases":
|
1071 |
+
match = re.search(r'конструкции:\s*(\S+)$', reason)
|
1072 |
+
if match:
|
1073 |
+
phrase = match.group(1).lower()
|
1074 |
+
exceptions_dict.setdefault("introductory_phrases", set()).add(phrase)
|
1075 |
+
|
1076 |
+
elif rule_key == "amplifiers":
|
1077 |
+
# reason: "Не пройдена проверка на усилители: очень"
|
1078 |
+
match = re.search(r'усилители:\s*(\S+)$', reason)
|
1079 |
+
if match:
|
1080 |
+
w = match.group(1)
|
1081 |
+
l, _ = lemmatize_word(w, morph)
|
1082 |
+
exceptions_dict.setdefault("amplifiers", set()).add(l)
|
1083 |
+
|
1084 |
+
elif rule_key == "time_parasites":
|
1085 |
+
# reason: "Не пройдена проверка на паразитов времени: срочно"
|
1086 |
+
match = re.search(r'времени:\s*(\S+)$', reason)
|
1087 |
+
if match:
|
1088 |
+
w = match.group(1)
|
1089 |
+
l, _ = lemmatize_word(w, morph)
|
1090 |
+
exceptions_dict.setdefault("time_parasites", set()).add(l)
|
1091 |
+
|
1092 |
+
elif rule_key == "multiple_nouns":
|
1093 |
+
# reason: "Несколько существительных подряд: ('зачисление','зарплата','сотрудникам')"
|
1094 |
+
match = re.search(r'подряд:\s*(\([^)]+\))', reason)
|
1095 |
+
if match:
|
1096 |
+
chain_str = match.group(1) # "('зачисление','зарплата','сотрудникам')"
|
1097 |
+
try:
|
1098 |
+
chain_tuple = eval(chain_str)
|
1099 |
+
exceptions_dict.setdefault("multiple_nouns", set()).add(chain_tuple)
|
1100 |
+
except:
|
1101 |
+
pass
|
1102 |
+
|
1103 |
+
elif rule_key == "derived_prepositions":
|
1104 |
+
# reason: "Не пройдена проверка на производные предлоги: благодаря"
|
1105 |
+
match = re.search(r'предлоги:\s*(\S+)$', reason)
|
1106 |
+
if match:
|
1107 |
+
w = match.group(1).lower()
|
1108 |
+
exceptions_dict.setdefault("derived_prepositions", set()).add(w)
|
1109 |
+
|
1110 |
+
elif rule_key == "dates_written_out":
|
1111 |
+
# reason: "Не пройдена проверка на даты прописью: пятнадцатого июля"
|
1112 |
+
match = re.search(r'даты прописью:\s*(.+)$', reason)
|
1113 |
+
if match:
|
1114 |
+
full = match.group(1).strip()
|
1115 |
+
splitted = full.split()
|
1116 |
+
if len(splitted) == 2:
|
1117 |
+
ord_str, month_str = splitted
|
1118 |
+
l_o, _ = lemmatize_word(ord_str, morph)
|
1119 |
+
l_m, _ = lemmatize_word(month_str, morph)
|
1120 |
+
pair = (l_o, l_m)
|
1121 |
+
exceptions_dict.setdefault("dates_written_out", set()).add(pair)
|
1122 |
+
|
1123 |
+
elif rule_key == "no_word_repetitions":
|
1124 |
+
# reason: "Не пройдена проверка на повторы слов: зачисление"
|
1125 |
+
match = re.search(r'повторы слов:\s*(\S+)', reason, re.IGNORECASE)
|
1126 |
+
if match:
|
1127 |
+
rep_w = match.group(1)
|
1128 |
+
l, _ = lemmatize_word(rep_w, morph)
|
1129 |
+
exceptions_dict.setdefault("word_repetitions", set()).add(l)
|
1130 |
+
|
1131 |
elif result is False:
|
1132 |
+
# Нет причины
|
1133 |
lines.append(f"{rule_to_str(rule_key)}: (без пояснения)")
|
1134 |
+
|
1135 |
return "\n".join(lines)
|
1136 |
|
1137 |
|