<jupyter_start><jupyter_text>![title](./images/policia.png)  En este ejercicio, el ordenador va a entender que está leyendo. El topic modelling se usa para categorizar grupos de documentos. Se usa cuando tienes un "corpus" de muchos documentos -redes sociales, panama papers- y quieres saber como categorizar cada una de los documentos. El algoritmo Latent Dirichlet Allocation (LDA) genera un grupo de categorías, donde cada categoría es un conjunto de tópicos y las frecuencias con la importancia relativa de cada tópico en esa categoria.Presupone que cada documento es una mezcla de un pequeño número de categorías (también denominados como tópicos) y la aparición de cada palabra en un documento se debe a una de las categorías a las que el documento pertenece.   Contenidos -  Extracción de tópicos con lda-  Generación de topicos-  Resultados : Heatmap-  Resultados : Interactive topic model visualization<jupyter_code>#### Analicemos este hashtag ####
hashtag = "@policia"<jupyter_output><empty_output><jupyter_text>Nos conectamos al api de tweeter para extraer los tópicos.<jupyter_code>###### Nos conectamos a tweeter 
#(para usar esto hay que arreglar las variables con los token de conexion), y descomentar el guardado a disco.

import tweepy
import csv
import pandas as pd
from datetime import date, timedelta

#### Credenciales de acceso a twitter
consumer_key=""
consumer_secret=""
access_token=""
access_token_secret=""

# Quitamos la primera letra de las variables, y ponemos un guión para despistar a los parser
onsumer_key    = 'h_mFJIxaV0HqCuKVZc8iZL65sJ'
onsumer_secret = '<KEY>'
ccess_token    = '7_<PASSWORD>26816-ZZk5lNrzMcLJdHRrRLMn6LIksQLDZTi'
ccess_token_secret   = '<KEY>'

print(" Nos conectamos a twitter" )


auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth,wait_on_rate_limit=True)

options = " -filter:retweets"
array = []

try:
    # Pedimos datos al api
    for tweet in tweepy.Cursor(api.search , count=100,q=hashtag + options, lang="es", tweet_mode="extended").items(5000) :
        array.append({"hashtag" : hashtag  , 
                      "tweet" : tweet.full_text,
                      "link" : "https://twitter.com/"+ tweet._json["user"]["screen_name"] + "/status/" + tweet.id_str ,
                     })

    # Guardar a disco    
    df = pd.DataFrame(array)

    ### Descomentar para guardar a disco
    ### df.to_csv('datasets/lda.csv',index=False)
    tweets = df 

    print(" Acabamos de descargarnos",df.size,"tweets de " , hashtag )
    df.head(5)

except Exception:
    pass

#########################################
### Cargamos el DataFrame, desde un csv.
### Por si no los hemos descargado
#########################################
import pandas as pd
hashtag = "@policia"

tweets = pd.read_csv('datasets/lda.csv',encoding = 'utf8')
tweets["tweet"] = tweets["tweet"].replace("telefónica","telefonica").replace("?"," ").replace(","," ").replace("."," ").replace(hashtag,"").replace(tweets.head(1).hashtag.values[0].lower(),"")
corpus = tweets.tweet 

hashtag = [tweets.head(1).hashtag.values[0].lower()]

print(corpus.values)

from string import punctuation

# remove common words and tokenize
list1 = ['RT','rt', '&gt;&gt;' "&amp;" ,"?" , "," ]
from stop_words import get_stop_words
##  Como nos llegan tickets en dos idiomas añadimos las palabras de ambos idiomas
stoplist  = get_stop_words('spanish') + list1 + hashtag
## Añdimos nuestras propias palabras


texts = [[word for word in str(document).lower().split() if word not in stoplist] for document in corpus]
print(texts[:5])
from gensim import corpora, models, similarities

dictionary = corpora.Dictionary(texts)

dictionary
corpus = [dictionary.doc2bow(text) for text in texts]
corpus
from gensim import corpora, models, similarities
tfidf = models.TfidfModel(corpus) # step 1 -- initialize a model
corpus
corpus_tfidf = tfidf[corpus]  # step 2 -- use the model to transform vectors

total_topics = 15
lda = models.LdaModel(corpus, id2word=dictionary, num_topics=total_topics)
corpus_lda = lda[corpus_tfidf] # create a double wrapper over the original corpus: bow->tfidf->fold-in-lsi

#Show first n important word in the topics:
lda.show_topics(total_topics,5)

from collections import OrderedDict

data_lda = {i: OrderedDict(lda.show_topic(i,25)) for i in range(total_topics)}
#data_lda
import pandas as pd

df_lda = pd.DataFrame(data_lda)
print(df_lda.shape)
df_lda = df_lda.fillna(0).T
print(df_lda.shape)
df_lda

import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

g=sns.clustermap(df_lda.corr(), center=0, cmap="RdBu", metric='cosine', linewidths=.75, figsize=(12, 12))
plt.setp(g.ax_heatmap.yaxis.get_majorticklabels(), rotation=0)
plt.show()
#plt.setp(ax_heatmap.get_yticklabels(), rotation=0)  # For y axis
import pyLDAvis.gensim

pyLDAvis.enable_notebook()
panel = pyLDAvis.gensim.prepare(lda, corpus_lda, dictionary, mds='tsne')
panel<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.12612432540475715, 'fraction_numerical': 0.009394363381970817, 'mean_word_length': 5.043478260869565, 'pattern_counts': {'":': 0, '<': 12, '<?xml version=': 0, '>': 14, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '2', 'dir': 'jupyter-structured-clean-dedup', 'id': '387265', 'license': 'MIT', 'n_tokens_mistral': 1814, 'n_tokens_neox': 1740, 'n_words': 482, 'path': 'ejercicios/Ejercicio 17 - Topic Modelling.ipynb', 'repo_name': 'jaimevalero/python-machine-learning-book-2nd-edition', 'size': '5092'}