Обучение NLP-модели для анализа Reddit (r/cryptocurrency)
Reddit — уникальная среда: длинные дискуссии, высококачественные аналитические посты, DD (Due Diligence) разборы проектов. В отличие от Twitter с его моментальными реакциями, Reddit отражает более взвешенные и долгосрочные мнения сообщества.
Ключевые сабреддиты
- r/CryptoCurrency (6M+): общие дискуссии, новости, sentiment
- r/Bitcoin (5M+): BTC-ориентированное сообщество
- r/ethfinance: высококачественные ETH дискуссии
- r/defi: DeFi-ориентированный контент
- r/CryptoMoonShots: speculativealtcoin посты (высокий шум)
- r/Buttcoin: скептики/критики (обратный sentiment индикатор)
Reddit API (PRAW)
import praw
from datetime import datetime
import asyncpraw # async версия
class RedditCryptoCollector:
def __init__(self, client_id, client_secret, user_agent):
self.reddit = asyncpraw.Reddit(
client_id=client_id,
client_secret=client_secret,
user_agent=user_agent
)
async def collect_subreddit_posts(self, subreddit_name, limit=100,
sort='new', time_filter='day'):
subreddit = await self.reddit.subreddit(subreddit_name)
posts = []
async for post in subreddit.top(time_filter=time_filter, limit=limit):
posts.append({
'id': post.id,
'title': post.title,
'text': post.selftext,
'score': post.score,
'upvote_ratio': post.upvote_ratio,
'num_comments': post.num_comments,
'created_utc': datetime.fromtimestamp(post.created_utc),
'author': str(post.author),
'subreddit': subreddit_name,
'flair': post.link_flair_text
})
return posts
async def collect_comments(self, post_id, limit=50):
"""Собираем топовые комментарии к посту"""
submission = await self.reddit.submission(id=post_id)
await submission.comments.replace_more(limit=3)
comments = []
for comment in submission.comments.list()[:limit]:
if hasattr(comment, 'body') and len(comment.body) > 20:
comments.append({
'body': comment.body,
'score': comment.score,
'created_utc': datetime.fromtimestamp(comment.created_utc)
})
return comments
Специфика Reddit контента
Reddit посты значительно длиннее твитов. DD посты могут содержать 2000+ слов. Нужно:
- Chunk-based processing: разбить длинный текст на чанки, классифицировать каждый, агрегировать.
def analyze_long_post(text, analyzer, chunk_size=512, overlap=50):
tokens = text.split()
chunks = []
for i in range(0, len(tokens), chunk_size - overlap):
chunk = ' '.join(tokens[i:i+chunk_size])
chunks.append(chunk)
chunk_scores = [analyzer.analyze(chunk)['score'] for chunk in chunks]
# Взвешиваем: начало и конец поста важнее
weights = np.ones(len(chunk_scores))
if len(weights) > 2:
weights[0] = 1.5 # заголовок/начало
weights[-1] = 1.3 # заключение
return np.average(chunk_scores, weights=weights)
- Title vs body weighting: заголовок поста часто информативнее тела. Weight = 2:1.
Reddit-specific signals
Upvote ratio: > 0.85 = consensus positive. < 0.50 = controversial.
Comment velocity: резкий рост комментариев за 1h сигнализирует о новом вирусном посту.
Hot algorithm: Reddit's hot score = (upvotes - downvotes) / (time_since_post)^gravity. Высокий score = trending content.
Awards: посты с Gold/Platinum awards получили значительное взаимодействие.
def calculate_reddit_engagement_score(post):
score = post['score']
ratio = post['upvote_ratio']
comments = post['num_comments']
# Стандартизированный engagement
engagement = (
np.log1p(score) * ratio +
np.log1p(comments) * 0.5
)
return engagement
Due Diligence (DD) анализ
DD посты на Reddit — ценнейший источник. Они содержат глубокий анализ проектов, часто опережающий mainstream media.
DD detection: посты с флэром "DD" или содержащие ключевые слова ("tokenomics", "roadmap", "team analysis", "red flags"):
def is_dd_post(post):
dd_indicators = [
post.get('flair', '').lower() in ['dd', 'analysis', 'research'],
any(kw in post['text'].lower() for kw in
['tokenomics', 'whitepaper', 'team analysis', 'red flag',
'due diligence', 'fundamentals', 'on-chain data']),
len(post['text'].split()) > 500 # длинный пост
]
return sum(dd_indicators) >= 2
Для DD постов: более детальный анализ, включая оценку конкретных утверждений о проекте.
Long-term sentiment model
Reddit sentiment медленнее реагирует на события (период полураспада ~24-72 часа vs ~1-4 часа для Twitter). Для long-term сигналов лучше использовать 7-дневный rolling average.
Monthly Roundup анализ: r/CryptoCurrency публикует ежемесячные roundup посты. Топ-комментарии содержат наиболее обсуждаемые темы — качественный сигнал для макро позиционирования.
Мониторинг конкретных токенов
Для каждого токена в watchlist мониторим упоминания:
async def monitor_token_mentions(token_symbol, subreddits, lookback_hours=24):
search_terms = [token_symbol, get_token_name(token_symbol)]
mentions = []
for subreddit in subreddits:
posts = await search_subreddit(subreddit, ' OR '.join(search_terms),
lookback_hours)
for post in posts:
sentiment = analyzer.analyze(post['title'] + ' ' + post['text'][:200])
mentions.append({
'token': token_symbol,
'sentiment': sentiment['score'],
'engagement': calculate_reddit_engagement_score(post),
'subreddit': subreddit
})
if mentions:
avg_sentiment = np.average(
[m['sentiment'] for m in mentions],
weights=[m['engagement'] for m in mentions]
)
return avg_sentiment, len(mentions)
return 0, 0
Разрабатываем систему анализа Reddit с PRAW-based сбором, chunk-based NLP для длинных постов, DD detection, mention monitoring по токенам и агрегацией long-term sentiment индекса.







