8.6.3. Demo: Sentiment Analysis on Reddit#

Choose Social Media Platform: Reddit | Discord | Bluesky | No Coding

Now let’s try using sentiment analysis (and loop variables) on Reddit:

We’ll start by doing our normal steps to load Reddit PRAW (or fake praw)

Reddit PRAW Setup#

import praw

(optional) make a fake praw connection with the fake_praw library

For testing purposes, we’ve added this line of code, which loads a fake version of praw, so it wont actually connect to reddit. If you want to try to actually connect to reddit, don’t run this line of code.

%run ../../fake_apis/fake_praw.ipynb
Fake praw is replacing the praw library. Fake praw doesn't need real passwords, and prevents you from accessing real reddit
# Load all your developer access passwords into Python
# TODO: Put your reddit username, password, and special developer access passwords below:
username="fake_reddit_username"
password="sa@#4*fdf_fake_password_$%DSG#%DG"
client_id="45adf$TW_fake_client_id_JESdsg1O"
client_secret="56sd_fake_client_secret_%Yh%"
# Give the praw code your reddit account info so
# it can perform reddit actions
reddit = praw.Reddit(
    username=username, password=password,
    client_id=client_id, client_secret=client_secret,
    user_agent="a custom python script"
)
Fake praw is pretending to collect account info to use on reddit

Sentiment Analysis#

load sentiment analysis library and make analyzer#

import nltk
nltk.download(["vader_lexicon"])
from nltk.sentiment import SentimentIntensityAnalyzer
sia = SentimentIntensityAnalyzer()
[nltk_data] Downloading package vader_lexicon to
[nltk_data]     C:\Users\kmthayer\AppData\Roaming\nltk_data...
[nltk_data]   Package vader_lexicon is already up-to-date!

loop through submissions, finding average sentiment#

We can now combine our previous examples of looping through reddit submissions with what we just learned of sentiment analysis and looping variables to find the average sentiment of a set of submission titles.

num_submissions = 0
total_sentiment = 0

# Look up the subreddit "cuteanimals", then find the "hot" list, getting up to 10 submission
submissions = reddit.subreddit("cuteanimals").hot(limit=10)

# Turn the submission results into a Python List
submissions_list = list(submissions)

for submission in submissions_list:
    #calculate sentiment
    submission_sentiment = sia.polarity_scores(submission.title)["compound"]
    num_submissions += 1
    total_sentiment += submission_sentiment

    print("Sentiment: " + str(submission_sentiment))
    print("   Submission Title: " + submission.title)
    print()



average_sentiment = total_sentiment / num_submissions
print("Average sentiment was " + str(average_sentiment))
Fake praw is pretending to select the subreddit: cuteanimals
Sentiment: 0.5093
   Submission Title: Look at my cute dog!

Sentiment: 0.0
   Submission Title: A baby lizard!

Sentiment: 0.6239
   Submission Title: The cutest bird ever!

Average sentiment was 0.3777333333333333

We can now see the average sentiment of a set of reddit post titles based on our search of a subreddit!

If you use your reddit bot keys, you can change the subreddit to be whatever one you want and see whether people are posting positively or negatively in it.

note: You can change limit=10 to go up higher to get more submissions at a time to find the average of