Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
newsgrab Example Analysis
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Analyzing newsgrab JSON Data with spaCy and pandas"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Data Preparation](#Data-Preparation)\n",
"\n",
"[Separate and Quanitfy Keyword Tokens](#Separate-and-Quantify-Keyword-Tokens)\n",
"\n",
"[Quantify Noun Chunks](#Quantify-Noun-Chunks)\n",
"\n",
"[Quantify Named Entities](#Quantify-Named-Entities)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data Preparation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Import the necessary libraries and load in each of the JSON files"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sb\n",
"import re\n",
"import spacy\n",
"from collections import Counter\n",
"\n",
"# Load English language pretrained model from spacy\n",
"nlp = spacy.load(\"en_core_web_sm\")\n",
"\n",
"# Set the dataframe row column widths to show full text\n",
"from pandas.io.json import json_normalize\n",
"pd.set_option('display.max_colwidth', None)\n",
"\n",
"with open('output_1.json',encoding=\"utf8\") as f1, open('output_2.json',encoding=\"utf8\") as f2, open('output_3.json',encoding=\"utf8\") as f3, open('output_special.json',encoding=\"utf8\") as f4:\n",
" list1 = json.load(f1)\n",
" list2 = json.load(f2)\n",
" list3 = json.load(f3)\n",
" list4 = json.load(f4)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Normalize the JSON files with pandas and return dataframe objects."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"search_data1 = pd.json_normalize(list1, record_path='results', meta='search_term',\n",
" record_prefix='results')\n",
"search_data2 = pd.json_normalize(list2, record_path='results', meta='search_term',\n",
" record_prefix='results')\n",
"search_data3 = pd.json_normalize(list3, record_path='results', meta='search_term',\n",
" record_prefix='results')\n",
"search_data4 = pd.json_normalize(list4, record_path='results', meta='search_term',\n",
" record_prefix='results')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Merge the four dataframes into one using pandas concatenate function."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>results0</th>\n",
" <th>search_term</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Student from Ozark on Adelphi University Spring 2020 Dean’s List</td>\n",
" <td>adelphi university</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Kaitlyn Grant Named Among Adelphi University Spring 2020 ...</td>\n",
" <td>adelphi university</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Oxford's Emma Fogarty makes Adelphi University dean's list</td>\n",
" <td>adelphi university</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Wilton Resident Sophia Walsh Named to Adelphi University ...</td>\n",
" <td>adelphi university</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Local Students Named to Adelphi University Spring 2020 ...</td>\n",
" <td>adelphi university</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" results0 \\\n",
"0 Student from Ozark on Adelphi University Spring 2020 Dean’s List \n",
"1 Kaitlyn Grant Named Among Adelphi University Spring 2020 ... \n",
"2 Oxford's Emma Fogarty makes Adelphi University dean's list \n",
"3 Wilton Resident Sophia Walsh Named to Adelphi University ... \n",
"4 Local Students Named to Adelphi University Spring 2020 ... \n",
"\n",
" search_term \n",
"0 adelphi university \n",
"1 adelphi university \n",
"2 adelphi university \n",
"3 adelphi university \n",
"4 adelphi university "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"frames = [search_data1, search_data2, search_data3, search_data4]\n",
"df = pd.concat(frames)\n",
"df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Rename the results column to exclude the 0 and create a column with lowercase results output."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"df = df.rename(columns = {\"results0\":\"results\"})\n",
"df['results_lower'] = df['results'].apply(lambda x: x.lower())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Use spaCy to get noun chunks, named entities, and tokens from the results text and append these to respective lists. Turn these into new columns."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"noun_chunks = []\n",
"named_entity = []\n",
"tokens = []\n",
"\n",
"for doc in nlp.pipe(df['results_lower'].astype('unicode').values, batch_size=50,\n",
" n_process=5):\n",
" if doc.is_parsed:\n",
" noun_chunks.append([chunk.text for chunk in doc.noun_chunks])\n",
" named_entity.append([ent.text for ent in doc.ents])\n",
" tokens.append([token.text for token in doc if not token.is_stop and not token.is_punct])\n",
" else:\n",
" noun_chunks.append(None)\n",
" named_entity.append(None) \n",
" tokens.append(None)\n",
" \n",
"df['results_noun_chunks'] = noun_chunks\n",
"df['results_named_entities'] = named_entity\n",
"df['results_tokens_clean'] = tokens"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Separate and Quantify Keyword Tokens"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Clean the output from the tokens column in its entirety by flattening the list, remove special characters, and remove line breaks and the leftovers of ampersands. Then, put in a string list and use the Counter from Python's build-in collections. Get a sample of the 15 most common words."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[('college', 289), ('new', 159), ('university', 116), ('2020', 93), ('students', 87), ('suny', 86), ('covid19', 67), ('school', 66), ('news', 63), ('fall', 63), ('colleges', 59), ('york', 53), ('president', 46), ('named', 44), ('coronavirus', 41)]\n"
]
}
],
"source": [
"flattened_list = [y for x in tokens for y in x]\n",
"\n",
"#remove special characters from tokens list before analyzing\n",
"list_cleaned = [re.sub(r\"[^a-zA-Z0-9]\", \"\", file) for file in flattened_list]\n",
"\n",
"#remove the remainders of what was ampersands and paragraph breaks: \\n and amp\n",
"list_cleaned2 = [re.sub('\\n', \"\", file) for file in list_cleaned]\n",
"\n",
"list_cleaned3 = [re.sub('amp', \"\", file) for file in list_cleaned2]\n",
"\n",
"str_list = list(filter(None, list_cleaned3))\n",
"\n",
"word_freq = Counter(str_list)\n",
"common_words = word_freq.most_common(15)\n",
"print(common_words)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Create a copy of the token list to use in further processing."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"new_str_list = str_list.copy()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Compile a list of words to exclude from the tokens list, using the original search document text. Read in the text file, split on the separator, then join on it to return a string, and replace the commas with a space."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"#compile list of words to exclude from college list\n",
"list_names = open('ny_colleges.txt',encoding=\"utf8\").read().split(',')\n",
"str1 = ','.join(list_names)\n",
"other_str = str1.replace(',', ' ')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Tokenize the list of search terms to exclude using spaCy."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"#must tokenize the list that was brought in\n",
"new_college_list = []\n",
"doc2 = nlp(other_str)\n",
"for token in doc2:\n",
" new_college_list.append(token.text)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Create a final list of tokens that exclude the search terms."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"new_words = [word for word in new_str_list if word not in new_college_list]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Use the Counter from collections to quantify the frequency of each keyword."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"word_freq2 = Counter(new_words)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Create a new dataframe for the keywords and their frequency counts. Sort from high to low count, reset the index, and rename the columns. Save the dataframe as a CSV if desired."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"results_word_counts = pd.DataFrame.from_dict(word_freq2, orient='index',\n",
" columns=['keyword_count'])\n",
"results_words = results_word_counts.sort_values(by=['keyword_count'],ascending=False)\n",
"results_words.reset_index(inplace=True)\n",
"results_words.rename(columns = {\"index\":\"keyword\",\"keyword_count\":\"count\"}, inplace=True)\n",
"#results_words.to_csv('keyword_counts.csv', index=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Choose all keywords with a frequency greater than or equal to 10."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>keyword</th>\n",
" <th>count</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2020</td>\n",
" <td>93</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>students</td>\n",
" <td>87</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>covid19</td>\n",
" <td>67</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>news</td>\n",
" <td>63</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>fall</td>\n",
" <td>63</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" keyword count\n",
"0 2020 93\n",
"1 students 87\n",
"2 covid19 67\n",
"3 news 63\n",
"4 fall 63"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#from the above dataframe, choose all keywords with a frequency greater than or equal to 10\n",
"results_words = results_words.loc[results_words['count'] >= 10]\n",
"results_words.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Removed an unrecognizable word in the dataframe ('cus') after noticing it above."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"results_words = results_words.loc[~results_words['keyword'].str.contains(\"cus\")]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Create a dataframe for the top 24 keywords and include both original columns."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"results_words_top = results_words.iloc[0:24, 0:2]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Create a bar plot of the keyword data using seaborn and save the figure image, if desired."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"ax = sb.barplot(x = results_words_top['count'],y = results_words_top['keyword'],palette=\"Blues_d\")\n",
"\n",
"sb.despine(fig=None, ax=None, top=True, right=True, left=False, trim=False)\n",
"sb.set(rc={'figure.figsize':(6,7.2)})\n",
"\n",
"ax.set_ylabel('') \n",
"ax.set_xlabel('')\n",
"ax.set_title('Keyword Counts for NY 4-Year College Headlines on 7/1/20', fontsize=18, fontweight='heavy')\n",
"sb.set(font_scale = 1.4)\n",
"ax.axes.get_xaxis().set_visible(True)\n",
"ax.set_frame_on(True)\n",
"\n",
"#all data that had over 22 frequency counts \n",
"#plt.savefig('keyword_countplot.jpg', bbox_inches=\"tight\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Quantify Noun Chunks"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Create a dataframe focusing on columns for noun chunks."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>results</th>\n",
" <th>search_term</th>\n",
" <th>results_noun_chunks</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Student from Ozark on Adelphi University Spring 2020 Dean’s List</td>\n",
" <td>adelphi university</td>\n",
" <td>[student, ozark, adelphi university spring 2020 dean]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Kaitlyn Grant Named Among Adelphi University Spring 2020 ...</td>\n",
" <td>adelphi university</td>\n",
" <td>[kaitlyn grant, adelphi university spring]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Oxford's Emma Fogarty makes Adelphi University dean's list</td>\n",
" <td>adelphi university</td>\n",
" <td>[oxford's emma fogarty, adelphi university dean's list]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Wilton Resident Sophia Walsh Named to Adelphi University ...</td>\n",
" <td>adelphi university</td>\n",
" <td>[wilton resident sophia walsh, university]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Local Students Named to Adelphi University Spring 2020 ...</td>\n",
" <td>adelphi university</td>\n",
" <td>[local students, university spring]</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" results \\\n",
"0 Student from Ozark on Adelphi University Spring 2020 Dean’s List \n",
"1 Kaitlyn Grant Named Among Adelphi University Spring 2020 ... \n",
"2 Oxford's Emma Fogarty makes Adelphi University dean's list \n",
"3 Wilton Resident Sophia Walsh Named to Adelphi University ... \n",
"4 Local Students Named to Adelphi University Spring 2020 ... \n",
"\n",
" search_term results_noun_chunks \n",
"0 adelphi university [student, ozark, adelphi university spring 2020 dean] \n",
"1 adelphi university [kaitlyn grant, adelphi university spring] \n",
"2 adelphi university [oxford's emma fogarty, adelphi university dean's list] \n",
"3 adelphi university [wilton resident sophia walsh, university] \n",
"4 adelphi university [local students, university spring] "
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"nouns = df[['results','search_term','results_noun_chunks']].copy()\n",
"nouns.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Save the noun chunks column to a string type and create a new column that will be separated. Use the explode function from pandas to separate the items in the sep column."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>results</th>\n",
" <th>search_term</th>\n",
" <th>results_noun_chunks</th>\n",
" <th>sep</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Student from Ozark on Adelphi University Spring 2020 Dean’s List</td>\n",
" <td>adelphi university</td>\n",
" <td>['student', 'ozark', 'adelphi university spring 2020 dean']</td>\n",
" <td>['student'</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Student from Ozark on Adelphi University Spring 2020 Dean’s List</td>\n",
" <td>adelphi university</td>\n",
" <td>['student', 'ozark', 'adelphi university spring 2020 dean']</td>\n",
" <td>'ozark'</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Student from Ozark on Adelphi University Spring 2020 Dean’s List</td>\n",
" <td>adelphi university</td>\n",
" <td>['student', 'ozark', 'adelphi university spring 2020 dean']</td>\n",
" <td>'adelphi university spring 2020 dean']</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Kaitlyn Grant Named Among Adelphi University Spring 2020 ...</td>\n",
" <td>adelphi university</td>\n",
" <td>['kaitlyn grant', 'adelphi university spring']</td>\n",
" <td>['kaitlyn grant'</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Kaitlyn Grant Named Among Adelphi University Spring 2020 ...</td>\n",
" <td>adelphi university</td>\n",
" <td>['kaitlyn grant', 'adelphi university spring']</td>\n",
" <td>'adelphi university spring']</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" results \\\n",
"0 Student from Ozark on Adelphi University Spring 2020 Dean’s List \n",
"1 Student from Ozark on Adelphi University Spring 2020 Dean’s List \n",
"2 Student from Ozark on Adelphi University Spring 2020 Dean’s List \n",
"3 Kaitlyn Grant Named Among Adelphi University Spring 2020 ... \n",
"4 Kaitlyn Grant Named Among Adelphi University Spring 2020 ... \n",
"\n",
" search_term \\\n",
"0 adelphi university \n",
"1 adelphi university \n",
"2 adelphi university \n",
"3 adelphi university \n",
"4 adelphi university \n",
"\n",
" results_noun_chunks \\\n",
"0 ['student', 'ozark', 'adelphi university spring 2020 dean'] \n",
"1 ['student', 'ozark', 'adelphi university spring 2020 dean'] \n",
"2 ['student', 'ozark', 'adelphi university spring 2020 dean'] \n",
"3 ['kaitlyn grant', 'adelphi university spring'] \n",
"4 ['kaitlyn grant', 'adelphi university spring'] \n",
"\n",
" sep \n",
"0 ['student' \n",
"1 'ozark' \n",
"2 'adelphi university spring 2020 dean'] \n",
"3 ['kaitlyn grant' \n",
"4 'adelphi university spring'] "
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"nouns['results_noun_chunks'] = nouns['results_noun_chunks'].astype(str)\n",
"nouns['sep'] = nouns['results_noun_chunks'].str.split(pat=',')\n",
"nouns = nouns.explode('sep').reset_index(drop=True)\n",
"nouns.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Remove bracket and quotation characters from the sep column incrementally, then remove the columns used for cleaning, and rename the final version."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>results</th>\n",
" <th>search_term</th>\n",
" <th>results_noun_chunks</th>\n",
" <th>noun_segments</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Student from Ozark on Adelphi University Spring 2020 Dean’s List</td>\n",
" <td>adelphi university</td>\n",
" <td>['student', 'ozark', 'adelphi university spring 2020 dean']</td>\n",
" <td>student</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Student from Ozark on Adelphi University Spring 2020 Dean’s List</td>\n",
" <td>adelphi university</td>\n",
" <td>['student', 'ozark', 'adelphi university spring 2020 dean']</td>\n",
" <td>ozark</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Student from Ozark on Adelphi University Spring 2020 Dean’s List</td>\n",
" <td>adelphi university</td>\n",
" <td>['student', 'ozark', 'adelphi university spring 2020 dean']</td>\n",
" <td>adelphi university spring 2020 dean</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Kaitlyn Grant Named Among Adelphi University Spring 2020 ...</td>\n",
" <td>adelphi university</td>\n",
" <td>['kaitlyn grant', 'adelphi university spring']</td>\n",
" <td>kaitlyn grant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Kaitlyn Grant Named Among Adelphi University Spring 2020 ...</td>\n",
" <td>adelphi university</td>\n",
" <td>['kaitlyn grant', 'adelphi university spring']</td>\n",
" <td>adelphi university spring</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" results \\\n",
"0 Student from Ozark on Adelphi University Spring 2020 Dean’s List \n",
"1 Student from Ozark on Adelphi University Spring 2020 Dean’s List \n",
"2 Student from Ozark on Adelphi University Spring 2020 Dean’s List \n",
"3 Kaitlyn Grant Named Among Adelphi University Spring 2020 ... \n",
"4 Kaitlyn Grant Named Among Adelphi University Spring 2020 ... \n",
"\n",
" search_term \\\n",
"0 adelphi university \n",
"1 adelphi university \n",
"2 adelphi university \n",
"3 adelphi university \n",
"4 adelphi university \n",
"\n",
" results_noun_chunks \\\n",
"0 ['student', 'ozark', 'adelphi university spring 2020 dean'] \n",
"1 ['student', 'ozark', 'adelphi university spring 2020 dean'] \n",
"2 ['student', 'ozark', 'adelphi university spring 2020 dean'] \n",
"3 ['kaitlyn grant', 'adelphi university spring'] \n",
"4 ['kaitlyn grant', 'adelphi university spring'] \n",
"\n",
" noun_segments \n",
"0 student \n",
"1 ozark \n",
"2 adelphi university spring 2020 dean \n",
"3 kaitlyn grant \n",
"4 adelphi university spring "
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"nouns['sep2'] = nouns['sep'].str.replace(\"'\", '')\n",
"nouns['sep3'] = nouns['sep2'].str.replace(\"[\",'')\n",
"nouns['sep4'] = nouns['sep3'].str.replace(\"]\", '')\n",
"nouns.drop(columns = ['sep','sep2','sep3'], inplace=True)\n",
"nouns = nouns.rename(columns = {\"sep4\":\"noun_segments\"})\n",
"nouns.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Strip the noun chunks of any preceding spaces, then return all results not equal to 'amp' from leftover ampersands."
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"nouns['noun_segments'] = nouns['noun_segments'].map(lambda x:x.lstrip(' '))\n",
"nouns = nouns.loc[nouns['noun_segments'] != 'amp']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Create a variable for the value counts of the noun segments, convert it to a dictionary, and then map a column in the dataframe to specify the frequency of each noun chunk."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>results</th>\n",
" <th>search_term</th>\n",
" <th>results_noun_chunks</th>\n",
" <th>noun_segments</th>\n",
" <th>noun_count</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Student from Ozark on Adelphi University Spring 2020 Dean’s List</td>\n",
" <td>adelphi university</td>\n",
" <td>['student', 'ozark', 'adelphi university spring 2020 dean']</td>\n",
" <td>student</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Student from Ozark on Adelphi University Spring 2020 Dean’s List</td>\n",
" <td>adelphi university</td>\n",
" <td>['student', 'ozark', 'adelphi university spring 2020 dean']</td>\n",
" <td>ozark</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Student from Ozark on Adelphi University Spring 2020 Dean’s List</td>\n",
" <td>adelphi university</td>\n",
" <td>['student', 'ozark', 'adelphi university spring 2020 dean']</td>\n",
" <td>adelphi university spring 2020 dean</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Kaitlyn Grant Named Among Adelphi University Spring 2020 ...</td>\n",
" <td>adelphi university</td>\n",
" <td>['kaitlyn grant', 'adelphi university spring']</td>\n",
" <td>kaitlyn grant</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Kaitlyn Grant Named Among Adelphi University Spring 2020 ...</td>\n",
" <td>adelphi university</td>\n",
" <td>['kaitlyn grant', 'adelphi university spring']</td>\n",
" <td>adelphi university spring</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" results \\\n",
"0 Student from Ozark on Adelphi University Spring 2020 Dean’s List \n",
"1 Student from Ozark on Adelphi University Spring 2020 Dean’s List \n",
"2 Student from Ozark on Adelphi University Spring 2020 Dean’s List \n",
"3 Kaitlyn Grant Named Among Adelphi University Spring 2020 ... \n",
"4 Kaitlyn Grant Named Among Adelphi University Spring 2020 ... \n",
"\n",
" search_term \\\n",
"0 adelphi university \n",
"1 adelphi university \n",
"2 adelphi university \n",
"3 adelphi university \n",
"4 adelphi university \n",
"\n",
" results_noun_chunks \\\n",
"0 ['student', 'ozark', 'adelphi university spring 2020 dean'] \n",
"1 ['student', 'ozark', 'adelphi university spring 2020 dean'] \n",
"2 ['student', 'ozark', 'adelphi university spring 2020 dean'] \n",
"3 ['kaitlyn grant', 'adelphi university spring'] \n",
"4 ['kaitlyn grant', 'adelphi university spring'] \n",
"\n",
" noun_segments noun_count \n",
"0 student 3 \n",
"1 ozark 1 \n",
"2 adelphi university spring 2020 dean 2 \n",
"3 kaitlyn grant 1 \n",
"4 adelphi university spring 1 "
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"z = nouns['noun_segments'].value_counts()\n",
"z1 = z.to_dict()\n",
"nouns['noun_count'] = nouns['noun_segments'].map(z1)\n",
"nouns.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Create a dataframe with the noun segments sorted by frequency count. Then, create another with only the noun chunks and their respective counts. Drop any duplicates and blanks, then reset the index. Inspect the dataframe and create a CSV, if desired."
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>noun_segments</th>\n",
" <th>noun_count</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>students</td>\n",
" <td>34</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>college</td>\n",
" <td>26</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>colleges</td>\n",
" <td>22</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>what</td>\n",
" <td>20</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>campus</td>\n",
" <td>20</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>coronavirus</td>\n",
" <td>19</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>university</td>\n",
" <td>15</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>sports</td>\n",
" <td>15</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>it</td>\n",
" <td>15</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>covid-19</td>\n",
" <td>15</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>who</td>\n",
" <td>14</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>jobs</td>\n",
" <td>14</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>universities</td>\n",
" <td>12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>you</td>\n",
" <td>12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>fall semester</td>\n",
" <td>12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>cuny</td>\n",
" <td>11</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>the class</td>\n",
" <td>10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>we</td>\n",
" <td>10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>new york</td>\n",
" <td>10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>art</td>\n",
" <td>9</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>pandemic</td>\n",
" <td>9</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>fall</td>\n",
" <td>9</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>diversity</td>\n",
" <td>8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>\"deans list\"</td>\n",
" <td>8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>the fall</td>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>i</td>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>equity</td>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>class</td>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>college notes</td>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <td>person</td>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30</th>\n",
" <td>june</td>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>31</th>\n",
" <td>| news</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>32</th>\n",
" <td>us</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>33</th>\n",
" <td>president</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>34</th>\n",
" <td>july</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35</th>\n",
" <td>community</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>36</th>\n",
" <td>ny</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>37</th>\n",
" <td>new york college students</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>38</th>\n",
" <td>purchase college</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>39</th>\n",
" <td>pace university</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>40</th>\n",
" <td>america</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41</th>\n",
" <td>utica college</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>42</th>\n",
" <td>petition</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>43</th>\n",
" <td>cornell</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>44</th>\n",
" <td>covid-19 pandemic</td>\n",
" <td>5</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" noun_segments noun_count\n",
"0 students 34\n",
"1 college 26\n",
"2 colleges 22\n",
"3 what 20\n",
"4 campus 20\n",
"5 coronavirus 19\n",
"6 university 15\n",
"7 sports 15\n",
"8 it 15\n",
"9 covid-19 15\n",
"10 who 14\n",
"11 jobs 14\n",
"12 universities 12\n",
"13 you 12\n",
"14 fall semester 12\n",
"15 cuny 11\n",
"16 the class 10\n",
"17 we 10\n",
"18 new york 10\n",
"19 art 9\n",
"20 pandemic 9\n",
"21 fall 9\n",
"22 diversity 8\n",
"23 \"deans list\" 8\n",
"24 the fall 7\n",
"25 i 7\n",
"26 equity 7\n",
"27 class 7\n",
"28 college notes 7\n",
"29 person 7\n",
"30 june 7\n",
"31 | news 6\n",
"32 us 6\n",
"33 president 6\n",
"34 july 6\n",
"35 community 6\n",
"36 ny 6\n",
"37 new york college students 6\n",
"38 purchase college 6\n",
"39 pace university 6\n",
"40 america 6\n",
"41 utica college 6\n",
"42 petition 5\n",
"43 cornell 5\n",
"44 covid-19 pandemic 5"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#sort values by noun count, remove duplicates, and reset the index\n",
"sorted_df = nouns.sort_values(by = 'noun_count', ascending=False)\n",
"nouns_only = sorted_df[['noun_segments','noun_count']].copy()\n",
"nouns_only.drop_duplicates('noun_segments', inplace=True)\n",
"nouns_only = nouns_only.loc[nouns_only['noun_segments'] != '']\n",
"nouns_only = nouns_only.reset_index(drop=True)\n",
"nouns_only.head(45)\n",
"#nouns_only.to_csv('noun_counts.csv',index=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Choose the top 20 noun segments to use for a visual."
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"nouns_count_top = nouns_only.iloc[0:19, 0:2]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Create a bar plot of the noun chunk data using seaborn and save the figure image, if desired."
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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FhaSn5+Pk5MTzs7OuLi48Pbbb/P7778DsGXLFn744Qe2bNmCg4MDAKNGjeKnn37i/fffp02bNsClgDNp0iTq1q1L48aNcXNzo2bNmgwfPhyAESNGMG/ePPbt24ebmxtxcXH07duX/v37A9CwYUOmTJlC37592b17NwDFxcXceeedODs74+zsTFxcHBcvXgTA0dERAHt7e+rWrcvBgwf57LPPWL58Oa1atQLA1dWVrKws4uPjefzxx43XPHLkSBo2bHjNfSUiIlIZ3fB7TB5//HE2b97MjBkzOHjwINnZ2fz66694enpe87Fuv/12hg0bxuTJk4mNjcXX15eOHTvSs2dPAHbt2gVA586dy3yvuLgYZ2dn4+c77riDunXrGj/b2tri4uJS5jNcGm4B2L17Nzt27GDFihXlasrKyqJnz5707NmTkSNH4uTkRLt27fDz86N79+5XvI7LdQ4ePLhcnf9Lc3VERET+3w0Hk4kTJ/LFF1/Qu3dv/P39GTVqFAsWLCgzL+RavPDCC/Tv358NGzawZcsWpkyZwuLFi/n4448xGAzUqlWLlStXlr+QGjWu+Ptl1ar99aiVwWBg6NCh9OnTp9y2y3dDZs6cSUREBBs3bmTLli1ERkaSnJzM/Pnzy33n8mTYRYsWUadOnb+93sshSURERG4wmJw6dYqlS5cyY8aMMsMT2dnZ2NjYXPPxsrKy+PDDD4mOjiYsLIywsDC2b99OaGgou3btws3NjXPnznHu3DkeeOAB4/cmT55M/fr1CQ8Pv67raNq0Kb/++iuurq7Gth07dvDuu+/y0ksvsWfPHj7//HOio6O57777GDJkCKtWreL5558nJyeHevXqlTseQE5OjnEoByAuLo78/HzNJxEREfkLNxRM7O3tsbe35+uvv8bd3Z0LFy6QkJDAzz//bHxS5VrccccdrF69mgsXLhAeHk61atVISkqiTp063H///dSuXZsWLVrw/PPPM378eJydnUlKSiIhIYF33333uq9jxIgRPPPMM8yePZvAwEByc3OZMGEC9vb23HPPPZw/f57ExERsbGzo27cvxcXFrFq1ChcXF+rVq0f16tWxtbVl//795OXlcf/99+Pv78+rr75KaWkpbm5ufPPNN8yePZuXXnrpuusUERGp7G7olfQ1atRg1qxZZGVl8fjjjzNs2DDOnTvHmDFjyM7OprCw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\n",
"text/plain": [
"<Figure size 432x518.4 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ax = sb.barplot(x = nouns_count_top['noun_count'],y = nouns_count_top['noun_segments'],palette=\"Blues_d\")\n",
"\n",
"sb.despine(fig=None, ax=None, top=True, right=True, left=False, trim=False)\n",
"sb.set(rc={'figure.figsize':(6,7.2)})\n",
"\n",
"ax.set_ylabel('') \n",
"ax.set_xlabel('')\n",
"ax.set_title('Noun Chunk Counts for NY 4-Year College Headlines on 7/1/20', fontsize=18, fontweight='heavy')\n",
"sb.set(font_scale = 1.8)\n",
"ax.axes.get_xaxis().set_visible(True)\n",
"ax.set_frame_on(True)\n",
"\n",
"#plt.savefig('noun_countplot.jpg', bbox_inches=\"tight\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Quantify Named Entities"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Create a dataframe for the named entities."
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>results</th>\n",
" <th>search_term</th>\n",
" <th>results_named_entities</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Student from Ozark on Adelphi University Spring 2020 Dean’s List</td>\n",
" <td>adelphi university</td>\n",
" <td>[adelphi university, 2020, dean]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Kaitlyn Grant Named Among Adelphi University Spring 2020 ...</td>\n",
" <td>adelphi university</td>\n",
" <td>[kaitlyn grant, adelphi university, spring 2020]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Oxford's Emma Fogarty makes Adelphi University dean's list</td>\n",
" <td>adelphi university</td>\n",
" <td>[oxford, fogarty, adelphi university dean's]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Wilton Resident Sophia Walsh Named to Adelphi University ...</td>\n",
" <td>adelphi university</td>\n",
" <td>[wilton, sophia walsh, adelphi university]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Local Students Named to Adelphi University Spring 2020 ...</td>\n",
" <td>adelphi university</td>\n",
" <td>[adelphi university, spring 2020]</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" results \\\n",
"0 Student from Ozark on Adelphi University Spring 2020 Dean’s List \n",
"1 Kaitlyn Grant Named Among Adelphi University Spring 2020 ... \n",
"2 Oxford's Emma Fogarty makes Adelphi University dean's list \n",
"3 Wilton Resident Sophia Walsh Named to Adelphi University ... \n",
"4 Local Students Named to Adelphi University Spring 2020 ... \n",
"\n",
" search_term results_named_entities \n",
"0 adelphi university [adelphi university, 2020, dean] \n",
"1 adelphi university [kaitlyn grant, adelphi university, spring 2020] \n",
"2 adelphi university [oxford, fogarty, adelphi university dean's] \n",
"3 adelphi university [wilton, sophia walsh, adelphi university] \n",
"4 adelphi university [adelphi university, spring 2020] "
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"named = df[['results','search_term','results_named_entities']].copy()\n",
"named.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Perform cleaning. Save the named entities column as a string, split based on commas, then use the explode function from pandas and reset the index."
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>results</th>\n",
" <th>search_term</th>\n",
" <th>results_named_entities</th>\n",
" <th>named_ent</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Student from Ozark on Adelphi University Spring 2020 Dean’s List</td>\n",
" <td>adelphi university</td>\n",
" <td>['adelphi university', '2020', 'dean']</td>\n",
" <td>['adelphi university'</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Student from Ozark on Adelphi University Spring 2020 Dean’s List</td>\n",
" <td>adelphi university</td>\n",
" <td>['adelphi university', '2020', 'dean']</td>\n",
" <td>'2020'</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Student from Ozark on Adelphi University Spring 2020 Dean’s List</td>\n",
" <td>adelphi university</td>\n",
" <td>['adelphi university', '2020', 'dean']</td>\n",
" <td>'dean']</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Kaitlyn Grant Named Among Adelphi University Spring 2020 ...</td>\n",
" <td>adelphi university</td>\n",
" <td>['kaitlyn grant', 'adelphi university', 'spring 2020']</td>\n",
" <td>['kaitlyn grant'</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Kaitlyn Grant Named Among Adelphi University Spring 2020 ...</td>\n",
" <td>adelphi university</td>\n",
" <td>['kaitlyn grant', 'adelphi university', 'spring 2020']</td>\n",
" <td>'adelphi university'</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" results \\\n",
"0 Student from Ozark on Adelphi University Spring 2020 Dean’s List \n",
"1 Student from Ozark on Adelphi University Spring 2020 Dean’s List \n",
"2 Student from Ozark on Adelphi University Spring 2020 Dean’s List \n",
"3 Kaitlyn Grant Named Among Adelphi University Spring 2020 ... \n",
"4 Kaitlyn Grant Named Among Adelphi University Spring 2020 ... \n",
"\n",
" search_term results_named_entities \\\n",
"0 adelphi university ['adelphi university', '2020', 'dean'] \n",
"1 adelphi university ['adelphi university', '2020', 'dean'] \n",
"2 adelphi university ['adelphi university', '2020', 'dean'] \n",
"3 adelphi university ['kaitlyn grant', 'adelphi university', 'spring 2020'] \n",
"4 adelphi university ['kaitlyn grant', 'adelphi university', 'spring 2020'] \n",
"\n",
" named_ent \n",
"0 ['adelphi university' \n",
"1 '2020' \n",
"2 'dean'] \n",
"3 ['kaitlyn grant' \n",
"4 'adelphi university' "
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"named['results_named_entities'] = named['results_named_entities'].astype(str)\n",
"named['named_ent'] = named['results_named_entities'].str.split(pat=',')\n",
"named = named.explode('named_ent').reset_index(drop=True)\n",
"named.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Remove bracket and quotation characters from the named_ent column incrementally, then remove the columns used for cleaning, and rename the final version."
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
"#remove quotation marks and brackets from sep\n",
"named['named_ent2'] = named['named_ent'].str.replace(\"'\", '')\n",
"named['named_ent3'] = named['named_ent2'].str.replace(\"[\",'')\n",
"named['named_ent4'] = named['named_ent3'].str.replace(\"]\", '')\n",
"\n",
"named.drop(columns = ['named_ent','named_ent2','named_ent3'], inplace=True)\n",
"\n",
"named = named.rename(columns = {\"named_ent4\":\"named_entity\"})"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Remove any preceding spaces from the named entities and remove all those equal to 'nan'."
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [],
"source": [
"#named['named_entity'].value_counts()\n",
"#named['named_entity'] = named['named_entity'].astype(str)\n",
"named['named_entity'] = named['named_entity'].map(lambda x:x.lstrip(' '))\n",
"named = named.loc[named['named_entity'] != 'nan']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Use spaCy to get the entity types for each named entity. Create a new column in the dataframe for these."
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [],
"source": [
"named_entity_type = []\n",
"\n",
"for doc in nlp.pipe(named['named_entity'].astype('unicode').values, batch_size=50,\n",
" n_process=5):\n",
" if doc.is_parsed:\n",
" named_entity_type.append([ent.label_ for ent in doc.ents])\n",
" else:\n",
" named_entity_type.append(None) \n",
"\n",
"named['named_entities_type'] = named_entity_type"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>results</th>\n",
" <th>search_term</th>\n",
" <th>results_named_entities</th>\n",
" <th>named_entity</th>\n",
" <th>named_entities_type</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Student from Ozark on Adelphi University Spring 2020 Dean’s List</td>\n",
" <td>adelphi university</td>\n",
" <td>['adelphi university', '2020', 'dean']</td>\n",
" <td>adelphi university</td>\n",
" <td>[ORG]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Student from Ozark on Adelphi University Spring 2020 Dean’s List</td>\n",
" <td>adelphi university</td>\n",
" <td>['adelphi university', '2020', 'dean']</td>\n",
" <td>2020</td>\n",
" <td>[]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Student from Ozark on Adelphi University Spring 2020 Dean’s List</td>\n",
" <td>adelphi university</td>\n",
" <td>['adelphi university', '2020', 'dean']</td>\n",
" <td>dean</td>\n",
" <td>[ORG]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Kaitlyn Grant Named Among Adelphi University Spring 2020 ...</td>\n",
" <td>adelphi university</td>\n",
" <td>['kaitlyn grant', 'adelphi university', 'spring 2020']</td>\n",
" <td>kaitlyn grant</td>\n",
" <td>[ORG]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Kaitlyn Grant Named Among Adelphi University Spring 2020 ...</td>\n",
" <td>adelphi university</td>\n",
" <td>['kaitlyn grant', 'adelphi university', 'spring 2020']</td>\n",
" <td>adelphi university</td>\n",
" <td>[ORG]</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" results \\\n",
"0 Student from Ozark on Adelphi University Spring 2020 Dean’s List \n",
"1 Student from Ozark on Adelphi University Spring 2020 Dean’s List \n",
"2 Student from Ozark on Adelphi University Spring 2020 Dean’s List \n",
"3 Kaitlyn Grant Named Among Adelphi University Spring 2020 ... \n",
"4 Kaitlyn Grant Named Among Adelphi University Spring 2020 ... \n",
"\n",
" search_term results_named_entities \\\n",
"0 adelphi university ['adelphi university', '2020', 'dean'] \n",
"1 adelphi university ['adelphi university', '2020', 'dean'] \n",
"2 adelphi university ['adelphi university', '2020', 'dean'] \n",
"3 adelphi university ['kaitlyn grant', 'adelphi university', 'spring 2020'] \n",
"4 adelphi university ['kaitlyn grant', 'adelphi university', 'spring 2020'] \n",
"\n",
" named_entity named_entities_type \n",
"0 adelphi university [ORG] \n",
"1 2020 [] \n",
"2 dean [ORG] \n",
"3 kaitlyn grant [ORG] \n",
"4 adelphi university [ORG] "
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"named.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Save the named entity types as strings, then exlore the unique types in the dataframe."
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [],
"source": [
"named['named_entities_type'] = named['named_entities_type'].astype(str)"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([\"['ORG']\", '[]', \"['PERSON']\", \"['ORDINAL']\", \"['DATE']\",\n",
" \"['GPE']\", \"['CARDINAL']\", \"['EVENT']\", \"['LOC']\", \"['MONEY']\",\n",
" \"['NORP']\", \"['PERCENT']\", \"['TIME']\", \"['QUANTITY']\",\n",
" \"['ORG', 'PERSON']\", \"['PERSON', 'PERSON']\", \"['WORK_OF_ART']\",\n",
" \"['ORG', 'GPE']\", \"['PERSON', 'ORG']\"], dtype=object)"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"named['named_entities_type'].unique()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Create a variable for the value counts of the named entities, convert it to a dictionary, and then map a column in the dataframe to specify the frequency of each named entity."
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>results</th>\n",
" <th>search_term</th>\n",
" <th>results_named_entities</th>\n",
" <th>named_entity</th>\n",
" <th>named_entities_type</th>\n",
" <th>entity_count</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Student from Ozark on Adelphi University Spring 2020 Dean’s List</td>\n",
" <td>adelphi university</td>\n",
" <td>['adelphi university', '2020', 'dean']</td>\n",
" <td>adelphi university</td>\n",
" <td>['ORG']</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Student from Ozark on Adelphi University Spring 2020 Dean’s List</td>\n",
" <td>adelphi university</td>\n",
" <td>['adelphi university', '2020', 'dean']</td>\n",
" <td>2020</td>\n",
" <td>[]</td>\n",
" <td>62</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Student from Ozark on Adelphi University Spring 2020 Dean’s List</td>\n",
" <td>adelphi university</td>\n",
" <td>['adelphi university', '2020', 'dean']</td>\n",
" <td>dean</td>\n",
" <td>['ORG']</td>\n",
" <td>12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Kaitlyn Grant Named Among Adelphi University Spring 2020 ...</td>\n",
" <td>adelphi university</td>\n",
" <td>['kaitlyn grant', 'adelphi university', 'spring 2020']</td>\n",
" <td>kaitlyn grant</td>\n",
" <td>['ORG']</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Kaitlyn Grant Named Among Adelphi University Spring 2020 ...</td>\n",
" <td>adelphi university</td>\n",
" <td>['kaitlyn grant', 'adelphi university', 'spring 2020']</td>\n",
" <td>adelphi university</td>\n",
" <td>['ORG']</td>\n",
" <td>6</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" results \\\n",
"0 Student from Ozark on Adelphi University Spring 2020 Dean’s List \n",
"1 Student from Ozark on Adelphi University Spring 2020 Dean’s List \n",
"2 Student from Ozark on Adelphi University Spring 2020 Dean’s List \n",
"3 Kaitlyn Grant Named Among Adelphi University Spring 2020 ... \n",
"4 Kaitlyn Grant Named Among Adelphi University Spring 2020 ... \n",
"\n",
" search_term results_named_entities \\\n",
"0 adelphi university ['adelphi university', '2020', 'dean'] \n",
"1 adelphi university ['adelphi university', '2020', 'dean'] \n",
"2 adelphi university ['adelphi university', '2020', 'dean'] \n",
"3 adelphi university ['kaitlyn grant', 'adelphi university', 'spring 2020'] \n",
"4 adelphi university ['kaitlyn grant', 'adelphi university', 'spring 2020'] \n",
"\n",
" named_entity named_entities_type entity_count \n",
"0 adelphi university ['ORG'] 6 \n",
"1 2020 [] 62 \n",
"2 dean ['ORG'] 12 \n",
"3 kaitlyn grant ['ORG'] 1 \n",
"4 adelphi university ['ORG'] 6 "
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"q = named['named_entity'].value_counts()\n",
"q1 = q.to_dict()\n",
"named['entity_count'] = named['named_entity'].map(q1)\n",
"named.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Create a dataframe with the named entities sorted by frequency count. Then, create another with only the named entities and their respective counts. Drop any duplicates and blanks, then reset the index. Inspect the dataframe and create a CSV, if desired."
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>named_entity</th>\n",
" <th>named_entities_type</th>\n",
" <th>entity_count</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2020</td>\n",
" <td>[]</td>\n",
" <td>62</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>suny</td>\n",
" <td>['ORG']</td>\n",
" <td>51</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>covid-19</td>\n",
" <td>[]</td>\n",
" <td>41</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>new york</td>\n",
" <td>['GPE']</td>\n",
" <td>20</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>first</td>\n",
" <td>['ORDINAL']</td>\n",
" <td>17</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" named_entity named_entities_type entity_count\n",
"0 2020 [] 62\n",
"1 suny ['ORG'] 51\n",
"2 covid-19 [] 41\n",
"3 new york ['GPE'] 20\n",
"4 first ['ORDINAL'] 17"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sorted_df2 = named.sort_values(by = 'entity_count', ascending=False)\n",
"entity_only = sorted_df2[['named_entity','named_entities_type','entity_count']].copy()\n",
"entity_only.drop_duplicates('named_entity', inplace=True)\n",
"entity_only = entity_only.loc[entity_only['named_entity'] != '']\n",
"entity_only = entity_only.reset_index(drop=True)\n",
"entity_only.head()\n",
"#entity_only.to_csv('entity_counts.csv',index=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Create a dataframe with the top 30 named entities."
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [],
"source": [
"entity_top = entity_only.iloc[0:29, 0:3]"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>named_entity</th>\n",
" <th>named_entities_type</th>\n",
" <th>entity_count</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2020</td>\n",
" <td>[]</td>\n",
" <td>62</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>suny</td>\n",
" <td>['ORG']</td>\n",
" <td>51</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>covid-19</td>\n",
" <td>[]</td>\n",
" <td>41</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>new york</td>\n",
" <td>['GPE']</td>\n",
" <td>20</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>first</td>\n",
" <td>['ORDINAL']</td>\n",
" <td>17</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>two</td>\n",
" <td>['CARDINAL']</td>\n",
" <td>13</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>brooklyn</td>\n",
" <td>['GPE']</td>\n",
" <td>12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>jewish</td>\n",
" <td>['NORP']</td>\n",
" <td>12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>dean</td>\n",
" <td>['ORG']</td>\n",
" <td>12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>new york city</td>\n",
" <td>['GPE']</td>\n",
" <td>10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>summer</td>\n",
" <td>[]</td>\n",
" <td>8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>5</td>\n",
" <td>['CARDINAL']</td>\n",
" <td>8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>u.s.</td>\n",
" <td>['GPE']</td>\n",
" <td>8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>cornell</td>\n",
" <td>['PERSON']</td>\n",
" <td>8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>manhattan</td>\n",
" <td>['GPE']</td>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>10</td>\n",
" <td>['CARDINAL']</td>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>annual</td>\n",
" <td>['DATE']</td>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>three</td>\n",
" <td>['CARDINAL']</td>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>five</td>\n",
" <td>['CARDINAL']</td>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>utica college</td>\n",
" <td>[]</td>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>niagara university</td>\n",
" <td>['ORG']</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>yeshiva university</td>\n",
" <td>['ORG']</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>15</td>\n",
" <td>['CARDINAL']</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>syracuse university</td>\n",
" <td>['ORG']</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>eight</td>\n",
" <td>['CARDINAL']</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>us</td>\n",
" <td>[]</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>oswego county</td>\n",
" <td>['ORG']</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>adelphi university</td>\n",
" <td>['ORG']</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>clarkson university</td>\n",
" <td>['ORG']</td>\n",
" <td>6</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" named_entity named_entities_type entity_count\n",