1. Work
  2. Esports Toxicity Sentiment Analyzer
  3. Docs

Esports Toxicity Sentiment Analyzer

Text classifier that tracks game-chat toxicity over a match and links spikes to match events.

2 min read

Source on GitHub

Trains a text classifier on a simulated game-chat log and visualizes how chat toxicity spikes around negative match events (team wipes, lost objectives) and stays low around positive ones (boss kills, clutches).

Data source: synthetic, not scraped. generate_data.py builds a local ~33-minute simulated match with a chat message every 2-6 seconds and 10 fixed match events. No network calls, no Twitch/game-server API, no API keys. Toxic/mildly-toxic messages are deliberately weighted to cluster around the negative events so the resulting chart has a real signal to show.

Run it

cd "06-toxicity-sentiment-analyzer"
../.venv10projects/bin/python generate_data.py    # writes data/chat_log.csv, data/match_events.csv
../.venv10projects/bin/python train_classifier.py # trains + evaluates the classifier, saves model.joblib
../.venv10projects/bin/python analyze.py           # scores the full log, saves toxicity_timeline.png

(Uses the shared .venv10projects venv one level up: pandas, scikit-learn, matplotlib are already installed there.)

What each file does

  • generate_data.py: generates data/chat_log.csv (timestamp, player, message, toxicity_label: neutral/mild/toxic) and data/match_events.csv (timestamp, event, negative flag).
  • train_classifier.py: TF-IDF (1-2 grams) + LogisticRegression, 75/25 train/test split, reports accuracy/precision/recall/F1 on the held-out set, asserts accuracy > 0.7 as a correctness self-check, saves model.joblib.
  • analyze.py: loads the trained model, scores every message in the full log, computes a rolling (1-minute window) toxic-message-rate time series, and plots it against the match-event markers, saved as toxicity_timeline.png. Also writes data/chat_log_scored.csv with per-message predictions.

Held-out classifier metrics (this run)

Accuracy:  0.951
Precision: 1.000
Recall:    0.818
F1:        0.900

What the chart shows

toxicity_timeline.png plots the rolling toxic-message rate (%) over match time, with dashed vertical markers for match events (red = negative: wipes/losses, green = positive: boss kills/clutches). The toxicity rate visibly spikes to 50-70% right after every negative event and drops back toward baseline (5-15%) during calm/positive stretches. This shows the classifier + aggregation pipeline correctly surfaces toxicity spikes at critical game moments.

Simplified vs. full spec

  • Synthetic chat log, not real scraped Twitch/game-server chat. Add when: a Twitch IRC/EventSub or game-server log connector is available and you’re OK handling live PII/moderation concerns.
  • Classic TF-IDF + LogisticRegression, not a transformer-based hate-speech model. Add when: you need to catch obfuscated/contextual toxicity (leet- speak, sarcasm) that bag-of-words can’t. Swap in a fine-tuned DistilBERT/Perspective-API-style model.

Support

Submit issues, questions, or bug reports to the GitHub issue tracker: https://github.com/ADM1SH/toxicity-sentiment-analyzer/issues

Roadmap

  • Done: Core architecture and baseline implementation.
  • Done: Functional verification and test coverage.
  • To do: Add multi-label toxicity classification (harassment, spam, obscenity)
  • To do: Deploy low-latency REST inference endpoint

Contributing

Contributions are welcome.

  1. Fork the repository.
  2. Create a feature branch: git checkout -b feature/improvement.
  3. Commit your changes: git commit -m "feat: enhance functionality".
  4. Push to the branch: git push origin feature/improvement.
  5. Open a Pull Request.

Authors and Acknowledgment

  • Adam Anwar (ADM1SH) - Lead architect and developer.
  • Developed by Adam Anwar for esports competitive chat moderation analysis.

License

Licensed under the MIT License. See LICENSE for details.

Project Status

Complete esports chat classification engine.

Back to top