Создание приложения для экстрасенсов

Создание приложения для «экстрасенсов» – это не просто набор мистических функций, а серьёзная инженерная задача, требующая внимательной работы с текстом, поиском и фильтрацией информации. Ниже представлен пошаговый гайд, в котором использованы актуальные сведения из сети (регулярные выражения, работа с русскими символами, literal‑поиск и исключение нежелательных результатов).


Что такое программа для экстрасенсов?

Под «программой для экстрасенсов» обычно понимают приложение, которое:

  • принимает запросы пользователя (вопросы, аффирмации, даты рождения и т.д.);
  • анализирует введённый текст на наличие ключевых фраз, символов и паттернов;
  • формирует ответ на основе заранее подготовленной базы знаний (толкования снов, карт Таро, нумерологии и т.п.);
  • предоставляет результат в удобочитаемом виде, учитывая linguistic‑особенности русского языка.

Ключевой момент – корректная обработка русскоязычного ввода, потому что большинство пользователей будут писать на кириллице.


Основные требования к текстовой обработке

Нормализация строк

Перед любым поиском рекомендуется привести стровик к единому виду:

  • привести к нижнему регистру (.lower в Python, toLowerCase в JS);
  • удалить лишние пробелы в начале и конце (.strip / .trim);
  • опционально – привести к NFC‑нормализации Unicode, чтобы одинаковые символы имели одинаковое представление.

Работа с русскими символами

Как указано в материалах Stack Overflow, диапазон А-ИК-ЯЁа-ик-яё охватывает все русские буквы кроме Й и й. Это полезно, когда нужно:

  • фильтровать только русские слова;
  • исключать латиницу или специальные символы.

Пример регулярного выражения, которое находит любые русские буквы (включая Ё/ё):

const russianRegex = /[А-Яа-Ёё]/u;

Literal‑поиск (точное совпадение фразы)

В wielu поисковых движках (Elasticsearch, PostgreSQL full‑text search) перед индексацией происходит токенизация и удаление пунктуации – это может «сломать» поиск по точным цитатам. Чтобы сохранить возможность literal‑поиска, необходимо:

  1. индексировать исходную фразу без нормализации (или хранить её отдельно в поле raw);
  2. при выполнении запроса оборачивать фразу в кавычки и использовать оператор "phrase" (в Elasticsearch – match_phrase, в PostgreSQL – to_tsquery('simple', '"фраза"'));
  3. если движок не поддерживает 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.

Рекомендации по дальнейшему развитию

  1. Морфологический анализ. Подключите библиотеки pymorphy2 или spacy с моделью ru_core_news_sm для приведения слов к нормальной форме (лемматизация). Это повысит recall при неточных формулировках.
  2. Векторные представления. Для более «интуитивного» поиска можно использовать эмбеддинги (например, sentence-transformers) и искать по косинусному сходству.
  3. Кеширование. Часто задаваемые вопросы можно кешировать в Redis, чтобы ускорить ответ.
  4. Обработка ошибок. Логируйте неудачные запросы и periodically пополняйте базу новыми толкованиями на основе обратной связи пользователей.
  5. Мультиязычность. Если планируется поддержка других языков, вынесите языковую зависимость в отдельный слой (языковые пакеты, i18n).

Создание программы для экстрасенсов – это сочетание мистической идеи и строгой инженерной проработки. Главное – правильно обрабатывать русский текст: нормализация, работа с диапазонами символов, literal‑поиск и умное исключение нежелательных результатов. Используя предложенные подходы и пример кода, вы сможете построить надёжное и удобное приложение, которое будет точно понимать запросы пользователей и выдавать полезные толкования.

Удачной разработки!