{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Install useful libraries"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here we install usefuls libraries for language processing."
]
},
{
"cell_type": "code",
"execution_count": 85,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: nltk==3.6.7 in /opt/conda/lib/python3.6/site-packages (3.6.7)\n",
"Requirement already satisfied: click in /opt/conda/lib/python3.6/site-packages (from nltk==3.6.7) (8.0.4)\n",
"Requirement already satisfied: tqdm in /opt/conda/lib/python3.6/site-packages (from nltk==3.6.7) (4.42.0)\n",
"Requirement already satisfied: regex>=2021.8.3 in /opt/conda/lib/python3.6/site-packages (from nltk==3.6.7) (2023.5.5)\n",
"Requirement already satisfied: joblib in /opt/conda/lib/python3.6/site-packages (from nltk==3.6.7) (1.1.1)\n",
"Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /opt/conda/lib/python3.6/site-packages (from click->nltk==3.6.7) (4.8.3)\n",
"Requirement already satisfied: zipp>=0.5 in /opt/conda/lib/python3.6/site-packages (from importlib-metadata; python_version < \"3.8\"->click->nltk==3.6.7) (2.1.0)\n",
"Requirement already satisfied: typing-extensions>=3.6.4; python_version < \"3.8\" in /opt/conda/lib/python3.6/site-packages (from importlib-metadata; python_version < \"3.8\"->click->nltk==3.6.7) (4.1.1)\n"
]
}
],
"source": [
"! pip install nltk==3.6.7 # Nltk is a simple but useful library for nlp"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Required Libraries"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here we export the required python libraries."
]
},
{
"cell_type": "code",
"execution_count": 211,
"metadata": {},
"outputs": [],
"source": [
"import os # Check gile existance\n",
"import urllib.request # Download files from the web\n",
"from bs4 import BeautifulSoup # Parse html files\n",
"import unicodedata # Normalize text\n",
"import re # Find regular expresions\n",
"import nltk # Natural Language Processing\n",
"import pandas as pd # Organize data in dataframes\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Misc Functions"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Miscelanious functions that will be used during the text processing"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [],
"source": [
"# Take a text and remove any accents\n",
"def remove_accents(text):\n",
" normalized_text = unicodedata.normalize('NFD', text) # Untangle lettre and accent characters\n",
" non_accented_text = re.sub('[\\u0300-\\u036f]', '', normalized_text) # Removve accent characters\n",
" return non_accented_text"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Misc Data"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"We download a punctuation file to preprocess text."
]
},
{
"cell_type": "code",
"execution_count": 88,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"[nltk_data] Downloading package punkt to /home/jovyan/nltk_data...\n",
"[nltk_data] Unzipping tokenizers/punkt.zip.\n"
]
},
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 88,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"nltk.download('punkt')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Get a local version if not present"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If we do not have a local version of the html file that contains the play, we will download one."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"data_url = 'http://dramacode.github.io/html/moliere_avare.html' \n",
"data_file = 'moliere_avare.html'\n",
"if not os.path.exists(data_file):\n",
" urllib.request.urlretrieve(data_url, data_file)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Load the data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now that we know there is a local version of the html file we can parse it with BeautifulSoup so it is easy to explore the document."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"with open('moliere_avare.html', 'rb') as file:\n",
" soup = BeautifulSoup(file, 'html.parser')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Characters Analysis"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Collect list of characters"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we can extract all the characters from the document"
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['harpagon',\n",
" 'cleante',\n",
" 'elise',\n",
" 'valere',\n",
" 'mariane',\n",
" 'anselme',\n",
" 'frosine',\n",
" 'maitre simon',\n",
" 'maitre jacques',\n",
" 'la fleche',\n",
" 'dame claude',\n",
" 'brindavoine',\n",
" 'la merluche',\n",
" 'commissaire']"
]
},
"execution_count": 72,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"characters = [char for char in soup.find_all('li', {'class':'castItem'})] # Get characters from the cast list\n",
"characters = [char.find('span').get('id') for char in characters] # Extract id from character\n",
"characters = [char.replace('-',' ') for char in characters] # Clean character id\n",
"characters"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Collect characters' speech"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now that we have a list of characters, we can go over the play and collect the speech of each character."
]
},
{
"cell_type": "code",
"execution_count": 169,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" act | \n",
" scene | \n",
" speaker | \n",
" speech | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" I | \n",
" I01 | \n",
" valere | \n",
" [[Hé, quoi, ,, charmante, Élise, ,, vous, deve... | \n",
"
\n",
" \n",
" 1 | \n",
" I | \n",
" I01 | \n",
" elise | \n",
" [[Non, ,, Valère, ,, je, ne, puis, pas, me, re... | \n",
"
\n",
" \n",
" 2 | \n",
" I | \n",
" I01 | \n",
" valere | \n",
" [[Hé, que, pouvez-vous, craindre, ,, Élise, ,,... | \n",
"
\n",
" \n",
" 3 | \n",
" I | \n",
" I01 | \n",
" elise | \n",
" [[Hélas, !], [cent, choses, à, la, fois, :, L'... | \n",
"
\n",
" \n",
" 4 | \n",
" I | \n",
" I01 | \n",
" valere | \n",
" [[Ah, !], [ne, me, faites, pas, ce, tort, ,, d... | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" act scene speaker speech\n",
"0 I I01 valere [[Hé, quoi, ,, charmante, Élise, ,, vous, deve...\n",
"1 I I01 elise [[Non, ,, Valère, ,, je, ne, puis, pas, me, re...\n",
"2 I I01 valere [[Hé, que, pouvez-vous, craindre, ,, Élise, ,,...\n",
"3 I I01 elise [[Hélas, !], [cent, choses, à, la, fois, :, L'...\n",
"4 I I01 valere [[Ah, !], [ne, me, faites, pas, ce, tort, ,, d..."
]
},
"execution_count": 169,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Dictionary to collect all the speech data\n",
"speech_dict = {\n",
" 'act':[],\n",
" 'scene':[], \n",
" 'speaker':[],\n",
" 'speech':[]\n",
"}\n",
"\n",
"# Get the body of the page\n",
"body = soup.find('section', {'class':'body'})\n",
"\n",
"# Get all the acts\n",
"for act_body in body.find_all('section', {'class':'level2'}):\n",
" act = act_body.get('id')\n",
" # Get all the scenes of the act\n",
" for scene_body in act_body.find_all('section', {'class':'level3'}):\n",
" scene = scene_body.get('id')\n",
" # Get the speakers and speeches of the scene\n",
" for speech_body in scene_body.find_all('div', {'class':'sp'}):\n",
" speaker = speech_body.find('p', {'class':'speaker'}).text\n",
" # Clean t he speakers name\n",
" speaker = remove_accents(speaker).lower()\n",
" \n",
" # Map the given speaker to known characters\n",
" for char in characters:\n",
" if char in speaker:\n",
" speaker = char\n",
" break\n",
" \n",
" speech = speech_body.find('p', {'class':'p autofirst'}).text.strip()\n",
" # Split speech into sentences\n",
" speech = nltk.tokenize.sent_tokenize(speech, language='french')\n",
" speech = [nltk.tokenize.word_tokenize(sent, language='french') for sent in speech]\n",
" # Split sentences into tokens\n",
" \n",
" # Add the data to the Dictionary\n",
" speech_dict['act'].append(act)\n",
" speech_dict['scene'].append(scene)\n",
" speech_dict['speaker'].append(speaker)\n",
" speech_dict['speech'].append(speech)\n",
" \n",
"speech_df = pd.DataFrame(speech_dict)\n",
"speech_df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Compute characters' statistics"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First we compute some basic statistics from the existing dataset"
]
},
{
"cell_type": "code",
"execution_count": 170,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" act | \n",
" scene | \n",
" speaker | \n",
" speech | \n",
" sentences | \n",
" tokens | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" I | \n",
" I01 | \n",
" valere | \n",
" [[Hé, quoi, ,, charmante, Élise, ,, vous, deve... | \n",
" 4 | \n",
" 65 | \n",
"
\n",
" \n",
" 1 | \n",
" I | \n",
" I01 | \n",
" elise | \n",
" [[Non, ,, Valère, ,, je, ne, puis, pas, me, re... | \n",
" 3 | \n",
" 76 | \n",
"
\n",
" \n",
" 2 | \n",
" I | \n",
" I01 | \n",
" valere | \n",
" [[Hé, que, pouvez-vous, craindre, ,, Élise, ,,... | \n",
" 1 | \n",
" 16 | \n",
"
\n",
" \n",
" 3 | \n",
" I | \n",
" I01 | \n",
" elise | \n",
" [[Hélas, !], [cent, choses, à, la, fois, :, L'... | \n",
" 2 | \n",
" 56 | \n",
"
\n",
" \n",
" 4 | \n",
" I | \n",
" I01 | \n",
" valere | \n",
" [[Ah, !], [ne, me, faites, pas, ce, tort, ,, d... | \n",
" 4 | \n",
" 53 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" act scene speaker speech \\\n",
"0 I I01 valere [[Hé, quoi, ,, charmante, Élise, ,, vous, deve... \n",
"1 I I01 elise [[Non, ,, Valère, ,, je, ne, puis, pas, me, re... \n",
"2 I I01 valere [[Hé, que, pouvez-vous, craindre, ,, Élise, ,,... \n",
"3 I I01 elise [[Hélas, !], [cent, choses, à, la, fois, :, L'... \n",
"4 I I01 valere [[Ah, !], [ne, me, faites, pas, ce, tort, ,, d... \n",
"\n",
" sentences tokens \n",
"0 4 65 \n",
"1 3 76 \n",
"2 1 16 \n",
"3 2 56 \n",
"4 4 53 "
]
},
"execution_count": 170,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Count total sentences on each characters' line\n",
"speech_df['sentences'] = speech_df.speech.apply(len)\n",
"# Count total tokens on each characters' line\n",
"speech_df['tokens'] = speech_df.speech.apply(lambda speech:sum([len(sent) for sent in speech]))\n",
"speech_df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Then we can get overall values for each character"
]
},
{
"cell_type": "code",
"execution_count": 171,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" sentences | \n",
" tokens | \n",
" lines | \n",
"
\n",
" \n",
" speaker | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" harpagon | \n",
" 545 | \n",
" 6180 | \n",
" 355 | \n",
"
\n",
" \n",
" cleante | \n",
" 234 | \n",
" 3670 | \n",
" 161 | \n",
"
\n",
" \n",
" valere | \n",
" 160 | \n",
" 2943 | \n",
" 100 | \n",
"
\n",
" \n",
" frosine | \n",
" 138 | \n",
" 2360 | \n",
" 59 | \n",
"
\n",
" \n",
" maitre jacques | \n",
" 127 | \n",
" 1739 | \n",
" 85 | \n",
"
\n",
" \n",
" la fleche | \n",
" 104 | \n",
" 1684 | \n",
" 66 | \n",
"
\n",
" \n",
" elise | \n",
" 71 | \n",
" 1179 | \n",
" 51 | \n",
"
\n",
" \n",
" mariane | \n",
" 53 | \n",
" 1009 | \n",
" 32 | \n",
"
\n",
" \n",
" anselme | \n",
" 34 | \n",
" 570 | \n",
" 20 | \n",
"
\n",
" \n",
" commissaire | \n",
" 29 | \n",
" 328 | \n",
" 17 | \n",
"
\n",
" \n",
" maitre simon | \n",
" 10 | \n",
" 221 | \n",
" 5 | \n",
"
\n",
" \n",
" la merluche | \n",
" 5 | \n",
" 51 | \n",
" 5 | \n",
"
\n",
" \n",
" brindavoine | \n",
" 3 | \n",
" 44 | \n",
" 3 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" sentences tokens lines\n",
"speaker \n",
"harpagon 545 6180 355\n",
"cleante 234 3670 161\n",
"valere 160 2943 100\n",
"frosine 138 2360 59\n",
"maitre jacques 127 1739 85\n",
"la fleche 104 1684 66\n",
"elise 71 1179 51\n",
"mariane 53 1009 32\n",
"anselme 34 570 20\n",
"commissaire 29 328 17\n",
"maitre simon 10 221 5\n",
"la merluche 5 51 5\n",
"brindavoine 3 44 3"
]
},
"execution_count": 171,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Get the total score for each character\n",
"ammount_of_speech = speech_df[['speaker', 'sentences', 'tokens']].groupby('speaker').sum()\n",
"ammount_of_speech['lines'] = speech_df.speaker.value_counts()\n",
"# Sort the characters from more tokens spoken to least tokens spoken\n",
"ammount_of_speech = ammount_of_speech.sort_values('tokens', ascending=False)\n",
"ammount_of_speech"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Based on this data the answer to **Which character speaks the most?** is *Harpagon*"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The answer to **Which one does not speak at all?** we can fidn which characters dont have any line recorded:"
]
},
{
"cell_type": "code",
"execution_count": 141,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"dame claude\n"
]
}
],
"source": [
"for char in characters:\n",
" if char not in speech_df.speaker.unique():\n",
" print(char)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Based on this, *Dame Claude* does not speak at all."
]
},
{
"cell_type": "code",
"execution_count": 233,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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4z6vvfbaeT/w0xsRbAAAAIBGMGfOnNDo6Oj4mJiY+FtvvbWj+7rMzEz/fv36dUlISIhLSkqKSU9PD5CkJUuWtOjWrVtsXFxcfJ8+faL379/vK7lGe0aOHNkhJSUlJjIysuvTTz/dWpIefPDByP379/vHxsbGT5gwIVKSnnjiiTaJiYlx0dHR8Q888EC7S33cFwvBBgAAALjE0tLSAmbOnBm+YcOGvNzc3Kx58+btc18/bty49i+//PK+zMzM7Oeff75g0qRJUZJ00003ndq6dWtOdnZ21ogRI05Mmzatbe02+fn5ARs2bMj7/PPPs2fOnNmuvLzczJo1q+Dqq68uz8nJyZo3b17Be++91zw/Pz8gIyMjOzs7O2vr1q2BH3zwQdClPv6LgWtsADSqh+Y+7rlicZ4rBQDAxbR27drmt9xyy8nw8HCnJLVp06aqdl1hYaEjPT09aOTIkZ1ql1VUVBhJ2r17t9+tt94aefTo0SYVFRWOq6++ury2zY9//ONvmjZtaps2beoMCQmpLCgo+N53/TVr1jTfuHFj8/j4+HhJKikpceTk5AQMHTr01MU83kuBYAMAAABcYtZaGWNsfeuqqqoUHBzszMnJyaq77pe//GXUr371q8Njx44tXLlyZfC0adO+nUrm7+//bT0fHx85nU5T337vv//+Qw899NAxTx3L5YKpaAAAAMAlNmTIkKLly5eHHD582EeSjhw54lO7LiQkpDoyMrJiwYIFLSWpurpan376aVNJKi4u9omKiqqUpIULF4aeaz8tWrSoOn369Lff+YcOHVr0xhtvtCosLHRI0u7du5scOHDgBzHY8YM4CAAAAODfcSG3Z/53JCcnlz344IOH+vXrF+twOGxiYmJJ+/btK2rXv/XWW1/de++97WfMmBHudDrNz372sxO9e/cu/c1vfnPwtttu69SmTZuK5OTk0/v27fM/237atm1blZSUdKpLly4JgwYNKpw3b15BZmZmwHXXXRcrSYGBgdWLFy/eHRER4bzYx3yxEWwAAACARjB58uTjkydPPl7futjY2IpNmzbtrLv89ttv/+b222//pu7yF1544aD7+507d2bWvl6xYsVu93VPPPHE10888cTXF97zyxNT0QAAAAB4PYINAAAAAK9HsAEAAADg9Qg2AAAAALweNw+4jIwrG9zYXQAAAAC8EiM2AAAAALwe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Lxo+fPhhlZWVLe699952M2bMaN+rV6+yp59+uuXYsWO7jR8/vvNRRx3V8+KLL+68adOmnDPOOKPb4YcfXlpaWlp23333HVC3Pe+8807zQYMGlfTq1ausR48evZ9++umWktSpU6c+H3zwQbNU2/uf//wnd+TIkYf27NmzrF+/fr3+/ve/F0jSxIkTO55xxhndBg8eXNK5c+c+U6ZMOSjsdcqIDQAAAJAF7777bv6DDz749sCBA9/p27dv6axZsw5csGDBstmzZx9www03dBg+fPiqfv36ff7aa68ta968uebMmVM0adKkzs8888yqWEZJScm2c88998OWLVvu+NnPfvYfSbrjjjvarlq1Kv/ll19e3qxZM11yySWdhg8fvunhhx+u+uijj3IHDRpUWl5evmn//fevjeXcfffdbU488cSNN91009qamhpVV1fvMgCSSnsnTZrUsV+/fpufe+65VY899ljRd77zneJly5YtkaSVK1fmv/LKK5WffPJJbmlp6eFXX331h3l5eS6s9cmIDQAAAJAFnTp12jp48OAtubm56tmz55YRI0ZsysnJ0YABAza/9957eZK0YcOG3FNOOeXQHj169J40adIhy5cvz08l+7TTTvu4WTM/hvHCCy/s/+tf/7pDr169yoYMGVKydetWW7lyZYv4+Y8++ujP7r///rYTJ07s+NprrxW0bt26tm5mKu197bXXis4///z1klReXl79ySefNFu/fn2uJJ188smfFBQUuA4dOtS0adNm+3vvvRfqIAuFDQAAAJAFLVq0+GK0IicnR/n5+U6ScnNztWPHDpOkyZMndxo2bFj1ihUrFs+dO3fltm3bUjp+b9my5ReFiXNOf/rTn1YuW7ZsybJly5Z88MEHCwcMGPB5/PyjR4/+dP78+ZWdOnXa9t3vfrf41ltvPTCT9jq36wCMmTlJih+dyc3NVU1NjaWyLKmisAEAAAD2UJs2bcrt3LnzNkmaOXNm2/rmKSoq2lFdXZ3bUMbw4cM33XLLLe1ra32t8/LLLxfUnWf58uUtOnXqtP3KK6/8aNy4cR+9/vrrhZm09+ijj67+wx/+cKDkrwNq3bp1TZs2bXYZ/dkduMYGAAAA+7zdfXvmTE2ePHnt+PHji6dPn37w0KFDN9U3z9ixYz85/fTTD33qqacO+M1vfvPvuq/feOONay644IIuvXr1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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"granular_ammount_of_speech = speech_df[['scene', 'speaker', 'tokens']].groupby(['scene', 'speaker']).sum()\n",
"granular_ammount_of_speech = granular_ammount_of_speech/granular_ammount_of_speech.groupby(level=0).transform('sum')\n",
"\n",
"scenes = granular_ammount_of_speech.index.levels[0]\n",
"tokens = {\n",
" char:[granular_ammount_of_speech.loc[scene, char].tokens if granular_ammount_of_speech.index.isin([(scene, char)]).any() else 0 for scene in scenes]\n",
" for char in granular_ammount_of_speech.index.levels[1]\n",
"}\n",
"width = 1\n",
"tokens\n",
"\n",
"fig, ax = plt.subplots(figsize=(12,8))\n",
"bottom = np.zeros(len(scenes))\n",
"\n",
"for boolean, tokens in tokens.items():\n",
" p = ax.bar(scenes, tokens, width, label=boolean, bottom=bottom)\n",
" bottom += tokens\n",
"\n",
"ax.set_title(\"Character participation on each scene\")\n",
"ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))\n",
"plt.xticks(rotation = 45) \n",
"\n",
"plt.show()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.6.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}