- /rag/commands/expert.py - /core/services/__init__.py - /core/services/embedding_service.py - /core/services/file_service.py - /core/services/giga_client.py - /core/services/kb_service.py - /core/services/postgres_service.py - /core/services/qdrant_service.py - /core/services/reranker_service.py - /core/functions/__init__.py - /core/functions/check_consistency.py - /core/functions/check_spelling.py - /core/functions/critique_answer.py - /core/functions/expand_query.py - /core/functions/extract_metrics.py - /core/functions/file_processor.py - /core/functions/generate_document.py - /core/functions/intent_classify.py - /core/functions/rerank_context.py - /core/functions/summarize_document.py - /core/utils/__init__.py - /core/utils/arg_parser.py - /core/utils/config_loader.py - /core/utils/layout_converter.py - /core/utils/logger.py - /core/utils/text_utils.py - /core/utils/web_utils.py - /bots/commands/__init__.py - /bots/commands/base.py - /bots/commands/create.py - /core/commands/global_remove.py - /core/commands/help.py - /core/commands/info.py - /core/commands/kb.py - /core/commands/learn.py - /core/commands/other.py - /core/commands/registry.py - /core/commands/stats.py - /core/commands/template.py - /core/handlers/__init__.py - /core/handlers/message_handler.py - /core/workers/__init__.py - /core/workers/indexing_worker.py - /core/xmpp/__init__.py - /core/xmpp/client.py - /bots/commands/global_remove.py - /bots/commands/help.py - /bots/commands/info.py - /bots/commands/kb.py - /bots/commands/registry.py - /bots/commands/other.py - /bots/commands/template.py - /bots/commands/learn.py - /bots/commands/stats.py - /bots/handlers/message_handler.py - /bots/handlers/__init__.py - /bots/workers/__init__.py - /bots/workers/indexing_worker.py - /bots/xmpp/__init__.py - /bots/xmpp/client.py - /rag/services/qdrant_service.py - /rag/services/giga_client.py - /rag/services/embedding_service.py - /rag/services/reranker_service.py - /rag/services/__init__.py - /rag/services/file_service.py - /rag/services/postgres_service.py - /rag/services/kb_service.py - /rag/functions/check_spelling.py - /rag/functions/__init__.py - /rag/functions/extract_metrics.py - /rag/functions/generate_document.py - /rag/functions/expand_query.py - /rag/functions/critique_answer.py - /rag/functions/file_processor.py - /rag/functions/check_consistency.py - /rag/functions/summarize_document.py - /rag/functions/rerank_context.py - /rag/functions/intent_classify.py - /rag/utils/__init__.py - /rag/utils/layout_converter.py - /rag/utils/text_utils.py - /rag/utils/arg_parser.py - /rag/utils/config_loader.py - /rag/utils/logger.py - /rag/utils/web_utils.py
71 lines
4.4 KiB
Python
71 lines
4.4 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""
|
||
Конвертер раскладки клавиатуры: определяет, в какой раскладке (русской или английской)
|
||
набран текст, и при необходимости переключает её.
|
||
Используется для исправления сообщений, набранных по ошибке не в той раскладке.
|
||
"""
|
||
|
||
import logging
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
|
||
def convert_layout(text: str) -> str:
|
||
"""
|
||
Определяет, в какой раскладке набран текст, и переключает, если нужно.
|
||
Команды (начинающиеся с ! или /) и ссылки (http://) не трогает.
|
||
|
||
Алгоритм:
|
||
1. Если текст начинается с http://, https://, ! или / – возвращается без изменений.
|
||
2. Составляем таблицы перевода: английские символы -> русские и наоборот.
|
||
3. Если в тексте есть и русские, и английские символы – считаем, что всё правильно (не переключаем).
|
||
4. Считаем количество гласных букв в английской и русской раскладках для исходного текста
|
||
и для его переведённых вариантов.
|
||
5. Выбираем вариант с наибольшим количеством гласных (вероятная правильная раскладка).
|
||
6. Если гласных поровну или нет ни одной, возвращаем исходный текст.
|
||
"""
|
||
if not text:
|
||
return text
|
||
|
||
# Не трогаем команды и ссылки
|
||
if text.startswith('http') or text.startswith(('!', '/')):
|
||
return text
|
||
|
||
# Таблицы соответствия символов (раскладка QWERTY / ЙЦУКЕН)
|
||
en_chars = "qwertyuiop[]asdfghjkl;'zxcvbnm,./QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>?~"
|
||
ru_chars = "йцукенгшщзхъфывапролджэячсмитьбю.ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,Ё"
|
||
to_ru = str.maketrans(en_chars, ru_chars) # таблица для перевода английской раскладки в русскую
|
||
to_en = str.maketrans(ru_chars, en_chars) # таблица для перевода русской раскладки в английскую
|
||
|
||
# Проверяем, есть ли символы обеих раскладок в тексте
|
||
has_russian = any('а' <= c <= 'я' or 'А' <= c <= 'Я' for c in text)
|
||
has_english = any('a' <= c <= 'z' or 'A' <= c <= 'Z' for c in text)
|
||
if has_russian and has_english:
|
||
# Смесь – вероятно, уже правильно
|
||
return text
|
||
|
||
# Гласные буквы для подсчёта (в английской и русской раскладках)
|
||
eng_vowels = "aeiouyAEIOUY"
|
||
ru_vowels = "аеёиоуыэюяАЕЁИОУЫЭЮЯ"
|
||
|
||
orig_en_vowels = sum(1 for c in text if c in eng_vowels)
|
||
orig_ru_vowels = sum(1 for c in text if c in ru_vowels)
|
||
|
||
# Переводим текст в другую раскладку
|
||
translated_en = text.translate(to_en) # русская -> английская
|
||
translated_ru = text.translate(to_ru) # английская -> русская
|
||
|
||
trans_en_vowels = sum(1 for c in translated_en if c in eng_vowels)
|
||
trans_ru_vowels = sum(1 for c in translated_ru if c in ru_vowels)
|
||
|
||
# Если в исходном тексте нет русских символов, но при переводе в русскую раскладку
|
||
# появляется больше гласных, значит, текст был набран в английской раскладке.
|
||
if not has_russian and trans_ru_vowels > orig_en_vowels:
|
||
return translated_ru
|
||
|
||
# Если в исходном тексте нет английских символов, но при переводе в английскую раскладку
|
||
# появляется больше гласных, значит, текст был набран в русской раскладке.
|
||
if has_russian and trans_en_vowels > orig_ru_vowels:
|
||
return translated_en
|
||
|
||
return text |