<jupyter_start><jupyter_text>MIT LicenseCopyright (c) 2021  <NAME>,                    <NAME>,                    <NAME>,                    <NAME>,                    <NAME>,                    <NAME>,                    <NAME>Permission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software isfurnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included in allcopies or substantial portions of the Software.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THEAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHERLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THESOFTWARE.  Análisis de tweetsEste notebook analiza la toxicidad de los tweets que nos provee el dataset *dataset_newtral_ucm.csv* según las columnas *toxicity* y *degree_predicted*. Podremos ver de manera ordenada la toxicidad media de distintos partidos, políticos y palabras.<jupyter_code>import pandas as pd
import numpy as np
!python --version
if 'google.colab' in str(get_ipython()):
  from google.colab import drive
  drive.mount('/content/drive')
  df = pd.read_csv('/content/drive/Shareddrives/ETICA/dataset_newtral_ucm.csv')
else:
  df = pd.read_csv('../data/dataset_newtral_ucm.csv')
df.head(5)
#La lista de partidos a los que están afiliados los distintos políticos que twittean
partidos = df.party_slug.unique()
partidos = partidos[~pd.isna(partidos)]
print('Partidos: ', partidos)<jupyter_output>Partidos:  ['partido-popular' 'psoe' 'vox' 'ciudadanos' 'podemos' 'en-comu-podem'
 'catalunya-en-comu' 'en-marea' 'sin-partido' 'izquierda-unida'
 'unidas-podemos']<jupyter_text>Toxicidad de los distintos partidos<jupyter_code>### Calcular toxicidad 'media' de cada partido según sus tweets ###

tox_media = {i : 0 for i in partidos} # Toxicidad "media" de cada partido

for p in partidos:
    toxicity = tox_media.get(p)
    i = 0
    for idx, row in df[df['party_slug'] == p].iterrows():
        toxicity += row.toxicity #Usamos columna 'toxicity'
        i += 1
    
    tox_media.update({p: toxicity/i})
#Parece que los políticos de VOX twittean de manera más tóxica según esta columna
sorted(tox_media.items(), key=lambda item: item[1], reverse=True)
### Calcular degree 'medio' de cada partido según sus tweets ###

deg_medio = {i : 0 for i in partidos} # Toxicidad "media" de cada partido

for p in partidos:
    toxicity = deg_medio.get(p)
    i = 0
    for idx, row in df[df['party_slug'] == p].iterrows():
        toxicity += row.degree_predicted#Usamos columna 'degree_predicted'
        i += 1
    
    deg_medio.update({p: toxicity/i})
#Parece que los políticos de VOX twittean de manera más tóxica según esta columna
sorted(deg_medio.items(), key=lambda item: item[1], reverse=True)
#nº tweets con toxicidad "máxima" por partido utilizando la columna 'degree_predicted'
for p in partidos:
    print(p, np.count_nonzero(df[df['party_slug'] == p]['degree_predicted'] == 2))<jupyter_output>partido-popular 467
psoe 150
vox 477
ciudadanos 243
podemos 214
en-comu-podem 0
catalunya-en-comu 80
en-marea 1
sin-partido 15
izquierda-unida 1
unidas-podemos 3<jupyter_text>Toxicidad de los distintos políticosEn esta sección, se ordenarán de mas a menos tóxicos, los políticos de todos los partidos.<jupyter_code>#Dataframe político - partido
politicos_part_df = df.loc[:, df.columns.intersection(['slug','party_slug',])]
politicos_part_df = politicos_part_df.drop_duplicates().dropna()
#Así están todos los políticos ordenados por partido de mayor a menor toxicidad por ambos algoritmos (columnas 'toxicity' y 'degree_predicted')
iterator = 0
for pa in partidos:
  tox_media_ = {i : 0 for i in politicos_part_df.loc[df['party_slug'] == pa]['slug']}
  deg_medio_ = {i : 0 for i in politicos_part_df.loc[df['party_slug'] == pa]['slug']}
  for p in politicos_part_df.loc[df['party_slug'] == pa]['slug']:
    toxicityg = tox_media_.get(p)
    toxicity = deg_medio_.get(p)
    i = 0
    for idx, row in df[df['slug'] == p].iterrows():
        toxicityg += row.toxicity
        toxicity += row.degree_predicted
        i += 1
    
    tox_media_.update({p: toxicityg/i})
    deg_medio_.update({p: toxicity/i})
  if iterator == 0: 
    tox_media_pp = sorted(tox_media_.items(), key=lambda x: x[1], reverse=True)
    deg_medio_pp = sorted(deg_medio_.items(), key=lambda x: x[1], reverse=True)
  elif iterator == 1:
    tox_media_psoe = sorted(tox_media_.items(), key=lambda x: x[1], reverse=True)
    deg_medio_psoe = sorted(deg_medio_.items(), key=lambda x: x[1], reverse=True)
  elif iterator == 2:
    tox_media_vox = sorted(tox_media_.items(), key=lambda x: x[1], reverse=True)
    deg_medio_vox = sorted(deg_medio_.items(), key=lambda x: x[1], reverse=True)
  elif iterator == 3:
    tox_media_cs = sorted(tox_media_.items(), key=lambda x: x[1], reverse=True)
    deg_medio_cs = sorted(deg_medio_.items(), key=lambda x: x[1], reverse=True)
  elif iterator == 4:
    tox_media_pdms = tox_media_
    deg_medio_pdms = deg_medio_
  elif iterator == 5:
    tox_media_ecp = sorted(tox_media_.items(), key=lambda x: x[1], reverse=True)
    deg_medio_ecp = sorted(deg_medio_.items(), key=lambda x: x[1], reverse=True)
  elif iterator == 6:
    tox_media_cec = sorted(tox_media_.items(), key=lambda x: x[1], reverse=True)
    deg_medio_cec = sorted(deg_medio_.items(), key=lambda x: x[1], reverse=True)
  elif iterator == 7:
    tox_media_em = sorted(tox_media_.items(), key=lambda x: x[1], reverse=True)
    deg_medio_em = sorted(deg_medio_.items(), key=lambda x: x[1], reverse=True)
  elif iterator == 8:
    tox_media_sp = sorted(tox_media_.items(), key=lambda x: x[1], reverse=True)
    deg_medio_sp = sorted(deg_medio_.items(), key=lambda x: x[1], reverse=True)
  elif iterator == 9:
    tox_media_iu = sorted(tox_media_.items(), key=lambda x: x[1], reverse=True)
    deg_medio_iu = sorted(deg_medio_.items(), key=lambda x: x[1], reverse=True)
  elif iterator == 10:
    tox_media_up = tox_media_
    deg_medio_up = deg_medio_
  iterator += 1

def unir_diccionarios(x, y):
    z = x.copy()   
    z.update(y)    
    return z
tox_media_podemos = sorted(unir_diccionarios(tox_media_pdms, tox_media_up).items(), key=lambda x: x[1], reverse=True)
deg_medio_podemos = sorted(unir_diccionarios(deg_medio_pdms, deg_medio_up).items(), key=lambda x: x[1], reverse=True)<jupyter_output><empty_output><jupyter_text>Políticos de Vox<jupyter_code>#columna 'toxicity'
#El político que twittea de manera más tóxica dentro de Vox es <NAME>
tox_media_vox
#columna 'degree_predicted'
#El político que twittea de manera más tóxica dentro de Vox es Antonio Sal<NAME>
deg_medio_vox<jupyter_output><empty_output><jupyter_text>Políticos del PP<jupyter_code>#columna 'toxicity'
#El político que twittea de manera más tóxica dentro de PP es <NAME>
tox_media_pp
#columna 'degree_predicted'
#El político que twittea de manera más tóxica dentro de PP es <NAME>
deg_medio_pp<jupyter_output><empty_output><jupyter_text>Políticos del PSOE<jupyter_code>#columna 'toxicity'
#El político que twittea de manera más tóxica dentro del PSOE es Zaida Cantera de Castro
tox_media_psoe
#columna 'degree_predicted'
#El político que twittea de manera más tóxica dentro del PSOE es Zaida Cantera de Castro
deg_medio_psoe<jupyter_output><empty_output><jupyter_text>Políticos de Ciudadanos<jupyter_code>#columna 'toxicity'
#El político que twittea de manera más tóxica dentro de Cs es <NAME>
tox_media_cs
#columna 'degree_predicted'
#El político que twittea de manera más tóxica dentro de Cs es <NAME>-<NAME>
deg_medio_cs<jupyter_output><empty_output><jupyter_text>Políticos de Unidas Podemos<jupyter_code>#columna 'toxicity'
#El político que twittea de manera más tóxica dentro de Podemos es <NAME>
tox_media_podemos
#columna 'degree_predicted'
#El político que twittea de manera más tóxica dentro de Podemos es <NAME>
deg_medio_podemos<jupyter_output><empty_output><jupyter_text>Políticos de En Comú Podem<jupyter_code>#columna 'toxicity'
tox_media_ecp
#columna 'degree_predicted'
deg_medio_ecp<jupyter_output><empty_output><jupyter_text>Políticos de Catalunya En Comú<jupyter_code>#columna 'toxicity'
#El político que twittea de manera más tóxica dentro de Catalunya En Comú es <NAME>
tox_media_cec
#columna 'degree_predicted'
#El político que twittea de manera más tóxica dentro de Catalunya En Comú es Jaume Asens i Llodrà
deg_medio_cec<jupyter_output><empty_output><jupyter_text>Políticos de En Marea<jupyter_code>#columna 'toxicity'
tox_media_em
#columna 'degree_predicted'
deg_medio_em<jupyter_output><empty_output><jupyter_text>Políticos de Izquierda Unida<jupyter_code>#columna 'toxicity'
#El político que twittea de manera más tóxica dentro de Izquierda Unida es <NAME>
tox_media_iu
#columna 'degree_predicted'
#El político que twittea de manera más tóxica dentro de Izquierda Unida es <NAME>
deg_medio_iu<jupyter_output><empty_output><jupyter_text>Políticos sin Partido<jupyter_code>#columna 'toxicity'
#El político que twittea de manera más tóxica sin partido es <NAME>
tox_media_sp
#columna 'degree_predicted'
#El político que twittea de manera más tóxica sin patrtido es <NAME>
deg_medio_sp<jupyter_output><empty_output><jupyter_text>Toxicidad de todos los políticos independientemente de partido<jupyter_code>#Todos los políticos ordenados de mayor a menor toxicidad independientemente de partido por ambos algoritmos
politicos_toxicidad_ord = sorted(dict(tox_media_pp + tox_media_psoe + tox_media_vox + tox_media_cs + tox_media_podemos + tox_media_ecp + tox_media_cec + tox_media_em + tox_media_sp + tox_media_iu).items(), key=lambda x: x[1], reverse=True)
politicos_gradomed_ord = sorted(dict(deg_medio_pp + deg_medio_psoe + deg_medio_vox + deg_medio_cs + deg_medio_podemos + deg_medio_ecp + deg_medio_cec + deg_medio_em + deg_medio_sp + deg_medio_iu).items(), key=lambda x: x[1], reverse=True)

#Miramos la toxicidad según 'toxicity' de todos los políticos de todos los partidos
#El político más tóxico es <NAME>
politicos_toxicidad_ord
#Miramos la toxicidad según 'degree_predicted' de todos los políticos de todos los partidos
#Los políticos más tóxicos son <NAME> y <NAME>
politicos_gradomed_ord<jupyter_output><empty_output><jupyter_text>Diccionario de palabras tóxicas<jupyter_code>import nltk
from nltk.corpus import stopwords
nltk.download('stopwords')
from nltk.tokenize import word_tokenize
import re
# Según columna 'toxicity'

# tox_palabras = {i : (0,0) for i in dicc_palabras} # Toxicidad "media" de cada palabra
tox_palabras = {} #no utilizamos un diccionario con las palabras en español, solo nos interesan las palabras que salen en los tweets
for  idx,row in df.iterrows():
  for tw in row.text.split():
    if (not tw.startswith('https')) and (not tw.startswith('@')) and (not tw.startswith('#')):
      for c in "\"“!':,;-.$%&~#ºª()*+/\@¿?¡^`´0123456789|[]”–=_«»":
        tw = tw.replace(c, "")
      try: 
        toxicity = tox_palabras.get(tw)[0]
        freq = tox_palabras.get(tw)[1]
        toxicity += row.toxicity
        freq += 1
        tox_palabras.update({tw: (toxicity, freq)})
      except:
        tox_palabras.update({tw: (row.toxicity, 1)})
toxWords = {i : (tox_palabras.get(i)[0]/tox_palabras.get(i)[1],tox_palabras.get(i)[1]) for i in tox_palabras if (i not in stopwords.words('spanish'))}
sorted(toxWords.items(), key=lambda x: (x[1][0],x[1][1]), reverse=True)
# Según columna 'degree_predicted'

# tox_palabras = {i : (0,0) for i in dicc_palabras} # Toxicidad "media" de cada palabra
tox_palabras = {} #no utilizamos un diccionario con las palabras en español, solo nos interesan las palabras q salen en los tweets
for  idx,row in df.iterrows():
  for tw in row.text.split():
    if (not tw.startswith('https')) and (not tw.startswith('@')) and (not tw.startswith('#')):
      for c in "\"“!':,;-.$%&~#ºª()*+/\@¿?¡^`´0123456789|[]”–=_«»":
        tw = tw.replace(c, "")
      try: 
        toxicity = tox_palabras.get(tw)[0]
        freq = tox_palabras.get(tw)[1]
        toxicity += row.degree_predicted
        freq += 1
        tox_palabras.update({tw: (toxicity, freq)})
      except:
        tox_palabras.update({tw: (row.degree_predicted, 1)})
toxWords = {i : (tox_palabras.get(i)[0]/tox_palabras.get(i)[1],tox_palabras.get(i)[1]) for i in tox_palabras if (i not in stopwords.words('spanish'))}

sorted(toxWords.items(), key=lambda x: x[1], reverse=True)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11054421768707483, 'fraction_numerical': 0.00927643784786642, 'mean_word_length': 5.068011257035647, 'pattern_counts': {'":': 2, '<': 83, '<?xml version=': 0, '>': 83, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '15', 'dir': 'jupyter-structured-clean-dedup', 'id': '30089', 'license': 'MIT', 'n_tokens_mistral': 4899, 'n_tokens_neox': 4718, 'n_words': 1279, 'path': 'analysis_notebooks/Analisis_Dataset_Newtral.ipynb', 'repo_name': 'AlbertoGarciaDomenech/SesgosTocicidadTweets', 'size': '13344'}