Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -21,6 +21,10 @@ from sklearn.feature_extraction.text import TfidfVectorizer
|
|
21 |
from sklearn.metrics.pairwise import cosine_similarity
|
22 |
from sentence_transformers import SentenceTransformer, util
|
23 |
import numpy as np
|
|
|
|
|
|
|
|
|
24 |
|
25 |
|
26 |
morph = pymorphy2.MorphAnalyzer()
|
@@ -30,6 +34,7 @@ openai_api_key = os.getenv('GPT_KEY')
|
|
30 |
gc_key = os.getenv('GC_KEY')
|
31 |
token = os.getenv('GITHUB_TOKEN')
|
32 |
TOGETHER_API_KEY = os.getenv('TOGETHER_API_KEY')
|
|
|
33 |
|
34 |
# Инициализация клиента для Together
|
35 |
client = Together(api_key=TOGETHER_API_KEY)
|
@@ -2055,6 +2060,77 @@ def check_no_word_repetitions(message):
|
|
2055 |
# Если мы дошли до этой точки, повторов не было
|
2056 |
return True
|
2057 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2058 |
# ФУНКЦИИ ПРОВЕРОК (КОНЕЦ)
|
2059 |
|
2060 |
def safe_check(func, message):
|
@@ -2084,7 +2160,15 @@ def perform_checks(message):
|
|
2084 |
"derived_prepositions": safe_check(check_no_derived_prepositions, message),
|
2085 |
"compound_sentences": safe_check(check_no_compound_sentences, message),
|
2086 |
"dates_written_out": safe_check(check_no_dates_written_out, message),
|
2087 |
-
"no_word_repetitions": safe_check(check_no_word_repetitions, message)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2088 |
}
|
2089 |
return checks
|
2090 |
|
@@ -2109,7 +2193,15 @@ def format_checks(checks):
|
|
2109 |
"derived_prepositions": "Производные предлоги",
|
2110 |
"compound_sentences": "Сложноподчиненные предложения",
|
2111 |
"dates_written_out": "Даты прописью",
|
2112 |
-
"no_word_repetitions": "Повторы слов"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2113 |
}
|
2114 |
formatted_results = []
|
2115 |
for rule, result in checks.items():
|
|
|
21 |
from sklearn.metrics.pairwise import cosine_similarity
|
22 |
from sentence_transformers import SentenceTransformer, util
|
23 |
import numpy as np
|
24 |
+
from langchain_core.output_parsers import JsonOutputParser
|
25 |
+
from pydantic import BaseModel, Field
|
26 |
+
from langchain_core.runnables.base import Runnable
|
27 |
+
from langchain_mistralai import ChatMistralAI
|
28 |
|
29 |
|
30 |
morph = pymorphy2.MorphAnalyzer()
|
|
|
34 |
gc_key = os.getenv('GC_KEY')
|
35 |
token = os.getenv('GITHUB_TOKEN')
|
36 |
TOGETHER_API_KEY = os.getenv('TOGETHER_API_KEY')
|
37 |
+
m_auth = os.getenv('MISTRAL_API_KEY')
|
38 |
|
39 |
# Инициализация клиента для Together
|
40 |
client = Together(api_key=TOGETHER_API_KEY)
|
|
|
2060 |
# Если мы дошли до этой точки, повторов не было
|
2061 |
return True
|
2062 |
|
2063 |
+
# Проверки на LLM
|
2064 |
+
|
2065 |
+
class LLMAnswerParser(BaseModel):
|
2066 |
+
reasoning: str = Field(description='Рассуждения')
|
2067 |
+
decision: bool = Field(description='True или False')
|
2068 |
+
|
2069 |
+
llm = ChatMistralAI(
|
2070 |
+
model=model,
|
2071 |
+
api_key=m_auth,
|
2072 |
+
temperature=0
|
2073 |
+
)
|
2074 |
+
|
2075 |
+
parser = JsonOutputParser(pydantic_object=LLMAnswerParser)
|
2076 |
+
|
2077 |
+
# 22. Проверка сложных предложений без логической связи
|
2078 |
+
def check_disconnected_sentences(sms, parser):
|
2079 |
+
task = '''Проверь текст на наличие сложных предложений, где отсутствует логическая связь между частями.
|
2080 |
+
Определи, есть ли в тексте предложения с несколькими частями, которые кажутся несвязанными, не поддерживают общую мысль или делают текст трудным для понимания.
|
2081 |
+
Верни ответ в виде JSON с полями reasoning в виде строки и decision в виде True или False.'''
|
2082 |
+
|
2083 |
+
return check_with_m(task, sms, parser)
|
2084 |
+
|
2085 |
+
# 23. Проверка на близкие по смыслу однородные члены
|
2086 |
+
def check_synonymous_members(sms, parser):
|
2087 |
+
task = '''Проверь текст на наличие однородных членов предложения, которые имеют близкий или одинаковый смысл.
|
2088 |
+
Определи, есть ли в предложении несколько слов или выражений, которые передают одну и ту же идею или значение, но используются вместе.
|
2089 |
+
Верни ответ в виде JSON с полями reasoning в виде строки и decision в виде True или False.'''
|
2090 |
+
|
2091 |
+
return check_with_m(task, sms, parser)
|
2092 |
+
|
2093 |
+
# 24. Проверка на шокирующие, экстравагантные или кликбейтные фразы
|
2094 |
+
def check_clickbait_phrases(sms, parser):
|
2095 |
+
task = '''Проверь СМС на наличие шокирующих, экстравагантных или кликбейтных фраз.
|
2096 |
+
Укажи, если текст содержит утверждения, которые:
|
2097 |
+
- стремятся вызвать сильные эмоции (например, шок, страх, удивление);
|
2098 |
+
- используют преувеличения, необоснованные заявления или сенсационные выражения;
|
2099 |
+
- содержат провокационные формулировки, которые побуждают к немедленному действию или реакции.
|
2100 |
+
Верни ответ в виде JSON с полями reasoning в виде строки и decision в виде True или False.'''
|
2101 |
+
|
2102 |
+
return check_with_m(task, sms, parser)
|
2103 |
+
|
2104 |
+
# 25. Проверка на абстрактные заявления без поддержки фактами
|
2105 |
+
def check_abstract_claims(sms, parser):
|
2106 |
+
task = '''Проверь текст на наличие абстрактных утверждений, которые не подкреплены фактами, данными или конкретными примерами.
|
2107 |
+
Определи, содержит ли текст общие фразы, которые не объясняют, как клиенту будет полезен продукт или услуга.
|
2108 |
+
Верни ответ в виде JSON с полями reasoning в виде строки и decision в виде True или False.'''
|
2109 |
+
|
2110 |
+
return check_with_m(task, sms, parser)
|
2111 |
+
|
2112 |
+
# 26. Проверка на узкоспециализированные термины
|
2113 |
+
def check_specialized_terms(sms, parser):
|
2114 |
+
task = '''Проверь текст на наличие узкоспециализированных терминов, которые могут быть непонятны широкой аудитории.
|
2115 |
+
Верни ответ в виде JSON с полями reasoning в виде строки и decision в виде True или False.'''
|
2116 |
+
|
2117 |
+
return check_with_m(task, sms, parser)
|
2118 |
+
|
2119 |
+
# 27. Проверка на двусмысленные или обидные фразы
|
2120 |
+
def check_offensive_phrases(sms, parser):
|
2121 |
+
task = '''Проверь текст на наличие фраз, которые могут быть истолкованы двусмысленно или вызвать негативные эмоции у читателя.
|
2122 |
+
Определи, есть ли в тексте выражения, которые могут быть восприняты как оскорбительные, обидные или неуместные.
|
2123 |
+
Верни ответ в виде JSON с полями reasoning в виде строки и decision в виде True или False.'''
|
2124 |
+
|
2125 |
+
return check_with_m(task, sms, parser)
|
2126 |
+
|
2127 |
+
# 28. Проверка на речевые клише, рекламные штампы и канцеляризмы
|
2128 |
+
def check_cliches_and_bureaucratese(sms, parser):
|
2129 |
+
task = '''Проверь текст на наличие речевых клише, рекламных штампов и канцеляризмов, которые делают текст менее выразительным и оригинальным.
|
2130 |
+
Верни ответ в виде JSON с полями reasoning в виде строки и decision в виде True или False.'''
|
2131 |
+
|
2132 |
+
return check_with_m(task, sms, parser)
|
2133 |
+
|
2134 |
# ФУНКЦИИ ПРОВЕРОК (КОНЕЦ)
|
2135 |
|
2136 |
def safe_check(func, message):
|
|
|
2160 |
"derived_prepositions": safe_check(check_no_derived_prepositions, message),
|
2161 |
"compound_sentences": safe_check(check_no_compound_sentences, message),
|
2162 |
"dates_written_out": safe_check(check_no_dates_written_out, message),
|
2163 |
+
"no_word_repetitions": safe_check(check_no_word_repetitions, message),
|
2164 |
+
# Проверки на LLM
|
2165 |
+
"disconnected_sentences": safe_check(check_disconnected_sentences, message),
|
2166 |
+
"synonymous_members": safe_check(check_synonymous_members, message),
|
2167 |
+
"clickbait_phrases": safe_check(check_clickbait_phrases, message),
|
2168 |
+
"abstract_claims": safe_check(check_abstract_claims, message),
|
2169 |
+
"specialized_terms": safe_check(check_specialized_terms, message),
|
2170 |
+
"offensive_phrases": safe_check(check_offensive_phrases, message),
|
2171 |
+
"cliches_and_bureaucratese": safe_check(check_cliches_and_bureaucratese, message)
|
2172 |
}
|
2173 |
return checks
|
2174 |
|
|
|
2193 |
"derived_prepositions": "Производные предлоги",
|
2194 |
"compound_sentences": "Сложноподчиненные предложения",
|
2195 |
"dates_written_out": "Даты прописью",
|
2196 |
+
"no_word_repetitions": "Повторы слов",
|
2197 |
+
# Проверки на LLM
|
2198 |
+
"disconnected_sentences": "Сложные предложения без логической связи",
|
2199 |
+
"synonymous_members": "Близкие по смыслу однородные члены предложения",
|
2200 |
+
"clickbait_phrases": "Кликбейтные фразы",
|
2201 |
+
"abstract_claims": "Абстрактные заявления без доказательств",
|
2202 |
+
"specialized_terms": "Узкоспециализированные термины",
|
2203 |
+
"offensive_phrases": "Двусмысленные или оскорбительные фразы",
|
2204 |
+
"cliches_and_bureaucratese": "Речевые клише, рекламные штампы, канцеляризмы"
|
2205 |
}
|
2206 |
formatted_results = []
|
2207 |
for rule, result in checks.items():
|