{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Introduction to Text Analysis in Python\n",
"\n",
"I am not an NLP person and this is outside of my expertise, but I know enough to give a basic introduction to text analysis and text processing tools.\n",
"\n",
"For this tutorial + homework, I'm going to use data from Reddit. I retrieved it from PushShift, using the following code. Unfortunately, Pushshift is not currently available for researchers so this code won't work and you'll just have to grab the version of the data that I've linked to below."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import requests\n",
"from datetime import datetime\n",
"import time\n",
"import pandas as pd\n",
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"from bertopic import BERTopic"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"```python\n",
"## Code used to create the dataset - no longer works\n",
"\n",
"endpt = 'https://api.pushshift.io/reddit/search/submission'\n",
"\n",
"subreddits = ['Coronavirus', 'politics', 'aww']\n",
"\n",
"# Start and end date (pushshift expects these in epoch time)\n",
"start_date = int(datetime.strptime('2021-09-11', '%Y-%m-%d').timestamp())\n",
"end_date = int(datetime.strptime('2021-09-25', '%Y-%m-%d').timestamp())\n",
"\n",
"\n",
"def get_posts(subreddit, before = end_date, after = start_date, result = None, min_comments = 20):\n",
" params = {'subreddit': subreddit,\n",
" 'num_comments': f'>{min_comments}',\n",
" 'before': before,\n",
" 'size': 500\n",
" }\n",
" if result == None:\n",
" result = []\n",
" r = requests.get(endpt, params=params)\n",
" print(r.url)\n",
" print(datetime.fromtimestamp(before))\n",
" for item in r.json()['data']:\n",
" created_time = item['created_utc']\n",
" if created_time < after: # If we've reached the earliest we want, then return\n",
" print(len(result))\n",
" return result\n",
" else:\n",
" try:\n",
" result.append((item['title'],item['selftext'], created_time, subreddit))\n",
" except KeyError:\n",
" print(item)\n",
" time.sleep(.5)\n",
" return get_posts(subreddit, before = created_time, result = result)\n",
"\n",
"\n",
"sr_data = []\n",
"for subreddit in subreddits:\n",
" new_data = get_posts(subreddit)\n",
" sr_data = sr_data + new_data\n",
"sr = pd.DataFrame(sr_data, columns = ['title', 'selftext', 'date', 'subreddit'])\n",
"sr.date = pd.to_datetime(sr.date, unit='s')\n",
"sr.to_csv('./sr_post_data.csv', index = False)\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"## Code to download and import the file (DO run this code)\n",
"sr = pd.read_csv('https://raw.githubusercontent.com/jdfoote/Intro-to-Programming-and-Data-Science/refs/heads/master/resources/data/sr_post_data.csv')"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# Change the date to a datetime, and put it in the index\n",
"sr.index = pd.to_datetime(sr.date)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
title
\n",
"
selftext
\n",
"
date
\n",
"
subreddit
\n",
"
\n",
"
\n",
"
date
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
2021-09-25 03:59:39
\n",
"
FALSE: US records 12,366 deaths due to COVID-1...
\n",
"
NaN
\n",
"
2021-09-25 03:59:39
\n",
"
Coronavirus
\n",
"
\n",
"
\n",
"
2021-09-25 03:55:12
\n",
"
Researchers who developed the mRNA technology ...
\n",
"
NaN
\n",
"
2021-09-25 03:55:12
\n",
"
Coronavirus
\n",
"
\n",
"
\n",
"
2021-09-25 02:51:33
\n",
"
The United States Completes Donation of 3.5 mi...
\n",
"
NaN
\n",
"
2021-09-25 02:51:33
\n",
"
Coronavirus
\n",
"
\n",
"
\n",
"
2021-09-25 02:25:46
\n",
"
When will the pandemic end? Models project a d...
\n",
"
NaN
\n",
"
2021-09-25 02:25:46
\n",
"
Coronavirus
\n",
"
\n",
"
\n",
"
2021-09-25 01:55:31
\n",
"
Thousands of teachers may be forced out of NYC...
\n",
"
NaN
\n",
"
2021-09-25 01:55:31
\n",
"
Coronavirus
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" title \\\n",
"date \n",
"2021-09-25 03:59:39 FALSE: US records 12,366 deaths due to COVID-1... \n",
"2021-09-25 03:55:12 Researchers who developed the mRNA technology ... \n",
"2021-09-25 02:51:33 The United States Completes Donation of 3.5 mi... \n",
"2021-09-25 02:25:46 When will the pandemic end? Models project a d... \n",
"2021-09-25 01:55:31 Thousands of teachers may be forced out of NYC... \n",
"\n",
" selftext date subreddit \n",
"date \n",
"2021-09-25 03:59:39 NaN 2021-09-25 03:59:39 Coronavirus \n",
"2021-09-25 03:55:12 NaN 2021-09-25 03:55:12 Coronavirus \n",
"2021-09-25 02:51:33 NaN 2021-09-25 02:51:33 Coronavirus \n",
"2021-09-25 02:25:46 NaN 2021-09-25 02:25:46 Coronavirus \n",
"2021-09-25 01:55:31 NaN 2021-09-25 01:55:31 Coronavirus "
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sr.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Summarization\n",
"\n",
"There are some simple ways to summarize text data that can be useful, without using any special NLP tools.\n",
"\n",
"\n",
"For example, it can be very interesting to see how the frequency of a term changes over time:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# This code plots the frequency of \"COVID-19\", \"Coronavirus\", and \"Trump\" each day\n",
"\n",
"for term in [\"COVID-19\", \"Coronavirus\", \"Trump\"]:\n",
" curr_df = sr.loc[sr.title.str.contains(term) | sr.selftext.str.contains(term)]\n",
" posts_per_day = curr_df.resample('D').size()\n",
" posts_per_day.plot(label = term)\n",
"\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### EXERCISE 1\n",
"\n",
"Modify the code above to plot how often \"Coronavirus\" is used in each of the three subreddits over time"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"#### YOUR CODE HERE\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A similar approach is dictionary-based. The most well-known version of this is [LIWC](http://liwc.wpengine.com/), but the basic idea is that you create a set of words that are associated with a construct you are interested in, and you count how often they appear.\n",
"\n",
"This is a very simple example of how you might do this to look for gendered words among our subreddits"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"# First we change NAs and removed/deleted to empty strings\n",
"sr.loc[(pd.isna(sr.selftext)) | (sr.selftext.isin(['[removed]', '[deleted]'])), 'selftext'] = ''\n",
"sr['all_text'] = sr.title + ' ' + sr.selftext"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"male_words = ['he', 'his']\n",
"female_words = ['she', 'hers']\n",
"\n",
"# This puts all of the text of each subreddit into lists\n",
"def string_to_list(x):\n",
" return ' '.join(x).split()\n",
"grouped_text = sr.groupby('subreddit').all_text.apply(string_to_list)\n",
"\n",
"# Then, we count how often each type of words appears in each subreddit\n",
"agg = grouped_text.transform({'proportionMale': lambda x: sum([x.count(y) for y in male_words])/len(x),\n",
" 'proportionFemale': lambda x: sum([x.count(y) for y in female_words])/len(x)}\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"subreddit\n",
"Coronavirus [FALSE:, US, records, 12,366, deaths, due, to,...\n",
"aww [This, little, guy, (girl), snuck, into, my, o...\n",
"politics [CNN, Expert, Claims, Black, Voters, Don’t, Ha...\n",
"Name: all_text, dtype: object"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"grouped_text"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
proportionMale
\n",
"
proportionFemale
\n",
"
\n",
"
\n",
"
subreddit
\n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
Coronavirus
\n",
"
0.001874
\n",
"
0.000234
\n",
"
\n",
"
\n",
"
aww
\n",
"
0.011129
\n",
"
0.003251
\n",
"
\n",
"
\n",
"
politics
\n",
"
0.003950
\n",
"
0.000525
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" proportionMale proportionFemale\n",
"subreddit \n",
"Coronavirus 0.001874 0.000234\n",
"aww 0.011129 0.003251\n",
"politics 0.003950 0.000525"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"agg"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### EXERCISE 2\n",
"\n",
"One of the trickiest parts of analysis is getting the data in the form that you want it in order to analyze/visualize it. \n",
"\n",
"I think a good visualization for this would be a barplot showing how often male and female word types appear for each subreddit. I'll give you the final call to produce the plot:\n",
"\n",
"`sns.barplot(x='subreddit', y='proportion', hue = 'word_gender', data = agg_df_long)`\n",
"\n",
"Now, see if you can get the data in shape so that this code actually works! :)\n",
"\n",
"*Hint: You'll want to use [wide to long](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.wide_to_long.html)*"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
"
],
"text/plain": [
" X A(weekly) B(weekly)\n",
"id year \n",
"0 2010 0 0.548814 0.437587\n",
"1 2010 1 0.715189 0.891773\n",
"2 2010 1 0.602763 0.963663\n",
"0 2011 0 0.544883 0.383442\n",
"1 2011 1 0.423655 0.791725\n",
"2 2011 1 0.645894 0.528895"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.wide_to_long(df, # The data\n",
" # The prefixes for the data columns. These will become column names that hold data values.\n",
" stubnames = ['A(weekly)', 'B(weekly)'], \n",
" # i is a column which uniquely identifies each row\n",
" i='id',\n",
" # j is what you want to call the prefix\n",
" j='year',\n",
" # sep is a string that is between the stubnames and the values which will go in j\n",
" sep='-')"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"## Exercise 2 Code\n",
"## This code will get the df ready for pd.wide_to_long (try printing agg_df after running these to see what it looks like)\n",
"agg_df = agg.unstack(level=0)\n",
"agg_df = agg_df.reset_index()\n",
"\n",
"### Your code here"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
level_0
\n",
"
subreddit
\n",
"
0
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
proportionMale
\n",
"
Coronavirus
\n",
"
0.001874
\n",
"
\n",
"
\n",
"
1
\n",
"
proportionMale
\n",
"
aww
\n",
"
0.011129
\n",
"
\n",
"
\n",
"
2
\n",
"
proportionMale
\n",
"
politics
\n",
"
0.003950
\n",
"
\n",
"
\n",
"
3
\n",
"
proportionFemale
\n",
"
Coronavirus
\n",
"
0.000234
\n",
"
\n",
"
\n",
"
4
\n",
"
proportionFemale
\n",
"
aww
\n",
"
0.003251
\n",
"
\n",
"
\n",
"
5
\n",
"
proportionFemale
\n",
"
politics
\n",
"
0.000525
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" level_0 subreddit 0\n",
"0 proportionMale Coronavirus 0.001874\n",
"1 proportionMale aww 0.011129\n",
"2 proportionMale politics 0.003950\n",
"3 proportionFemale Coronavirus 0.000234\n",
"4 proportionFemale aww 0.003251\n",
"5 proportionFemale politics 0.000525"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"agg_df"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'agg_df_long' is not defined",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[0;32mIn [15], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;66;03m## Once you've created agg_df_long with the columns proportion and word_gender, you should be able to run this\u001b[39;00m\n\u001b[0;32m----> 2\u001b[0m sns\u001b[38;5;241m.\u001b[39mbarplot(x\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124msubreddit\u001b[39m\u001b[38;5;124m'\u001b[39m, y\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mproportion\u001b[39m\u001b[38;5;124m'\u001b[39m, hue \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mword_gender\u001b[39m\u001b[38;5;124m'\u001b[39m, data \u001b[38;5;241m=\u001b[39m \u001b[43magg_df_long\u001b[49m)\n",
"\u001b[0;31mNameError\u001b[0m: name 'agg_df_long' is not defined"
]
}
],
"source": [
"## Once you've created agg_df_long with the columns proportion and word_gender, you should be able to run this\n",
"sns.barplot(x='subreddit', y='proportion', hue = 'word_gender', data = agg_df_long)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### EXERCISE 3\n",
"\n",
"Make your own analysis, with a different set of terms"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## TF-IDF\n",
"\n",
"There are more complicated approaches to summarization in Python, including using LIWC (see [here](https://pypi.org/project/liwc/)).\n",
"\n",
"Almost all approaches are based on a \"bag of words\" approach, where the order of words is totally ignored. This is obviously a big simplification, but can often work quite well.\n",
"\n",
"One thing we might want to do is to differentiate groups of texts based on how often words are used. The naive way is to just count how often words appear. However, the most common words will always appear first. So, computational linguists came up with \"term frequency--inverse document frequency\" (TF-IDF). This normalizes words based on how often they appear across groups of texts. A detailed explanation with code is [here](https://towardsdatascience.com/natural-language-processing-feature-engineering-using-tf-idf-e8b9d00e7e76).\n",
"\n",
"There are a number of NLP / text analysis libraries in Python. The one I'm most familiar with is scikit-learn, which is a machine learning library. NLTK, SpaCy, and textblob are some of the most popular. Here is how to run TF-IDF in scikit-learn."
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"## First, we prepare the data for the TF-IDF tool.\n",
"# We want each subreddit to be represented by a list of strings.\n",
"# So, we take our grouped_text (which is a list of lists of words)\n",
"# and change it into a list of three really long strings, where each\n",
"# string is all the words that appeared for that subreddit.\n",
"\n",
"# This called a 'list comprehension'\n",
"as_text = [' '.join(x) for x in grouped_text]\n",
"\n",
"# It is equivalent to the following for loop\n",
"as_text = []\n",
"for x in grouped_text:\n",
" as_text.append(' '.join(x))"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.feature_extraction.text import TfidfVectorizer\n",
"\n",
"# Just gets the 5000 most common words\n",
"vectorizer = TfidfVectorizer(max_features=5000, stop_words='english')\n",
"\n",
"tfidf_result = vectorizer.fit_transform(as_text)\n",
"feature_names = vectorizer.get_feature_names_out()\n",
"dense = tfidf_result.todense()\n",
"denselist = dense.tolist()\n",
"df = pd.DataFrame(denselist, columns=feature_names).transpose()\n",
"df.columns = list(grouped_text.index)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
Coronavirus
\n",
"
aww
\n",
"
politics
\n",
"
\n",
" \n",
" \n",
"
\n",
"
cat
\n",
"
0.000000
\n",
"
0.409908
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
dog
\n",
"
0.000000
\n",
"
0.286604
\n",
"
0.000858
\n",
"
\n",
"
\n",
"
little
\n",
"
0.000000
\n",
"
0.266492
\n",
"
0.003431
\n",
"
\n",
"
\n",
"
just
\n",
"
0.006542
\n",
"
0.206955
\n",
"
0.031306
\n",
"
\n",
"
\n",
"
cute
\n",
"
0.000000
\n",
"
0.171897
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
girl
\n",
"
0.000000
\n",
"
0.171897
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
baby
\n",
"
0.001308
\n",
"
0.171811
\n",
"
0.000666
\n",
"
\n",
"
\n",
"
new
\n",
"
0.056262
\n",
"
0.171811
\n",
"
0.106574
\n",
"
\n",
"
\n",
"
today
\n",
"
0.000000
\n",
"
0.145816
\n",
"
0.001715
\n",
"
\n",
"
\n",
"
puppy
\n",
"
0.000000
\n",
"
0.145451
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
adopted
\n",
"
0.000000
\n",
"
0.132228
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
old
\n",
"
0.005234
\n",
"
0.117144
\n",
"
0.003997
\n",
"
\n",
"
\n",
"
got
\n",
"
0.011776
\n",
"
0.117144
\n",
"
0.009991
\n",
"
\n",
"
\n",
"
good
\n",
"
0.000000
\n",
"
0.115647
\n",
"
0.003431
\n",
"
\n",
"
\n",
"
think
\n",
"
0.000000
\n",
"
0.110619
\n",
"
0.015439
\n",
"
\n",
"
\n",
"
like
\n",
"
0.009159
\n",
"
0.109335
\n",
"
0.018650
\n",
"
\n",
"
\n",
"
kitten
\n",
"
0.000000
\n",
"
0.105783
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
suggestions
\n",
"
0.000000
\n",
"
0.105783
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
guy
\n",
"
0.000000
\n",
"
0.105591
\n",
"
0.000858
\n",
"
\n",
"
\n",
"
help
\n",
"
0.006542
\n",
"
0.097620
\n",
"
0.015320
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Coronavirus aww politics\n",
"cat 0.000000 0.409908 0.000000\n",
"dog 0.000000 0.286604 0.000858\n",
"little 0.000000 0.266492 0.003431\n",
"just 0.006542 0.206955 0.031306\n",
"cute 0.000000 0.171897 0.000000\n",
"girl 0.000000 0.171897 0.000000\n",
"baby 0.001308 0.171811 0.000666\n",
"new 0.056262 0.171811 0.106574\n",
"today 0.000000 0.145816 0.001715\n",
"puppy 0.000000 0.145451 0.000000\n",
"adopted 0.000000 0.132228 0.000000\n",
"old 0.005234 0.117144 0.003997\n",
"got 0.011776 0.117144 0.009991\n",
"good 0.000000 0.115647 0.003431\n",
"think 0.000000 0.110619 0.015439\n",
"like 0.009159 0.109335 0.018650\n",
"kitten 0.000000 0.105783 0.000000\n",
"suggestions 0.000000 0.105783 0.000000\n",
"guy 0.000000 0.105591 0.000858\n",
"help 0.006542 0.097620 0.015320"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# This shows the values with the highest TF-IDF for r/Coronavirus\n",
"df.sort_values('aww', ascending=False).head(20)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Relative frequency\n",
"\n",
"\n",
"An even simpler approach that works pretty well when comparing just two \"documents\" is to rank how much more often a word appears in one rather than the other.\n"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"politics_str = ' '.join(sr.loc[sr.subreddit == 'politics', 'all_text']).lower()\n",
"covid_str = ' '.join(sr.loc[sr.subreddit == 'Coronavirus', 'all_text']).lower()"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
"def word_ratios(text):\n",
" counts = {}\n",
" tot_words = 0\n",
" for word in text.split():\n",
" counts[word] = counts.get(word, 0) + 1\n",
" tot_words +=1\n",
" result = {}\n",
" for word, count in counts.items():\n",
" result[word] = count/tot_words\n",
" return result\n",
" \n",
" \n",
"politics_ratio = word_ratios(politics_str)\n",
"covid_ratio = word_ratios(covid_str)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [],
"source": [
"ratio_diff = []\n",
"for word in politics_ratio:\n",
" if word in covid_ratio:\n",
" ratio_diff.append((word, politics_ratio[word] - covid_ratio[word]))"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"ratio_diff = sorted(ratio_diff, key = lambda x: x[1])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here are the words that appear more often in r/Coronavirus"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[('covid-19', -0.020888477566596217),\n",
" ('covid', -0.012544929169800238),\n",
" ('vaccine', -0.00592151224450452),\n",
" ('more', -0.005169286900006672),\n",
" ('information', -0.004752876614738616),\n",
" ('our', -0.004724119177071341),\n",
" ('for', -0.004715598694414918),\n",
" ('vaccination', -0.004380547049728374),\n",
" ('are', -0.003921754318080493),\n",
" ('in', -0.003903396786161282),\n",
" ('health', -0.0037529976515266027),\n",
" ('of', -0.0036447707007916177),\n",
" ('there', -0.0033541814836345095),\n",
" ('vaccines', -0.0031055833011634434),\n",
" ('cases', -0.0030923399997225182)]"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ratio_diff[:15]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And here are those that appear more often in r/politics."
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[('biden', 0.008418094533021217),\n",
" ('to', 0.0066828403369883875),\n",
" ('the', 0.004575618874372623),\n",
" ('texas', 0.0032892912474584077),\n",
" ('bill', 0.0030318005794814544),\n",
" ('on', 0.0030221543838544786),\n",
" ('a', 0.002709801382600024),\n",
" ('that', 0.002206546223422705),\n",
" ('court', 0.0021136522597004167),\n",
" ('law', 0.001782188016405662),\n",
" ('his', 0.0016662137019796605),\n",
" ('was', 0.0016506995657533103),\n",
" ('from', 0.00162875463244231),\n",
" ('calls', 0.0016230775454787474),\n",
" ('white', 0.001588833874483722)]"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ratio_diff[-15:][::-1] # The [::-1] just reverses the list"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Classification\n",
"\n",
"Another commonly-used tool in NLP is classification. This is a \"supervised machine learning\" model, where you build a \"training set\" of items that are classified, and a machine learner uses that set to predict the classification of new items.\n",
"\n",
"One very common example is sentiment. In sentiment analysis, a random set of texts is manually classified as positive, neutral, or negative. This set is then used to train a classifier to predict the sentiment of unseen texts.\n",
"\n",
"It's beyond the scope of this class to learn how to do machine learning, but there are also pre-trained classifiers. One I found is from [textblob](https://textblob.readthedocs.io/en/dev/).\n",
"\n",
"NLTK also has a pre-trained classifier, trained on social media data, called VADER. That is pretty similar to what we're looking at, so this example shows how to use it.\n",
"\n",
"NLTK is interesting - the core is installed in Anaconda, so you should have it. However, to get various pieces to work you need to install them. So, we need to start by installing the vader lexicon."
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"[nltk_data] Downloading package vader_lexicon to\n",
"[nltk_data] /home/jeremy/nltk_data...\n",
"[nltk_data] Package vader_lexicon is already up-to-date!\n"
]
},
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import nltk\n",
"nltk.downloader.download('vader_lexicon')"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
"from nltk.sentiment.vader import SentimentIntensityAnalyzer\n",
"\n",
"analyzer = SentimentIntensityAnalyzer()\n",
"\n",
"def get_sentiment(sentence):\n",
" vs = analyzer.polarity_scores(sentence)\n",
" return vs['compound']\n",
"\n",
"sr['sentiment'] = sr.all_text.apply(get_sentiment)"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
title
\n",
"
selftext
\n",
"
date
\n",
"
subreddit
\n",
"
all_text
\n",
"
sentiment
\n",
"
\n",
"
\n",
"
date
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
2021-09-24 15:18:15
\n",
"
We’re the League of Women Voters! We launched ...
\n",
"
Hi! We’re activists and experts from the Leagu...
\n",
"
2021-09-24 15:18:15
\n",
"
politics
\n",
"
We’re the League of Women Voters! We launched ...
\n",
"
0.9822
\n",
"
\n",
"
\n",
"
2021-09-20 17:37:13
\n",
"
The \"What happened in your state last week?\" M...
\n",
"
Welcome to the 'What happened in your state la...
\n",
"
2021-09-20 17:37:13
\n",
"
politics
\n",
"
The \"What happened in your state last week?\" M...
\n",
"
0.9671
\n",
"
\n",
"
\n",
"
2021-09-13 16:08:17
\n",
"
The \"What happened in your state last week?\" M...
\n",
"
Welcome to the 'What happened in your state la...
\n",
"
2021-09-13 16:08:17
\n",
"
politics
\n",
"
The \"What happened in your state last week?\" M...
\n",
"
0.9671
\n",
"
\n",
"
\n",
"
2021-09-17 16:05:41
\n",
"
Free Chat Friday Thread
\n",
"
It's finally Friday! That means it's time to s...
\n",
"
2021-09-17 16:05:41
\n",
"
politics
\n",
"
Free Chat Friday Thread It's finally Friday! T...
\n",
"
0.9650
\n",
"
\n",
"
\n",
"
2021-09-14 02:54:07
\n",
"
Hello I know I'm different but my beautiful he...
\n",
"
\n",
"
2021-09-14 02:54:07
\n",
"
aww
\n",
"
Hello I know I'm different but my beautiful he...
\n",
"
0.9587
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" title \\\n",
"date \n",
"2021-09-24 15:18:15 We’re the League of Women Voters! We launched ... \n",
"2021-09-20 17:37:13 The \"What happened in your state last week?\" M... \n",
"2021-09-13 16:08:17 The \"What happened in your state last week?\" M... \n",
"2021-09-17 16:05:41 Free Chat Friday Thread \n",
"2021-09-14 02:54:07 Hello I know I'm different but my beautiful he... \n",
"\n",
" selftext \\\n",
"date \n",
"2021-09-24 15:18:15 Hi! We’re activists and experts from the Leagu... \n",
"2021-09-20 17:37:13 Welcome to the 'What happened in your state la... \n",
"2021-09-13 16:08:17 Welcome to the 'What happened in your state la... \n",
"2021-09-17 16:05:41 It's finally Friday! That means it's time to s... \n",
"2021-09-14 02:54:07 \n",
"\n",
" date subreddit \\\n",
"date \n",
"2021-09-24 15:18:15 2021-09-24 15:18:15 politics \n",
"2021-09-20 17:37:13 2021-09-20 17:37:13 politics \n",
"2021-09-13 16:08:17 2021-09-13 16:08:17 politics \n",
"2021-09-17 16:05:41 2021-09-17 16:05:41 politics \n",
"2021-09-14 02:54:07 2021-09-14 02:54:07 aww \n",
"\n",
" all_text \\\n",
"date \n",
"2021-09-24 15:18:15 We’re the League of Women Voters! We launched ... \n",
"2021-09-20 17:37:13 The \"What happened in your state last week?\" M... \n",
"2021-09-13 16:08:17 The \"What happened in your state last week?\" M... \n",
"2021-09-17 16:05:41 Free Chat Friday Thread It's finally Friday! T... \n",
"2021-09-14 02:54:07 Hello I know I'm different but my beautiful he... \n",
"\n",
" sentiment \n",
"date \n",
"2021-09-24 15:18:15 0.9822 \n",
"2021-09-20 17:37:13 0.9671 \n",
"2021-09-13 16:08:17 0.9671 \n",
"2021-09-17 16:05:41 0.9650 \n",
"2021-09-14 02:54:07 0.9587 "
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sr.sort_values('sentiment', ascending=False).head()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "teaching",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.19"
}
},
"nbformat": 4,
"nbformat_minor": 4
}