Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -42,6 +42,36 @@ token = os.getenv('GITHUB_TOKEN')
|
|
42 |
repo = "fruitpicker01/Storage_Anastasia"
|
43 |
current_request_index = -1
|
44 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
45 |
def load_dropdown_data(file_path, sheet_name, column_name):
|
46 |
data = pd.read_excel(file_path, sheet_name=sheet_name)
|
47 |
return data[column_name].dropna().unique().tolist()
|
@@ -1244,6 +1274,21 @@ def extract_failed_checks(checks_dict, exceptions_dict, context=""):
|
|
1244 |
print(f"[DEBUG] Adding word repetition exception: rep_w={rep_w}, lemma={l}")
|
1245 |
exceptions_dict.setdefault("word_repetitions", set()).add(l)
|
1246 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1247 |
elif result is False:
|
1248 |
# Нет причины
|
1249 |
lines.append(f"{rule_to_str(rule_key)}: (без пояснения)")
|
@@ -1272,6 +1317,8 @@ def rule_to_str(rule_key):
|
|
1272 |
"compound_sentences": "Сложноподчиненные предложения",
|
1273 |
"dates_written_out": "Даты прописью",
|
1274 |
"word_repetitions": "Повторы слов",
|
|
|
|
|
1275 |
}
|
1276 |
return translation.get(rule_key, rule_key)
|
1277 |
|
@@ -1823,6 +1870,44 @@ def check_no_dates_written_out(message, exceptions=None):
|
|
1823 |
return False, f"Не пройдена проверка на даты прописью: {found.group(0)}"
|
1824 |
return True
|
1825 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1826 |
# Доп правило. Повторы слов
|
1827 |
|
1828 |
def check_word_repetitions(message, key_message, exceptions=None):
|
@@ -1868,7 +1953,8 @@ CRITICAL_CHECKS = [
|
|
1868 |
"promises",
|
1869 |
"subordinate_clauses_chain",
|
1870 |
"introductory_phrases",
|
1871 |
-
"dates_written_out"
|
|
|
1872 |
]
|
1873 |
|
1874 |
NON_CRITICAL_CHECKS = [
|
@@ -1884,7 +1970,8 @@ NON_CRITICAL_CHECKS = [
|
|
1884 |
"multiple_nouns",
|
1885 |
"derived_prepositions",
|
1886 |
"compound_sentences",
|
1887 |
-
"word_repetitions",
|
|
|
1888 |
]
|
1889 |
|
1890 |
def run_checks_critical_and_non_critical(message: str, key_message: str) -> (bool, list):
|
@@ -2044,6 +2131,8 @@ def perform_checks(message, key_message, exceptions_dict=None):
|
|
2044 |
"compound_sentences": safe_check(lambda msg, km: check_no_compound_sentences(msg, exceptions_dict), message),
|
2045 |
"dates_written_out": safe_check(lambda msg, km: check_no_dates_written_out(msg, exceptions_dict), message),
|
2046 |
"word_repetitions": safe_check(lambda msg, km: check_word_repetitions(msg, km, exceptions_dict), message, key_message),
|
|
|
|
|
2047 |
}
|
2048 |
|
2049 |
print(f"[DEBUG perform_checks] message={repr(message)} key_message={repr(key_message)}\n"
|
@@ -2074,7 +2163,9 @@ def format_checks(checks):
|
|
2074 |
"derived_prepositions": "Производные предлоги",
|
2075 |
"compound_sentences": "Сложноподчиненные предложения",
|
2076 |
"dates_written_out": "Даты прописью",
|
2077 |
-
"word_repetitions": "Повторы слов"
|
|
|
|
|
2078 |
}
|
2079 |
|
2080 |
critical_lines = []
|
|
|
42 |
repo = "fruitpicker01/Storage_Anastasia"
|
43 |
current_request_index = -1
|
44 |
|
45 |
+
ABSTRACT_PHRASES = [
|
46 |
+
"отличный выбор",
|
47 |
+
"зарабатывай больше",
|
48 |
+
"отличная возможность",
|
49 |
+
"уникальная возможность",
|
50 |
+
"специальная скидка",
|
51 |
+
"без лишних формальностей",
|
52 |
+
"быстро и удобно в любое время",
|
53 |
+
"максимальная экономия",
|
54 |
+
"уверенный старт",
|
55 |
+
"простое управление",
|
56 |
+
]
|
57 |
+
|
58 |
+
CLICHE_PHRASES = [
|
59 |
+
"источник гордости",
|
60 |
+
"откройте двери",
|
61 |
+
"мир бесконечных возможностей",
|
62 |
+
"ваш успех начинается здесь",
|
63 |
+
"максимальная выгода",
|
64 |
+
"гибкие условия",
|
65 |
+
"наша забота",
|
66 |
+
"что может быть проще",
|
67 |
+
"заслуживает лучшего",
|
68 |
+
"на полную мощность",
|
69 |
+
"не упустите свой шанс на развитие",
|
70 |
+
"не упусти возможность",
|
71 |
+
"не упусти свой шанс",
|
72 |
+
"спеши",
|
73 |
+
]
|
74 |
+
|
75 |
def load_dropdown_data(file_path, sheet_name, column_name):
|
76 |
data = pd.read_excel(file_path, sheet_name=sheet_name)
|
77 |
return data[column_name].dropna().unique().tolist()
|
|
|
1274 |
print(f"[DEBUG] Adding word repetition exception: rep_w={rep_w}, lemma={l}")
|
1275 |
exceptions_dict.setdefault("word_repetitions", set()).add(l)
|
1276 |
|
1277 |
+
elif rule_key == "abstract_phrases":
|
1278 |
+
# reason например: "Найдена абстрактная фраза: «отличный выбор»"
|
1279 |
+
match = re.search(r'абстрактная фраза:\s*«([^»]+)»', reason, re.IGNORECASE)
|
1280 |
+
if match:
|
1281 |
+
found_phrase = match.group(1).lower()
|
1282 |
+
exceptions_dict.setdefault("abstract_phrases", set()).add(found_phrase)
|
1283 |
+
|
1284 |
+
elif rule_key == "cliche":
|
1285 |
+
# reason например: "Найдено клише: «на полную мощность»"
|
1286 |
+
match = re.search(r'Найдено клише:\s*«([^»]+)»', reason, re.IGNORECASE)
|
1287 |
+
if match:
|
1288 |
+
found_phrase = match.group(1).lower()
|
1289 |
+
exceptions_dict.setdefault("cliche", set()).add(found_phrase)
|
1290 |
+
|
1291 |
+
|
1292 |
elif result is False:
|
1293 |
# Нет причины
|
1294 |
lines.append(f"{rule_to_str(rule_key)}: (без пояснения)")
|
|
|
1317 |
"compound_sentences": "Сложноподчиненные предложения",
|
1318 |
"dates_written_out": "Даты прописью",
|
1319 |
"word_repetitions": "Повторы слов",
|
1320 |
+
"abstract_phrases": "Абстракции",
|
1321 |
+
"cliche": "Клише"
|
1322 |
}
|
1323 |
return translation.get(rule_key, rule_key)
|
1324 |
|
|
|
1870 |
return False, f"Не пройдена проверка на даты прописью: {found.group(0)}"
|
1871 |
return True
|
1872 |
|
1873 |
+
# Проверка на абстракции
|
1874 |
+
def check_abstract_phrases(message, exceptions=None):
|
1875 |
+
"""
|
1876 |
+
Критическая проверка на «абстрактные фразы» (ABSTRACT_PHRASES).
|
1877 |
+
Если хоть одна из них найдена в тексте (регистронезависимо),
|
1878 |
+
возвращаем (False, причина).
|
1879 |
+
"""
|
1880 |
+
if not exceptions:
|
1881 |
+
exceptions = {}
|
1882 |
+
allowed_phrases = exceptions.get("abstract_phrases", set())
|
1883 |
+
|
1884 |
+
for phrase in ABSTRACT_PHRASES:
|
1885 |
+
# если этой фразы нет в исключениях
|
1886 |
+
if phrase.lower() not in allowed_phrases:
|
1887 |
+
# проверяем, содержится ли она в сообщении
|
1888 |
+
if phrase.lower() in message.lower():
|
1889 |
+
return (False, f"Найдена абстрактная фраза: «{phrase}»")
|
1890 |
+
|
1891 |
+
return True # если ничего не нашли
|
1892 |
+
|
1893 |
+
# Проверка на клише
|
1894 |
+
def check_cliche(message, exceptions=None):
|
1895 |
+
"""
|
1896 |
+
Некритическая проверка на «клише» (CLICHE_PHRASES).
|
1897 |
+
Аналогично, если находим — (False, причина).
|
1898 |
+
"""
|
1899 |
+
if not exceptions:
|
1900 |
+
exceptions = {}
|
1901 |
+
allowed_phrases = exceptions.get("cliche", set())
|
1902 |
+
|
1903 |
+
for phrase in CLICHE_PHRASES:
|
1904 |
+
if phrase.lower() not in allowed_phrases:
|
1905 |
+
if phrase.lower() in message.lower():
|
1906 |
+
return (False, f"Найдено клише: «{phrase}»")
|
1907 |
+
|
1908 |
+
return True
|
1909 |
+
|
1910 |
+
|
1911 |
# Доп правило. Повторы слов
|
1912 |
|
1913 |
def check_word_repetitions(message, key_message, exceptions=None):
|
|
|
1953 |
"promises",
|
1954 |
"subordinate_clauses_chain",
|
1955 |
"introductory_phrases",
|
1956 |
+
"dates_written_out",
|
1957 |
+
"abstract_phrases"
|
1958 |
]
|
1959 |
|
1960 |
NON_CRITICAL_CHECKS = [
|
|
|
1970 |
"multiple_nouns",
|
1971 |
"derived_prepositions",
|
1972 |
"compound_sentences",
|
1973 |
+
"word_repetitions",
|
1974 |
+
"cliche"
|
1975 |
]
|
1976 |
|
1977 |
def run_checks_critical_and_non_critical(message: str, key_message: str) -> (bool, list):
|
|
|
2131 |
"compound_sentences": safe_check(lambda msg, km: check_no_compound_sentences(msg, exceptions_dict), message),
|
2132 |
"dates_written_out": safe_check(lambda msg, km: check_no_dates_written_out(msg, exceptions_dict), message),
|
2133 |
"word_repetitions": safe_check(lambda msg, km: check_word_repetitions(msg, km, exceptions_dict), message, key_message),
|
2134 |
+
"abstract_phrases": safe_check(lambda msg: check_abstract_phrases(msg, exceptions_dict), message),
|
2135 |
+
"cliche": safe_check(lambda msg: check_cliche(msg, exceptions_dict), message)
|
2136 |
}
|
2137 |
|
2138 |
print(f"[DEBUG perform_checks] message={repr(message)} key_message={repr(key_message)}\n"
|
|
|
2163 |
"derived_prepositions": "Производные предлоги",
|
2164 |
"compound_sentences": "Сложноподчиненные предложения",
|
2165 |
"dates_written_out": "Даты прописью",
|
2166 |
+
"word_repetitions": "Повторы слов",
|
2167 |
+
"abstract_phrases": "Абстракции",
|
2168 |
+
"cliche": "Клише"
|
2169 |
}
|
2170 |
|
2171 |
critical_lines = []
|