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()