Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -558,6 +558,7 @@ final_prompt_2_state = gr.State("")
|
|
558 |
def generate_personalized_sms_wrapper(selected_product, description, product_name, benefits, key_message,
|
559 |
gender, generation, psychotype, business_stage, industry, opf,
|
560 |
chosen_approach, prompt_1, prompt_2):
|
|
|
561 |
if "Для формирования промпта выберите хотя бы один личный персональный параметр" in prompt_1 or chosen_approach == "Подход не найден для выбранных параметров.":
|
562 |
gr.Warning("Задайте хотя бы один личный персональный параметр для определения подхода")
|
563 |
return "", "", "", ""
|
@@ -576,12 +577,12 @@ def generate_personalized_sms_wrapper(selected_product, description, product_nam
|
|
576 |
|
577 |
# Выполняем проверки sms_1
|
578 |
cut_sms_1 = cut_message(sms_1)
|
579 |
-
checks_1 = perform_checks(cut_sms_1, key_message)
|
580 |
checks_formatted_1 = format_checks(checks_1)
|
581 |
|
582 |
# Выполняем проверки sms_2
|
583 |
cut_sms_2 = cut_message(sms_2)
|
584 |
-
checks_2 = perform_checks(cut_sms_2, key_message)
|
585 |
checks_formatted_2 = format_checks(checks_2)
|
586 |
|
587 |
personalization_params = [gender, generation, psychotype, business_stage, industry, opf]
|
@@ -1107,6 +1108,17 @@ def extract_failed_checks(checks_dict, exceptions_dict, context=""):
|
|
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)
|
@@ -1601,7 +1613,17 @@ def check_no_derived_prepositions(message, exceptions=None):
|
|
1601 |
|
1602 |
# 19. Сложноподчиненные предложения
|
1603 |
|
1604 |
-
def check_no_compound_sentences(message):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1605 |
subordinating_conjunctions = [
|
1606 |
r'\bкогда\b', r'\bкак только\b', r'\bпока\b', r'\bпосле того как\b',
|
1607 |
r'\bпотому что\b', r'\bтак как\b', r'\bоттого что\b', r'\bблагодаря тому что\b',
|
@@ -1609,11 +1631,19 @@ def check_no_compound_sentences(message):
|
|
1609 |
r'\bхотя\b', r'\bнесмотря на то что\b', r'\bкак\b', r'\bбудто\b', r'\bсловно\b', r'\bкак будто\b'
|
1610 |
]
|
1611 |
|
1612 |
-
#
|
|
|
|
|
1613 |
for pattern in subordinating_conjunctions:
|
1614 |
-
|
1615 |
-
|
1616 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
1617 |
return True
|
1618 |
|
1619 |
|
@@ -1714,30 +1744,40 @@ def safe_check(func, message, key_message=None):
|
|
1714 |
traceback.print_exc() # выведет traceback
|
1715 |
return None
|
1716 |
|
1717 |
-
def perform_checks(message, key_message):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1718 |
checks = {
|
1719 |
-
"forbidden_words": safe_check(check_forbidden_words, message),
|
1720 |
-
"client_addressing": safe_check(check_no_greeting, message),
|
1721 |
-
"promises": safe_check(check_no_promises, message),
|
1722 |
-
"double_verbs": safe_check(check_no_double_verbs, message),
|
1723 |
-
"participles": safe_check(check_no_participles, message),
|
1724 |
-
"adverbial_participles": safe_check(check_no_adverbial_participles, message),
|
1725 |
-
"superlative_adjectives": safe_check(check_no_superlative_adjectives, message),
|
1726 |
-
"passive_voice": safe_check(check_no_passive_voice, message),
|
1727 |
-
"written_out_ordinals": safe_check(check_no_written_out_ordinals, message),
|
1728 |
"subordinate_clauses_chain": safe_check(check_no_subordinate_clauses_chain, message),
|
1729 |
-
"repeating_conjunctions": safe_check(check_no_repeating_conjunctions, message),
|
1730 |
-
"introductory_phrases": safe_check(check_no_introductory_phrases, message),
|
1731 |
-
"amplifiers": safe_check(check_no_amplifiers, message),
|
1732 |
-
"time_parasites": safe_check(check_no_time_parasites, message),
|
1733 |
-
"multiple_nouns": safe_check(check_no_multiple_nouns, message),
|
1734 |
-
"derived_prepositions": safe_check(check_no_derived_prepositions, message),
|
1735 |
-
"compound_sentences": safe_check(check_no_compound_sentences, message),
|
1736 |
-
"dates_written_out": safe_check(check_no_dates_written_out, message),
|
1737 |
-
"no_word_repetitions": safe_check(check_no_word_repetitions, message, key_message),
|
1738 |
}
|
1739 |
return checks
|
1740 |
-
|
1741 |
def format_checks(checks):
|
1742 |
|
1743 |
translation = {
|
|
|
558 |
def generate_personalized_sms_wrapper(selected_product, description, product_name, benefits, key_message,
|
559 |
gender, generation, psychotype, business_stage, industry, opf,
|
560 |
chosen_approach, prompt_1, prompt_2):
|
561 |
+
source_report, exceptions_dict = check_source_fields(description, product_name, benefits, key_message)
|
562 |
if "Для формирования промпта выберите хотя бы один личный персональный параметр" in prompt_1 or chosen_approach == "Подход не найден для выбранных параметров.":
|
563 |
gr.Warning("Задайте хотя бы один личный персональный параметр для определения подхода")
|
564 |
return "", "", "", ""
|
|
|
577 |
|
578 |
# Выполняем проверки sms_1
|
579 |
cut_sms_1 = cut_message(sms_1)
|
580 |
+
checks_1 = perform_checks(cut_sms_1, key_message, exceptions_dict)
|
581 |
checks_formatted_1 = format_checks(checks_1)
|
582 |
|
583 |
# Выполняем проверки sms_2
|
584 |
cut_sms_2 = cut_message(sms_2)
|
585 |
+
checks_2 = perform_checks(cut_sms_2, key_message, exceptions_dict)
|
586 |
checks_formatted_2 = format_checks(checks_2)
|
587 |
|
588 |
personalization_params = [gender, generation, psychotype, business_stage, industry, opf]
|
|
|
1108 |
w = match.group(1).lower()
|
1109 |
exceptions_dict.setdefault("derived_prepositions", set()).add(w)
|
1110 |
|
1111 |
+
elif rule_key == "compound_sentences":
|
1112 |
+
# reason может выглядеть так:
|
1113 |
+
# "Не пройдена проверка: Сложноподчиненные предложения: как только"
|
1114 |
+
# Разделим по двоеточию:
|
1115 |
+
splitted = reason.split(': ', 2)
|
1116 |
+
# splitted может быть ["Не пройдена проверка", "Сложноподчиненные предложения", "как только"]
|
1117 |
+
if len(splitted) == 3:
|
1118 |
+
raw_substring = splitted[2].strip()
|
1119 |
+
# Добавляем сырую подстроку (без лемматизации) в исключения
|
1120 |
+
exceptions_dict["compound_sentences"].add(raw_substring)
|
1121 |
+
|
1122 |
elif rule_key == "dates_written_out":
|
1123 |
# reason: "Не пройдена проверка на даты прописью: пятнадцатого июля"
|
1124 |
match = re.search(r'даты прописью:\s*(.+)$', reason)
|
|
|
1613 |
|
1614 |
# 19. Сложноподчиненные предложения
|
1615 |
|
1616 |
+
def check_no_compound_sentences(message, exceptions=None):
|
1617 |
+
"""
|
1618 |
+
Проверка на отсутствие сложноподчиненных предложений.
|
1619 |
+
Если обнаружен союз/слово, которое есть в exceptions["compound_sentences"],
|
1620 |
+
— НЕ считаем ошибкой.
|
1621 |
+
Если нет в исключениях, считаем ошибкой.
|
1622 |
+
"""
|
1623 |
+
if exceptions is None:
|
1624 |
+
exceptions = {}
|
1625 |
+
|
1626 |
+
# Список союзов/фраз, по которым мы определяем сложноподчинённость
|
1627 |
subordinating_conjunctions = [
|
1628 |
r'\bкогда\b', r'\bкак только\b', r'\bпока\b', r'\bпосле того как\b',
|
1629 |
r'\bпотому что\b', r'\bтак как\b', r'\bоттого что\b', r'\bблагодаря тому что\b',
|
|
|
1631 |
r'\bхотя\b', r'\bнесмотря на то что\b', r'\bкак\b', r'\bбудто\b', r'\bсловно\b', r'\bкак будто\b'
|
1632 |
]
|
1633 |
|
1634 |
+
# Собираем «разрешённые» фразы (из исключений) – это сырые строки:
|
1635 |
+
allowed_raw_phrases = exceptions.get("compound_sentences", set())
|
1636 |
+
|
1637 |
for pattern in subordinating_conjunctions:
|
1638 |
+
# Находим все вхождения союз��в
|
1639 |
+
matches = re.finditer(pattern, message, re.IGNORECASE)
|
1640 |
+
for m in matches:
|
1641 |
+
raw_substring = m.group(0) # «сырая» найденная строка
|
1642 |
+
# Если substring НЕ в наших исключениях:
|
1643 |
+
# (сравниваем без учёта регистра — можно .lower() )
|
1644 |
+
if raw_substring.lower() not in (s.lower() for s in allowed_raw_phrases):
|
1645 |
+
return (False, f'Не пройдена проверка: Сложноподчиненные предложения: {raw_substring}')
|
1646 |
+
|
1647 |
return True
|
1648 |
|
1649 |
|
|
|
1744 |
traceback.print_exc() # выведет traceback
|
1745 |
return None
|
1746 |
|
1747 |
+
def perform_checks(message, key_message, exceptions_dict=None):
|
1748 |
+
"""
|
1749 |
+
Запускает все проверки для данного message.
|
1750 |
+
exceptions_dict - словарь исключений:
|
1751 |
+
{
|
1752 |
+
"compound_sentences": set(...),
|
1753 |
+
"double_verbs": set(...),
|
1754 |
+
...
|
1755 |
+
}
|
1756 |
+
и т.д.
|
1757 |
+
"""
|
1758 |
checks = {
|
1759 |
+
"forbidden_words": safe_check(lambda msg, km: check_forbidden_words(msg, exceptions_dict), message),
|
1760 |
+
"client_addressing": safe_check(lambda msg, km: check_no_greeting(msg, exceptions_dict), message),
|
1761 |
+
"promises": safe_check(lambda msg, km: check_no_promises(msg, exceptions_dict), message),
|
1762 |
+
"double_verbs": safe_check(lambda msg, km: check_no_double_verbs(msg, exceptions_dict), message),
|
1763 |
+
"participles": safe_check(lambda msg, km: check_no_participles(msg, exceptions_dict), message),
|
1764 |
+
"adverbial_participles": safe_check(lambda msg, km: check_no_adverbial_participles(msg, exceptions_dict), message),
|
1765 |
+
"superlative_adjectives": safe_check(lambda msg, km: check_no_superlative_adjectives(msg, exceptions_dict), message),
|
1766 |
+
"passive_voice": safe_check(lambda msg, km: check_no_passive_voice(msg, exceptions_dict), message),
|
1767 |
+
"written_out_ordinals": safe_check(lambda msg, km: check_no_written_out_ordinals(msg, exceptions_dict), message),
|
1768 |
"subordinate_clauses_chain": safe_check(check_no_subordinate_clauses_chain, message),
|
1769 |
+
"repeating_conjunctions": safe_check(lambda msg, km: check_no_repeating_conjunctions(msg, exceptions_dict), message),
|
1770 |
+
"introductory_phrases": safe_check(lambda msg, km: check_no_introductory_phrases(msg, exceptions_dict), message),
|
1771 |
+
"amplifiers": safe_check(lambda msg, km: check_no_amplifiers(msg, exceptions_dict), message),
|
1772 |
+
"time_parasites": safe_check(lambda msg, km: check_no_time_parasites(msg, exceptions_dict), message),
|
1773 |
+
"multiple_nouns": safe_check(lambda msg, km: check_no_multiple_nouns(msg, exceptions_dict), message),
|
1774 |
+
"derived_prepositions": safe_check(lambda msg, km: check_no_derived_prepositions(msg, exceptions_dict), message),
|
1775 |
+
"compound_sentences": safe_check(lambda msg, km: check_no_compound_sentences(msg, exceptions_dict), message),
|
1776 |
+
"dates_written_out": safe_check(lambda msg, km: check_no_dates_written_out(msg, exceptions_dict), message),
|
1777 |
+
"no_word_repetitions": safe_check(lambda msg, km: check_no_word_repetitions(msg, km, exceptions_dict), message, key_message),
|
1778 |
}
|
1779 |
return checks
|
1780 |
+
|
1781 |
def format_checks(checks):
|
1782 |
|
1783 |
translation = {
|