Skip to content

Commit

Permalink
taller
Browse files Browse the repository at this point in the history
  • Loading branch information
ignaciomsarmiento committed Jun 1, 2022
1 parent 5a05d3e commit bd5e6af
Show file tree
Hide file tree
Showing 3 changed files with 923 additions and 45 deletions.
232 changes: 187 additions & 45 deletions Tutoriales/Week6/S6_LC1_Taller_LDA/S6_LC1_Taller_LDA.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,12 @@
"id": "2b151b20",
"metadata": {},
"source": [
"# Caso-taller: Recomendando Restaurantes en Bogotá"
]
},
{
"cell_type": "markdown",
"id": "e0d05eac",
"metadata": {},
"source": [
"El objetivo de este caso-taller es construir un sistema de recomendación de Restaurantes en Bogotá utilizando los datos de [tripadvisor](https://www.tripadvisor.com/). \n",
"# Caso-taller: Recomendando Cuentos de Hernán Casciari \n",
"\n",
"\n",
"[Hernán Casciari](https://hernancasciari.com/#bio), es un escritor argentino, que escribe blog posts con cuentos e historias relacionadas con el futbol, su vida, infancia, y relaciones familiares con toques de ficción. Este [blog](https://hernancasciari.com/blog/) es tan interesantes que en 2005 fue premiado como “El mejor blog del mundo” por Deutsche Welle de Alemania. \n",
"\n",
"Los datos contienen información sobre artistas, usuarios, y las veces que estos escucharon sus canciones. Las bases se encuentran en la carpeta `data`, allí también está disponible un archivo [README](data/readme.txt) que contiene más información sobre las bases.\n"
"El objetivo de este caso-taller es construir un sistema de recomendación basado en los contenidos de los posts."
]
},
{
Expand Down Expand Up @@ -59,20 +54,117 @@
"source": [
"### 1.Carga de datos \n",
"\n",
"En la carpeta `data` se encuentran los archivos:\n",
" - `artists.dat` que contienen el identificador del artista (`id`), nombre (`name`), link a la página del artista en last.fm (`url`), y link a la imagen del usuario (`pictureURL`). Aunque varios de estos links están rotos. \n",
" - `user_artists.dat` que contiene identificador del usuario (`userID`), nombre del artista que escuchó (`artistID`), y las veces que los escuchó (`weight`).\n",
"\n",
"Cargue estos datos en su *cuaderno*:\n",
"\n",
" 1. Para la base de artistas seleccione las columnas de identificador de artista (`id`) y nombre (`name`). Renombre estas columnas para poder hacer la unión con la base `user_artists.dat`.\n",
" 2. Para la base de usuarios y artistas, renombre las columnas de forma tal que se mantenga la consistencia para unir con la base anterior, y renombre la columna `weight` a `nro_reproducciones`.\n",
"En la carpeta `data` se encuentran el archivo posts con el título, la fecha de publicación, y el contenido de posts de sr. Casciari. Cargue estos datos en su *cuaderno*\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "5511b075",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"\n",
"posts=pd.read_csv('data/posts.csv', sep=',')"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "d0ee0789",
"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>titulo</th>\n",
" <th>fecha</th>\n",
" <th>cuento</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>El viejo folletín y las nuevas tecnologías</td>\n",
" <td>27 febrero, 2004</td>\n",
" <td>Ayer di por finalizado un experimento anónimo ...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Literatura infantil</td>\n",
" <td>28 febrero, 2004</td>\n",
" <td>A los doce años yo pensaba en la muerte con le...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Buenos Aires</td>\n",
" <td>1 marzo, 2004</td>\n",
" <td>Cuando terminaba de trabajar me volvía a casa ...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Mis conflictos con la ciencia</td>\n",
" <td>4 marzo, 2004</td>\n",
" <td>Las noticias más importantes nunca aparecen en...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Cómo se combate la madurez</td>\n",
" <td>6 marzo, 2004</td>\n",
" <td>Durante el día me asaltan infinidad de pregunt...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" titulo fecha \\\n",
"0 El viejo folletín y las nuevas tecnologías 27 febrero, 2004 \n",
"1 Literatura infantil 28 febrero, 2004 \n",
"2 Buenos Aires 1 marzo, 2004 \n",
"3 Mis conflictos con la ciencia 4 marzo, 2004 \n",
"4 Cómo se combate la madurez 6 marzo, 2004 \n",
"\n",
" cuento \n",
"0 Ayer di por finalizado un experimento anónimo ... \n",
"1 A los doce años yo pensaba en la muerte con le... \n",
"2 Cuando terminaba de trabajar me volvía a casa ... \n",
"3 Las noticias más importantes nunca aparecen en... \n",
"4 Durante el día me asaltan infinidad de pregunt... "
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"posts.head()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "92f34e45",
"metadata": {},
"outputs": [],
Expand All @@ -93,16 +185,16 @@
"id": "611a45ca",
"metadata": {},
"source": [
"### 2. Análisis descriptivo de los datos. \n",
"### 2. Análisis exploratorio de los datos. \n",
"\n",
"En esta sección exploraremos la base. Para ello responda las siguientes preguntas.\n",
"En esta sección exploraremos los posts.\n",
"\n",
"#### 2.1 ¿Cuáles son los 10 artistas con más reproducciones en números absolutos y en porcentajes? Presente sus resultados usando tablas y/o gráficas."
"#### 2.1 Limpie y homogenice el texto de los posts, sin eliminar las *stopwords* ni lematizar. Explique paso a paso su procedimiento ilustrando con una de las entradas del blog. Sea explicito si remueve alguna palabra en especial."
]
},
{
"cell_type": "code",
"execution_count": 2,
"execution_count": 4,
"id": "36fac364",
"metadata": {},
"outputs": [],
Expand All @@ -118,17 +210,43 @@
"(Utilice este espacio para describir el procedimiento, análisis, y conclusiones)"
]
},
{
"cell_type": "markdown",
"id": "59bfc2d2",
"metadata": {},
"source": [
"#### 2.2 ¿Cuáles son las palabras más utilizadas por año? Presente sus resultados usando una nube de palabras por año."
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "dd4bdd7f",
"metadata": {},
"outputs": [],
"source": [
"# Utilice este espacio para escribir el código."
]
},
{
"cell_type": "markdown",
"id": "810ea3d6",
"metadata": {},
"source": [
"(Utilice este espacio para describir el procedimiento, análisis, y conclusiones)"
]
},
{
"cell_type": "markdown",
"id": "778b92ae",
"metadata": {},
"source": [
"#### 2.2 ¿Cuáles son los 10 artistas con mas porcentaje de usuarios que al menos reprodujeron una vez sus canciones? Presente sus resultados usando tablas y/o gráficas."
"#### 2.3 ¿Cómo cambia la composición de las palabras más utilizadas por año si remueve las *stopwords* y lematiza? Presente sus resultados usando una nube de palabras por año. Explique de donde salen las *stopwords* que utilizó y si decidió ampliarlas. Note que el escritor es argentino por lo tanto habrán palabras particulares de este país."
]
},
{
"cell_type": "code",
"execution_count": 3,
"execution_count": 6,
"id": "72eb0a7e",
"metadata": {},
"outputs": [],
Expand All @@ -149,12 +267,12 @@
"id": "f383fc01",
"metadata": {},
"source": [
"#### 2.3 Para el usuario 8 (`userID==8`) encuentre los 10 artistas que más reproduce. Presente sus resultados usando tablas y/o gráficas. ¿Encuentra algún patrón en los artistas que escucha?"
"#### 2.4 Obtenga una tabla y/o gráfica que muestre el total de posts por año, el promedio de palabras por post, el total de palabras utilizadas y el total de palabras únicas."
]
},
{
"cell_type": "code",
"execution_count": 4,
"execution_count": 7,
"id": "5b2e4e2a",
"metadata": {},
"outputs": [],
Expand All @@ -177,15 +295,15 @@
"source": [
"### 3. Generando Recomendaciones\n",
"\n",
"En esta sección nos interesa generar recomenaciones para el usuario 8 (`userID==8`). Para ello vamos a generar distintos recomendadores y comparar las recomendaciones generadas."
"En esta sección nos interesa generar recomendaciones, para ello va a elijir una entrada de la base que le pareció interesante y generar recomendaciones para ella utilizando distintos procedimientos"
]
},
{
"cell_type": "markdown",
"id": "8c3df5b3",
"metadata": {},
"source": [
"#### 3.1. Filtrado colaborativo sencillo: promedios"
"#### 3.1. Basados en similitud utilizando CountVectorizer"
]
},
{
Expand All @@ -195,12 +313,12 @@
"id": "yjsuqTEKhhpF"
},
"source": [
"Usando el promedio de reproducciones genere una tabla y/o gráfica donde figure el top 10 de recomendaciones para este usuario. Explique con cuidado su procedimiento, especificando qué hizo con aquellos artistas que no tienen reproducciones y justificando su elección."
"Genere una función recomendadora basado en la distancia de coseno donde el texto este vactorizado por `CountVectorizer`. Muestre y describa las 10 entradas más recomendadas."
]
},
{
"cell_type": "code",
"execution_count": 5,
"execution_count": 8,
"id": "1e22fa41",
"metadata": {},
"outputs": [],
Expand All @@ -221,20 +339,20 @@
"id": "8b431efe",
"metadata": {},
"source": [
"#### 3.2. Filtrado colaborativo sencillo: promedios ponderados"
"#### 3.2. Basados en similitud utilizando TF-IDFVectorizer"
]
},
{
"cell_type": "markdown",
"id": "f36f517a",
"metadata": {},
"source": [
"Usando el promedio ponderado de reproducciones genere una tabla y/o gráfica donde figura el top 10 de recomendaciones para este usuario. Para generar los pesos utilice la distancia de coseno. Explique con cuidado su procedimiento, en qué consiste la distancia de coseno y especifique qué hizo con aquellos artistas que no tienen reproducciones y justifique su elección. Compare las recomendaciones con el recomendador implementado en el paso anterior."
"Genere una función recomendadora basado en la distancia de coseno donde el texto este vectorizado por `TF-IDFVectorizer`. Muestre y describa las 10 entradas más recomendadas. Compare con los resultados encontrados anteriormente y explique sus similitudes y/o diferencias."
]
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": 9,
"id": "b891c072",
"metadata": {},
"outputs": [],
Expand All @@ -255,20 +373,20 @@
"id": "6bc8cd9b",
"metadata": {},
"source": [
"#### 3.3. Filtrado colaborativo usando SVD"
"#### 3.3. Basados en tópicos"
]
},
{
"cell_type": "markdown",
"id": "2767839a",
"metadata": {},
"source": [
"Usando la descomposición en valores singulares genere una tabla y/o gráfica donde figura el top 10 de recomendaciones para este usuario. Explique con cuidado su procedimiento, justificando como eligió el número de valores singulares a utilizar. Compare las recomendaciones con el recomendador implementado en los pasos anteriores."
"Encuentre los tópicos subyacentes en los posts. Comience con 3 tópicos, el sr. Casciari suele hablar mucho sobre \"Jugar/Niñez\", \"Fútbol\" y el \"Futuro\". Vea si encuentra estos tópicos subyacentes. Para ello genere una visualización de los tópicos y analice cuáles son las palabras más frecuentes dentro de cada uno de ellos."
]
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": 10,
"id": "e4701c53",
"metadata": {},
"outputs": [],
Expand All @@ -286,18 +404,16 @@
},
{
"cell_type": "markdown",
"id": "917d750d",
"id": "5875aece",
"metadata": {},
"source": [
"#### 3.4. Filtrado colaborativo usando Análisis de Canasta de Compra\n",
"\n",
"Utilizando el algoritmo `Apriori` genere reglas de asociación. Explique con cuidado su procedimiento, justificando la elección de los parámetros del algoritmo. Basándose en los 10 artistas reproducidos por este usuario, qué recomendaciones le haría a este usuario? Compare las recomendaciones con los recomendadores implementados en los pasos anteriores."
"Asigne cada entrada a uno de estos tres tópicos y genere recomendaciones restringidas al tópico al que pertenece la entrada que eligió. Compare con los resultados encontrados anteriormente y explique sus similitudes y/o diferencias."
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "1413ac3f",
"execution_count": 11,
"id": "47087bab",
"metadata": {},
"outputs": [],
"source": [
Expand All @@ -306,12 +422,38 @@
},
{
"cell_type": "markdown",
"id": "9c978bba",
"id": "2ba35293",
"metadata": {},
"source": [
"(Utilice este espacio para describir el procedimiento, análisis, y conclusiones)"
]
},
{
"cell_type": "markdown",
"id": "ada86afd",
"metadata": {},
"source": [
"Refine el número de tópicos usando la medida de perplejidad. Explique brevemente en que consiste y cuántos tópicos encontró."
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "ff6cf9e3",
"metadata": {},
"outputs": [],
"source": [
"# Utilice este espacio para escribir el código."
]
},
{
"cell_type": "markdown",
"id": "1370d231",
"metadata": {},
"source": [
"Asigne cada entrada a estos nuevos tópicos y genere recomendaciones restringidas al tópico al que pertenece la entrada que eligió. Compare con los resultados encontrados anteriormente y explique sus similitudes y/o diferencias."
]
},
{
"cell_type": "markdown",
"id": "15cef1d2",
Expand All @@ -325,12 +467,12 @@
"id": "c92e7fca",
"metadata": {},
"source": [
"De acuerdo con los resultados encontrados, en su opinión ¿qué procedimiento generó las mejores recomendaciones para este usuario? ¿Cómo implementaría una evaluación objetiva de estas recomendaciones? Justifique su respuesta."
"De acuerdo con los resultados encontrados, en su opinión ¿qué procedimiento generó las mejores recomendaciones para la entrada elegida? ¿Cómo implementaría una evaluación objetiva de estas recomendaciones? Justifique su respuesta."
]
},
{
"cell_type": "code",
"execution_count": 9,
"execution_count": 13,
"id": "2e24c30f",
"metadata": {},
"outputs": [],
Expand Down
Loading

0 comments on commit bd5e6af

Please sign in to comment.