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(""" """, 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'' f'' f'{html.escape(text[error["start"]:error["end"]])}' f'' ) last_pos = error['end'] highlighted.append(html.escape(text[last_pos:])) html_content = f"""
{''.join(highlighted)}
""" 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()