checked / app.py
bvd757's picture
fixes_v1
7af81f3
raw
history blame
5.27 kB
import language_tool_python
import openai
import streamlit as st
import subprocess
from pathlib import Path
import html
is_java_installed = False
def install_java():
global is_java_installed
if is_java_installed: return
try:
subprocess.run(["apt-get", "update"], check=True)
subprocess.run(["apt-get", "install", "-y", "openjdk-17-jdk"], check=True)
is_java_installed = True
except Exception as e:
st.error(f"Ошибка установки Java: {e}")
@st.cache_resource
def load_assets():
openai.api_key = 'sk-proj-...' # Ваш API-ключ
install_java()
tool = language_tool_python.LanguageTool('ru-RU', language_tool_download_version="6.1")
return tool
def generate_gpt_comment(message, context):
response = openai.ChatCompletion.create(
model="gpt-4o",
messages=[
{"role": "user", "content": f"Прокомментируй ошибку: {message} в данном тексте '{context}'. Не больше одного предложения, на русском."}
]
)
return response.choices[0].message['content']
def check_text(text, tool):
matches = tool.check(text)
errors = []
for match in matches:
error_info = {
'start': match.offset,
'end': match.offset + match.errorLength,
'message': generate_gpt_comment(match.message, match.context),
}
errors.append(error_info)
return errors
def main():
st.markdown("""
<style>
.error-highlight {
background-color: #ffe066;
border-bottom: 2px dotted #ff9900;
cursor: pointer;
color: black !important;
}
.error-highlight:hover {
background-color: #ffd700;
}
</style>
""", unsafe_allow_html=True)
st.title('Проверка орфографии')
# Сохраняем текст в session_state
text_input = st.text_area("Введите текст для проверки:",
value=st.session_state.get('text_to_check', ''),
height=200)
text = text_input.replace("\n", " ")
tool = load_assets()
if st.button('Проверить текст'):
st.session_state.text_to_check = text_input
if not text.strip():
st.warning("Введите текст для проверки")
else:
errors = check_text(text, tool)
st.session_state.errors = errors
st.session_state.sorted_errors = sorted(errors, key=lambda x: x['start'])
st.query_params.clear() # Очищаем параметры URL
# Используем сохраненные ошибки при наличии
errors = st.session_state.get('errors', [])
sorted_errors = st.session_state.get('sorted_errors', [])
if errors:
# Генерация HTML с кликабельными ошибками
highlighted = []
last_pos = 0
for index, error in enumerate(sorted_errors):
highlighted.append(html.escape(text[last_pos:error['start']]))
highlighted.append(
f'<a href="?selected_error={index}" style="text-decoration: none; color: inherit;">'
f'<span class="error-highlight" title="{html.escape(error["message"])}">'
f'{html.escape(text[error["start"]:error["end"]])}'
f'</span></a>'
)
last_pos = error['end']
highlighted.append(html.escape(text[last_pos:]))
html_content = f"""
<div style="
background: white;
padding: 20px;
border-radius: 8px;
border: 1px solid #ddd;
white-space: pre-wrap;
font-family: monospace;
color: #000000;
">
{''.join(highlighted)}
</div>
"""
st.markdown("### Результат проверки:")
st.markdown(html_content, unsafe_allow_html=True)
# Обработка выбранной ошибки
selected_error = st.query_params.get("selected_error", None)
if selected_error is not None:
try:
selected_index = int(selected_error)
if 0 <= selected_index < len(sorted_errors):
error = sorted_errors[selected_index]
st.markdown("### Описание ошибки:")
st.markdown(f"**Ошибка {selected_index + 1}** (позиция {error['start']}-{error['end']}): {error['message']}")
return # Прекращаем выполнение, чтобы не показывать все ошибки
except:
pass
# Показываем все ошибки, если не выбрана конкретная
st.markdown("### Найденные ошибки:")
for i, error in enumerate(sorted_errors, 1):
st.markdown(f"{i}. **Позиция {error['start']}-{error['end']}**: {error['message']}")
if __name__ == "__main__":
main()