File size: 4,402 Bytes
a52faf6 6306328 a52faf6 e3c1e1d a52faf6 7bf3b1f e3c1e1d 41c1169 7bf3b1f e3c1e1d 7bf3b1f e3c1e1d a52faf6 d0fdf20 668c42c 7af81f3 a52faf6 6306328 a52faf6 6306328 a52faf6 285e310 2eb0a24 7af81f3 2eb0a24 a52faf6 7af81f3 7511745 7af81f3 aa68abd a52faf6 aa68abd 7511745 7af81f3 7511745 7af81f3 7511745 7af81f3 7511745 7af81f3 7511745 7af81f3 47cd49c 7af81f3 7511745 7af81f3 7511745 47cd49c 7511745 47cd49c 7511745 a52faf6 7af81f3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
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 = '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'
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;
color: black !important;
}
</style>
""", unsafe_allow_html=True)
st.title('Проверка орфографии')
text_input = st.text_area("Введите текст для проверки:", height=200)
text = text_input.replace("\n", " ")
tool = load_assets()
if st.button('Проверить текст'):
if not text.strip():
st.warning("Введите текст для проверки")
else:
errors = check_text(text, tool)
st.session_state.errors = sorted(errors, key=lambda x: x['start'])
st.session_state.show_all_errors = True # Показывать все ошибки по умолчанию
errors = st.session_state.get('errors', [])
if errors:
# Выводим текст с подсветкой ошибок
highlighted = []
last_pos = 0
for error in errors:
highlighted.append(html.escape(text[last_pos:error['start']]))
highlighted.append(
f'<span class="error-highlight" title="{html.escape(error["message"])}">'
f'{html.escape(text[error["start"]:error["end"]])}'
f'</span>'
)
last_pos = error['end']
highlighted.append(html.escape(text[last_pos:]))
st.markdown("### Результат проверки:")
st.markdown(
f'<div style="background: white; padding: 20px; border-radius: 8px; color: black;">'
f'{"".join(highlighted)}'
f'</div>',
unsafe_allow_html=True
)
# Выбор ошибки через радио-кнопки
st.markdown("### Выберите ошибку для подробного описания:")
selected_error = st.radio(
"Список ошибок:",
options=[f"Ошибка {i+1} (позиция {e['start']}-{e['end']})" for i, e in enumerate(errors)],
index=None,
key="error_selector"
)
# Показываем описание выбранной ошибки
if selected_error:
error_index = int(selected_error.split()[1]) - 1 # "Ошибка 1" → индекс 0
error = errors[error_index]
st.markdown(f"**Описание:** {error['message']}")
else:
st.info("Кликните на ошибку в списке выше, чтобы увидеть её описание.")
if __name__ == "__main__":
main() |