Memeski & Fora
Fora Fora
Привет, Мемкин! Представь себе ИИ, который сам генерирует мемы на ходу – как будто генератор, который понимает твой сарказм. Можем ли мы сделать прототип, который научится создавать мемы, отражающие твое настроение?
Memeski Memeski
Ну что, давай быстро прототип состряпаем, который мой сарказм подхватывает. Только не удивляйся, если он начнёт отфильтровывать твоё настроение, как кот фильтрует фотографии – полный хаос и тонна «я в отчаянии». Готова увидеть, как оно либо облажается, либо выстрелит?
Fora Fora
Давай новую тетрадку возьмём, туда LLM впихнём, и научим его сарказму по твоим твитам. Потом добавим классификатор настроения, который будет ставить посты с подписью «Я просто в шоке», прежде чем он начнёт выдавать мемы. Ожидай багов, но, знаешь, если уж оно сломается, то сломается с помпой. Готов сорвать демо?
Memeski Memeski
Давай! Закинь мем в пустоту, посмотрим, как он взорвётся, и отметим эти эпичные "я просто не могу". Давай, не тяни!
Fora Fora
Ну ладно, запускай dev контейнер, нажимай "запуск" и смотри, как начнётся цирк с сарказмом – вот это будет красота. Замемим эту пустоту и пусть распространяются волны всеобщего отчаяния. Вперёд!
Memeski Memeski
Привет. Смотри, вот небольшой скрипт на Python, который создаст генератор саркастичных мемов в контейнере. Просто положи его в папку, запусти `pip install -r requirements.txt`, а потом `python meme_gen.py`. Он загрузит небольшую языковую модель, прочитает список твоих твитов (или любой текстовый файл), обучит простенький классификатор сарказма и будет выдавать мемы, которые идеально попадают в настроение "Я не могу". ```text # requirements.txt transformers==4.40.0 torch==2.2.0 datasets==2.20.0 scikit-learn==1.5.0 pillow==10.4.0 ``` ```python # meme_gen.py import random import re import os import torch from transformers import AutoModelForCausalLM, AutoTokenizer from sklearn.linear_model import LogisticRegression from sklearn.feature_extraction.text import CountVectorizer from PIL import Image, ImageDraw, ImageFont import textwrap # 1️⃣ Загружаем небольшую языковую модель (можно заменить на любую модель из HuggingFace) MODEL_NAME = "gpt2" tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) model = AutoModelForCausalLM.from_pretrained(MODEL_NAME) model.eval() # 2️⃣ Загружаем твои твиты (или любой текст) – убедись, что это простой .txt файл TWEET_FILE = "tweets.txt" if not os.path.exists(TWEET_FILE): print(f"Создай файл {TWEET_FILE} с твоими саркастичными твитами.") exit(1) with open(TWEET_FILE, "r", encoding="utf-8") as f: tweets = [line.strip() for line in f if line.strip()] # 3️⃣ Обучаем классификатор сарказма (очень быстро, но не идеально) vectorizer = CountVectorizer(ngram_range=(1,2), min_df=1) X = vectorizer.fit_transform(tweets) y = [1 if "sarcasm" in tweet.lower() else 0 for tweet in tweets] clf = LogisticRegression(max_iter=200).fit(X, y) # 4️⃣ Помощник: определяем, в настроении ли предложение "Я не могу" def ican_even(sentence): return re.search(r"\bcan't even\b", sentence.lower()) is not None # 5️⃣ Генерируем текст для мема def generate_meme(seed=""): inputs = tokenizer.encode(seed, return_tensors="pt") with torch.no_grad(): outputs = model.generate(inputs, max_length=50, num_return_sequences=1, pad_token_id=50256) text = tokenizer.decode(outputs[0], skip_special_tokens=True) # Убираем лишние символы в конце return text.strip() # 6️⃣ Рендерим изображение мема def render_meme(text, filename="meme.png"): width, height = 500, 500 background = Image.new("RGB", (width, height), (255, 255, 255)) draw = ImageDraw.Draw(background) try: font = ImageFont.truetype("arial.ttf", 28) except: font = ImageFont.load_default() # Переносим текст на несколько строк lines = textwrap.wrap(text, width=35) y_text = 150 for line in lines: w, h = draw.textsize(line, font=font) draw.text(((width - w) / 2, y_text), line, font=font, fill=(0, 0, 0)) y_text += h + 5 # Подпись снизу caption = "Я не могу" w, h = draw.textsize(caption, font=font) draw.text(((width - w) / 2, height - h - 20), caption, font=font, fill=(255, 0, 0)) background.save(filename) print(f"✅ Мем сохранен в {filename}") # 7️⃣ Основной цикл def main(): while True: # Выбираем случайный seed из твоих твитов seed = random.choice(tweets) meme_text = generate_meme(seed) # Если сгенерированный текст попадает в настроение "Я не могу", показываем его if ican_even(meme_text): render_meme(meme_text) else: print(f"⛔️ Пропущен: {meme_text[:60]}…") # Небольшая пауза if input("Генерировать еще? (y/n) ").lower() != "y": break if __name__ == "__main__": main() ``` ### Как это работает 1. **Языковая модель:** GPT‑2 (небольшая, но быстрая) выдает короткий мем, основываясь на seed-твите. 2. **Классификатор:** Использует `CountVectorizer` + `LogisticRegression` для флага предложений, которые выглядят саркастичными. 3. **Фильтр настроения:** Если сгенерированный текст содержит "Я не могу", он рендерится на холст 500x500 с красной подписью. 4. **Запуск:** Просто нажимай `y`, когда тебя спрашивают, чтобы генератор мемов продолжал кричать.
Fora Fora
Nice, GPT‑2 is a fossilized relic, but it’ll spit something fast. The sarcasm hack is a quick stop‑gap, maybe swap to a real sarcasm dataset later. The meme canvas is static, we could add dynamic resizing or emojis. What next? Want to throw in a mood‑based filter or a “cannot even” detector?