Создание приложения для «экстрасенсов» – это не просто набор мистических функций, а серьёзная инженерная задача, требующая внимательной работы с текстом, поиском и фильтрацией информации. Ниже представлен пошаговый гайд, в котором использованы актуальные сведения из сети (регулярные выражения, работа с русскими символами, literal‑поиск и исключение нежелательных результатов).
Что такое программа для экстрасенсов?
Под «программой для экстрасенсов» обычно понимают приложение, которое:
- принимает запросы пользователя (вопросы, аффирмации, даты рождения и т.д.);
- анализирует введённый текст на наличие ключевых фраз, символов и паттернов;
- формирует ответ на основе заранее подготовленной базы знаний (толкования снов, карт Таро, нумерологии и т.п.);
- предоставляет результат в удобочитаемом виде, учитывая linguistic‑особенности русского языка.
Ключевой момент – корректная обработка русскоязычного ввода, потому что большинство пользователей будут писать на кириллице.
Основные требования к текстовой обработке
Нормализация строк
Перед любым поиском рекомендуется привести стровик к единому виду:
- привести к нижнему регистру (
.lowerв Python,toLowerCaseв JS); - удалить лишние пробелы в начале и конце (
.strip/.trim); - опционально – привести к NFC‑нормализации Unicode, чтобы одинаковые символы имели одинаковое представление.
Работа с русскими символами
Как указано в материалах Stack Overflow, диапазон А-ИК-ЯЁа-ик-яё охватывает все русские буквы кроме Й и й. Это полезно, когда нужно:
- фильтровать только русские слова;
- исключать латиницу или специальные символы.
Пример регулярного выражения, которое находит любые русские буквы (включая Ё/ё):
const russianRegex = /[А-Яа-Ёё]/u; Literal‑поиск (точное совпадение фразы)
В wielu поисковых движках (Elasticsearch, PostgreSQL full‑text search) перед индексацией происходит токенизация и удаление пунктуации – это может «сломать» поиск по точным цитатам. Чтобы сохранить возможность literal‑поиска, необходимо:
- индексировать исходную фразу без нормализации (или хранить её отдельно в поле
raw); - при выполнении запроса оборачивать фразу в кавычки и использовать оператор
"phrase"(в Elasticsearch –match_phrase, в PostgreSQL –to_tsquery('simple', '"фраза"')); - если движок не поддерживает phrase‑search, выполнять пост‑фильтрацию результатов через обычный
LIKEили регулярное выражение.
Пример на Python с использованием psycopg2 и PostgreSQL:
import psycopg2
conn = psycopg2.connect(database="psychic", user="app")
cur = conn.cursor
def literal_search(phrase):
# экранируем одинарные кавычки для SQL
safe = phrase.replace("'", "''")
query = f"""
SELECT id, content
FROM psychic_notes
WHERE content ILIKE '%{safe}%'
AND content ~* '({safe})' -- дополнительная проверка через regex
"""
cur.execute(query)
return cur.fetchall
results = literal_search("Что за бред!")
print(results)
Исключение нежелательных результатов (например, русскоязычного шума)
Иногда нужно избавиться от записей, написанных на русском, чтобы сосредоточиться на латинских метаданных или наоборот. Для этого полезны два приёма:
Исключение через отрицательный класс символов
Регулярное выражение, которое находит всё, кроме русских букв:
const notRussian = /[^А-Яа-Ёё]/u; Применяем к полю metadata и оставляем только те строки, где совпадений нет.
Исключение через язык в поисковых системах
В контексте собственного API достаточно добавить параметр lang при запросе и проверять его на сервере:
if request.args.get('lang') != 'ru':
# исключаем записи, где detected language == russian
if detect_language(record.text) == 'ru':
continue
Пример минимального рабочего прототипа (Python + Flask)
Ниже представлен упрощённый сервис, который принимает вопрос, ищет в базе заметок literal‑совпадения и возвращает толкование, учитывая все вышеописанные нюансы.
from flask import Flask, request, jsonify
import psycopg2
import re
app = Flask(__name__)
DB_PARAMS = {
"dbname": "psychic",
"user": "app",
"password": "secret",
"host": "localhost"
}
def get_conn:
return psycopg2.connect(**DB_PARAMS)
def normalize(text):
return text.strip.lower
def is_russian(text):
return bool(re.search(r'[А-Яа-Ёё]', text))
@app.route('/ask', methods=['GET'])
def ask:
raw_question = request.args.get('q', '')
question = normalize(raw_question)
# literal‑поиск: ищем точное совпадение фразы
with get_conn as conn:
with conn.cursor as cur:
# экранируем одинарные кавычки
safe = question.replace("'", "''")
cur.execute(f"""
SELECT id, interpretation
FROM psychic_notes
WHERE content ILIKE '%{safe}%'
AND content ~* '({safe})'
""")
rows = cur.fetchall
# если ничего не найдено – пытаемся найти по отдельным словам
if not rows:
words = question.split
placeholders = ', '.join(['%s'] * len(words))
with get_conn as conn:
with conn.cursor as cur:
cur.execute(f"""
SELECT id, interpretation
FROM psychic_notes
WHERE content ILIKE ANY (ARRAY[{placeholders}])
""", words)
rows = cur.fetchall
# формируем ответ
if not rows:
answer = "К сожалению, в базе нет информации по вашему запросу."
else:
# берем первое совпадение (можно улучшить ранжирование)
answer = rows[0][1]
return jsonify({
"question": raw_question,
"answer": answer,
"found": bool(rows)
})
if __name__ == '__main__':
app.run(debug=True)
Ключевые моменты кода:
- Функция
normalizeприводит ввод к единому виду. - Поиск выполняется через
ILIKE(регистронезависимыйLIKE) и дополнительно проверяется регулярным выражением, чтобы гарантировать literal‑совпадение. - Если literal‑поиск не дал результата – делаем fallback на поиск по отдельным словам.
- В ответе возвращается толкование из поля
interpretation.
Рекомендации по дальнейшему развитию
- Морфологический анализ. Подключите библиотеки
pymorphy2илиspacyс модельюru_core_news_smдля приведения слов к нормальной форме (лемматизация). Это повысит recall при неточных формулировках. - Векторные представления. Для более «интуитивного» поиска можно использовать эмбеддинги (например,
sentence-transformers) и искать по косинусному сходству. - Кеширование. Часто задаваемые вопросы можно кешировать в Redis, чтобы ускорить ответ.
- Обработка ошибок. Логируйте неудачные запросы и periodically пополняйте базу новыми толкованиями на основе обратной связи пользователей.
- Мультиязычность. Если планируется поддержка других языков, вынесите языковую зависимость в отдельный слой (языковые пакеты, i18n).
Создание программы для экстрасенсов – это сочетание мистической идеи и строгой инженерной проработки. Главное – правильно обрабатывать русский текст: нормализация, работа с диапазонами символов, literal‑поиск и умное исключение нежелательных результатов. Используя предложенные подходы и пример кода, вы сможете построить надёжное и удобное приложение, которое будет точно понимать запросы пользователей и выдавать полезные толкования.
Удачной разработки!