Как создать систему рекомендаций для Telegram-бота, используя библиотеку aiogram, аналогичную той, что используется у Davinchik?

Привет всем, кто читает этот вопрос! У меня возникли трудности с реализацией системы рекомендаций для бота, который включает лайки и свайпы. Я понимаю, что нужно создать две базы данных: одна для пользователей, а другая — для оценок. При просмотре пользователей, которые меня лайкнули, я должен обращаться к базе данных с оценками и показывать только те лайки, а также получать идентификаторы пользователей, которые поставили лайк. Однако у меня все равно есть некоторые неясности в этом процессе. Можете подсказать, как улучшить данную систему или как бы вы поступили в подобной ситуации?
  • 14 сентября 2024 г. 17:03
Ответы на вопрос 2
Создание системы рекомендаций для Telegram-бота на базе библиотеки aiogram — это интересное и непростое задание. Давайте разберем основные шаги, которые вам необходимо проделать для реализации такой системы.

### 1. Определите структуру базы данных

Вам действительно понадобятся две основные таблицы:

- **Пользователи** (users)
  - `user_id` (уникальный идентификатор пользователя)
  - `username` (имя пользователя или идентификатор в Telegram)
  - Другие поля (например, возраст, местоположение и т. д.)

- **Оценки** (ratings)
  - `rating_id` (уникальный идентификатор оценки)
  - `user_id` (идентификатор пользователя, который поставил лайк)
  - `liked_user_id` (идентификатор пользователя, которому поставили лайк)
  - `created_at` (дата и время оценки)

Пример можно реализовать с помощью SQLite, PostgreSQL или другой СУБД на ваш выбор.

### 2. Создание бота на aiogram

Создайте базовую структуру бота с aiogram, включая обработчики команд (start, help и т. д.).

```python
from aiogram import Bot, Dispatcher, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.utils import executor
import sqlite3

bot = Bot(token='YOUR_BOT_TOKEN')
dp = Dispatcher(bot, storage=MemoryStorage())

# Подключение к базе данных
conn = sqlite3.connect('my_bot.db')
cursor = conn.cursor()
```

### 3. Регистрация пользователей

Когда новый пользователь запускает бота, вам следует зарегистрировать его в базе данных.

```python
@dp.message_handler(commands=['start'])
async def start_command(message: types.Message):
    user_id = message.from_user.id
    username = message.from_user.username

    cursor.execute("INSERT OR IGNORE INTO users (user_id, username) VALUES (?, ?)", (user_id, username))
    conn.commit()

    await message.answer("Добро пожаловать! Используйте /like или /liked для работы с лайками.")
```

### 4. Лайки и управление оценками

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

```python
@dp.message_handler(commands=['like'])
async def like_command(message: types.Message):
    user_id = message.from_user.id
    # Допустим, мы хотим лайкнуть пользователя с ID 123
    liked_user_id = 123

    cursor.execute("INSERT INTO ratings (user_id, liked_user_id, created_at) VALUES (?, ?, datetime('now'))", (user_id, liked_user_id))
    conn.commit()
    
    await message.answer("Вы поставили лайк пользователю {}!".format(liked_user_id))
```

### 5. Отображение пользователей, которые лайкнули вас

Создайте команду, чтобы показать список пользователей, которые лайкнули текущего пользователя.

```python
@dp.message_handler(commands=['liked'])
async def liked_command(message: types.Message):
    user_id = message.from_user.id
    cursor.execute("SELECT user_id FROM ratings WHERE liked_user_id = ?", (user_id,))
    liked_users = cursor.fetchall()

    if liked_users:
        response = "Вы были лайкнуты пользователями:\n"
        for (liked_user_id,) in liked_users:
            response += f"Пользователь ID: {liked_user_id}\n"
    else:
        response = "Никто не лайкнул вас."

    await message.answer(response)
```

### 6. Рекомендательная система

Для создания рекомендаций можно использовать разные методы, например, учитывать, кто из пользователей нравится другим пользователям. Вы можете строить простую рекомендательную систему, анализируя лайки и предлагая пользователям пользователей с высокой взаимной оценкой.

Вот пример простейшего подхода:

```python
def recommend_users(user_id):
    # Поиск пользователей, которые имеют перекрестные лайки с данным пользователем
    cursor.execute("""
        SELECT liked_user_id 
        FROM ratings 
        WHERE user_id IN (
            SELECT liked_user_id 
            FROM ratings 
            WHERE user_id = ?
        )
        AND liked_user_id != ? 
        GROUP BY liked_user_id
    """, (user_id, user_id))
    
    recommendations = cursor.fetchall()
    return recommendations
```

### 7. Тестирование и доработка

После реализации этих функций протестируйте систему, пополняйте базу данных тестовыми пользователями и отслеживайте, как работает система рекомендаций. Это поможет вам понять, как можно улучшить алгоритмы для более точных рекомендаций.

Наиболее простой способ примерно такой. Ранжируешь пользователей по тому, сколько у них лайков на тех же элементах, которые уже лайкнул ты. Возможно, стоит рассматривать только недавние лайки. 
Затем берёшь из этого списка N первых - они будут "образцами". Усредняешь их лайки, выбираешь наиболее лайкнутые элементы, которые ещё не лайкнул ты. Это и будут рекомендации.
Похожие вопросы