[Python] Give Me the Garbage (GMG)

B

OVH me ha bloqueado el servidor porque su sistema no ha sabido hacerme la renovación... pero no hay mal que por bien no venga y he migrado a Hetzner. Tengo unos cambios pendientes y por eso aún no está levantado en el nuevo vps. Ahora usa gunicorn, lazy load, cache, en vez de mostrar "Estado" lo que se muestra ahora son "Estadísticas" que por el momento son los porcentajes en las diferentes categorías y he empezado a implementar "materialized views" en sqlalchemy para darle un buen golpe de rendimiento a la hora de cargar las páginas.
Espero tenerlo levantado de nuevo a la noche y empezará de cero otra vez... no llegué a hacer backup de la base de datos.

1 1 respuesta
B

#61 Espero no tengas dominio y hosting en el mismo sitio.

1 respuesta
B

#62 El dominio es un contrato distinto al del vps ;) del dominio no me preocupo hasta el año que viene... y ahora con Hetzner va todo "minuto a minuto"... si uso un servidor 30 mins pago por 30 mins y no por un mes entero xD y mucho más barato... lo único que los servidores están un poco más lejos, pero bueno... va como un tiro.

11 días después
B

@hda ¿conoces Stanza https://stanfordnlp.github.io/stanza/ ? Le estoy echando un vistazo y parece que da las cosas bastante facilitas y permite definir tus propios "Processors" a aparte de venir con algunos definidos interesantes como puede ser "sentiment".
Le voy a dar un intento... :B

1 1 respuesta
hda

#64 nunca lo he tocado pero siempre ha tenido buena pinta. ¿Le meterás mano?

1 respuesta
B

#65 Si, es parecido a lo que tenía solo que mil veces mejor, más refinado, más analítico. Espero no encontrarme con sorpresas pero es algo inevitable al ser territorio inexplorado por mi.

Fué ver una imagén parecida a esta y caer en la cuenta de que necesitaba esto xD

13 días después
B

Pues ya tengo el "hola mundo" de Stanza funcionando en el proyecto. Ha sido un poco engorroso conseguir que trabajase correctamente con gunicorn y he terminado haciendo una pequeña extensión para Flask y poder trabajar con Stanza sin problemas.

He probado:

doc = stanza_nlp.pipe("Me gustaria joder")
print(doc)
doc = stanza_nlp.pipe("Vaya mierda joder") 
print(doc)

** Con faltas a propósito... y es muy cundiente conocer el "sentido" de la palabra juejuejue (Soy consciente de que se ha de usar "documents" en vez de lanzar el pipe varias veces)

También ahora para el proyecto uso Poetry y he implementado para poder lanzar comandos por CLI... por ejemplo para lanzar el proceso de descarga de recursos para "stanza" o inicilizar los datos de la base de datos de una forma más controlada. Además de otras mejoras...

En cuanto tenga Stanza a full ya avisaré... pero ganará bastante precisión el sistema :D

3 1 respuesta
hda

#67 me alegra un montón que te hayas lanzado con NLP. Ya tengo ganas de ver el resultado :D

1
B

Alohaaaaaaaaaaaa al fin tengo el p*** servidor estable como una roca de diamante (no preguntes que tiene que ver el diamante con la estabilidad y la comparación con un material duro pero frágil), los workers funcionando sin petes... y por el camino he aprendido bastantes cosas de como hacer un despliegue correcto en producción con traefik + gunicorn + flask... de hecho lo más seguro es que termine publicando la imagen que he creado en docker hub para quien quiera usarla en sus proyectos.
Comentar a los que están intentando atacar el sitio... NO USO WORDPRESS! dejad de intentarlo. Gracias. Intentadlo pero más currado perracas!
Permito a quien quiera intentar atacar el sitio mientras no sea con un DDOS.

Este finde me pondré a darle el empujón a todo el tema del NLP. Sin prisa pero sin pausa.

4 2 respuestas
draz1c
#69overflow:

lo más seguro es que termine publicando la imagen que he creado en docker hub para quien quiera usarla en sus proyectos

Estaría muy chu-chu-chuli la verdad :kissing_heart:

P.D. Me he descojonado con el "easter egg" que has puesto :rofl:

1
y34hl0ve

#69 No tiene mucho que ver con el desarrollo, pero como te están intentando atacar?

1 respuesta
B

#71 De momento lo que parece que están haciendo es pasar algún tipo de escaneo para ver posibles puntos vulnerables de los que se deben conocer exploits:

NSFW
1
B

Sigo con la esperanza de que publiques algún día el repositorio

1
hda

Arriba dice:

Estado
El estado puede ser: Tóxico, Maleducado/a, Confortable, Armonía, Amoroso/a, Triste, Suicida o Indefinido

Sin embargo, justo debajo:

Hoy:
Rude

Recomiendo que lo pongas o todo en español o todo en inglés.

1 1 respuesta
B

#74 Gracias por el aviso, el problema de la traducción se debía a que la estaba obteniendo antes de saber a que traducir (tener la sesión del usuario) y siempre dejaba esos términos en inglés.

Y ya que estoy comento lo que he hecho en esta última actualización:

  • Uso de 'CSP': https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP Lo que quiere decir, que en el hipotético caso de que alguien lograse inyectar código este no podrá ejecutarse. Al menos que entren el servidor (hasta la cocina)... en ese caso ya da igual todo xDD
  • Cambios para respetar la GDPR. Ahora se informa de las cookies que se cargan. Todo lo que requiera cookies no propias del sitio web será tratado de forma "lazy"... por lo que hasta no interactuar con esos elementos ni se mostrara información de cookie ni se cargarán.
    Detallando un poco como lo he implementado... básicamente tengo un diccionario donde estipulo las diferentes cookies:
    {
            [requestInfo.hostname]: {
                'technical': {
                    'session': _('Registers a unique ID to store session data'),
                },
            },
            'youtube': {
                'third-party': {
                    'CONSENT': _('Used to detect if the visitor has accepted the marketing category in the cookie banner. This cookie is necessary for GDPR-compliance of the website.'),
                    'VISITOR_INFO1_LIVE' : _("Tries to estimate the user's bandwidth on pages with integrated YouTube videos."),
                    'YSC': _('Registers a unique ID to keep statistics of what videos from YouTube the user has seen.'),
                }
            },
            'streamable': {
                'third-party': {
                    'muted': _('Used to remember if the video must be played muted.'),
                    'volume': _('Used to remember the volume of the video.'),
                }
            }
        }
    

Luego, estipulo donde quiero usarlo:

<div class="ml-auto hidden md:inline" data-component="lazyClick" data-component-option-cookie_origins='["streamable"]'>

Tengo algún fleco suelto como algún defecto en móviles, o el tema oscuro y las gráficas...
No me olvido del NLP :B ... pero como este terreno es el más difuso de todos... quiero centrarme antes en otras partes que se que puedo sacar rápido antes de meterme a divagar con Stanza xD

1 1 respuesta
hda

#75 genial el avance. Ya me fijé en lo de la confirmación de cookies.

El botón de menú superior izquierda no rula (como algún otro user ha comentado).

Chrome 100.0.4896.79
Android 10 QKQ1 190828.022

desu

Podiras rankear a los usuarios, con mas de X mensajes por sus atributos?

Toxic: 31.25%
Rude: 5%
Comfortable: 12.5%
In love: 0.0%
Sad: 0.0%
Suicidal: 0.0%
Horny: 25.0%

de donde salen esos atributos? de las palabras mas usadas? saludetes y cuidate. gran trabajo.

1 1 respuesta
B

#77 ¿Tu siendo afable? Desconfío, se que estás esperando algún tipo de respuesta para meter la puñalá... ¬¬

  1. Extraer el comentario (HTML)
  2. Extraer solo la parte que es texto (Quitar etiquetas HTML)
  3. Tengo un diccionario (usando expresiones regulares) donde defino los tipos de palabras
  4. Por SQL tokenizo los comentarios y los comparo con este diccionario
  5. Hago el calculo de cuantas palabras dentro del comentario son de X tipo ([Num Sección] / [Num palabras])
    ** Las palabras son todas las palabras que casan con alguna sección del diccionario, no todas las palabras usadas en el comentario.
    ** Ya podéis ver que esto presenta problemas como que un comentario donde solo tenga palabras que casan con una sección dará que ese comentario es 100% de esa sección... he igual solo has escrito un "joder" de X palabras. NO ES NADA JUSTO!

Lo que voy a trabajar estos días:

  1. La parte de extracción del comentario y "limpieza" será igual
  2. Mantengo el diccionario de palabras
  3. Ahora quien tokeniza es Stanza
  4. Además de darme cosas tan útiles como el lema de la palabra, lo que me ayudará a simplificar el diccionario de palabras y que sea más efectivo, también dispondré de otros atributos por palabra para identificar mejor el sentido de la misma... por ejemplo: ahora "joder" contabiliza tanto como palabrota como "sexual", a partir de usar Stanza la palabra contabilizará donde le corresponde... o al menos con más probabilidad.

** También mejorará la nube de palabras y añadiré alguna sección más a los datos estadísticos. Como paja mental me gustaría gamificar la página... pero que fuese algo automático también.

Lo que comentas de "rankear", está en mis cosillas pendientes el crear un componente que permita ordenar por el atributo "X"... lo que comentas creo que podría encajar en el "top" de la página de usuarios, donde se permita rankear por número de posts, o por algún atributo.

B

Trabajando un poco más afondo ya empiezan a asomar los problemas... el principal con el que estoy ahora es que la "lematización" no es muy precisa y por lo que he leído http://clic.ub.edu/corpus/webfm_send/13 se debe a que principalmente se han extraído palabras y sentencias de artículos periodísticos... y claro, algunas palabras y "desviaciones" que se dan en internet no se dan en periódicos.
Por suerte Stanza permite mejorar el "lematizador" https://stanfordnlp.github.io/stanza/lemma.html#improving-the-lemmatizer-by-providing-key-value-dictionary ... y en ello estoy.
También implementando un "Processor" para categorizar la palabra en las categorías que tengo actualmente: https://stanfordnlp.github.io/stanza/pipeline.html#building-your-own-processors-and-using-them-in-the-neural-pipeline

2
7 días después
B

Por mover esto un poquejo... os comento en que ando:

  • Refactorizando código... y ello implica migración tanto de datos como de esquema de la base de datos. Sobretodo los nuevos cambios son para tener un histórico de avatares y un histórico de comentarios (las diferentes ediciones, no se puede tener todas.. pero las que se puedan).

  • Mejorando el CI y CD ... quiero que nada más poner nuevo código en el repo se publique en el servidor sin yo tener que hacer ni media mierda.

  • Mejorando la documentación

  • Aprendiendo más sobre este mundillo del NLP... pero aquí la cosa va ir lenta y no quiero tampoco taponar todo por esto... uno tiene que saber gestionar las prioridades.

  • Se ha corregido un problema con la gestión de fechas (causaba que algunas gráficas no mostrasen correctamente los datos entre las 00:00 y las 02:00 o 00:00 y 01:00 dependiendo de horario de verano o no)

  • Se ha añadido un nuevo modelo "Attachment" para centralizar todos los datos binarios (de momento, avatares)

  • Se ha añadido un nuevo modelo "AnalyzerWebEvent", el cual registrará eventos (cambio de avatar, se banea, se desbanea, etc...)

  • He añadido al rol de "admin" una página para probar como va la implementación del NLP con textos que le paso yo manualmente.

¿Se viene liberación del código? Si, liberaré el código en cuanto tenga el tema del NLP encauzado. El día que libere el código dejaré el mismo sistema... todo lo que se apruebe, a producción como una bala que va.

3
B

¿y si os cuento que lo más seguro es que cambie de Stanza a spaCy? Estoy en proceso de aprendizaje y veo que es una herramienta lista para usarse en entornos de producción...
https://oa.upm.es/67995/1/TFG_DIEGO_CONDE_HERREROS.pdf

Además me he encontrado con que el gobierno tiene un montón de cosicas interesantes sobre NLP (marIA):
https://arxiv.org/pdf/2107.07253.pdf
https://github.com/PlanTL-GOB-ES/lm-spanish

Mi idea es pasar a usar los modelos de Roberta-b ... aquí podéis probar:
POS: https://huggingface.co/PlanTL-GOB-ES/roberta-base-bne-capitel-pos
Algo muy chulo como "fill mask": https://huggingface.co/PlanTL-GOB-ES/roberta-base-bne?text=Este+a%C3%B1o+las+campanadas+de+La+Sexta+las+presentar%C3%A1+%3Cmask%3E.

Esto es un pozo sin fondo... xDD y me encuentro sobrepasado por momentos, pero me parece algo muy chulo para perderse con ello :B Este finde le daré cañita... tengo ganas :P

B

Al final el tema del NLP lo tengo aparcado...no me he metido este finde con ello. Me he dedicado a tema de CI/CD ... ahora popular datos a la base de datos es tan simple como escribir un XML... por lo que es muy sencillo cargar datos para los tests o ampliar/modificar registros base (Sitios disponibles, tipos de media soportados, etc..). Todo esto es gracias a un nuevo modelo "RecordMetadata".... por el cual puedo controlar que registros son base, cuales de tests o los que se van generando por el propio sistema.
Decir que "Alembic" es la hostia... hacer migraciones de base de datos es muy sencillito :D

Para realizar una actualización completa (esquema y datos) del proyecto sería:

poetry run flask db upgrade && poetry run flask gmg upgrade

** Estoy dejando que se pueda hacer downgrade... pero solo a nivel de esquema. Yo no tengo pensado hacer regresiones así que no pienso pulir esa parte.

Para los test estoy usando "pytest"... y en modo dev se instalará también "coverage". Ahora también todas las dependencias de javascript son manejadas por npm. Iba a quitar "jquery"... pero a mi no me molesta y he dejado "jquery-slim" ya que para las peticiones si que uso Fetch API y el tema de animaciones no uso y lo que haga intentaré que sea CSS 100%.

Hasta aquí mi resumen. Más noticias en el mismo canal pero no a la misma hora.

2
B

He visto lo del aviso de cookies, antes no estaba.

¿Qué has utilizado para implementar el guardado de ID y su utilización?

1 respuesta
B

#83 Revierto tocho que no entendí antes.... mira #75

B

Resumen de lo hecho este finde:

  • Creados los repos en github (de momento vacios)

  • Creado un nuevo repo "gmg-template" para desplegar la aplicación to fácil. Uso "copier". Se puede escoger entre modo "developer" o "production", también si se quiere desplegar traefik y/o postgres o usar servicios externos en su lugar.

  • Mejorados los casos de test.... me queda testear los métodos de los modelos como tal....
    Como comentaba, cada test carga sus datos en la base de datos y al finalizar se hace rollback:

    Mucho texto

** Este finde que viene no lo podré dar mucha caña, pero espero dejarlo subido aún con el tema del NLP cojo.... pero al menos si alguien controla más que yo (algo que es una realidad por lo que he podido comprobar en el foro) y se anima a contribuir que pueda ir metiendo las zarpas.

** El proyecto desplegado actualmente en buzaco.es está desfasadillo y con errores.

B

Molaría saber en qué se basa el programa para clasificar a un usuario en un comportamiento u otro.

En mi caso, quedo como tóxico y la nube de palabras no aclara nada.

B

Haber si hoy subo lo que tengo... Al no tener en cuenta el contexto no te preocupes mucho de los resultados que da actualmente.

13 días después
B

Bueno... ya estoy empezando a liberar cosicas:

Aún tengo que mejorar READMEs y tal... pero para el/la curioso/a ya pueden ir husmeando y soltando pestes del proyecto :)
Espero tener hoy listo todo... "buzaco.es" está apagado mientras hago todo el trasiego del viejo sistema al nuevo.

Que tengan una buena tarde!

2
B

Ya está el template de copier listo: https://github.com/Tardo/gmg-template

** Algo que me quedó por comentar en el readme es que obviamente hace falta tener docker instalado.

Dejé ayer migrado buzaco al nuevo sistema y ya está funcionando con "normalidad" (tengo que ajustar algunos parámetros). Me queda hacer el traspaso de las reglas del CI de gitlab al de github.

B

Dejé ayer listo el repo de gmg con los workflows para testear y desplegar... no me gustan los tiempos de despliegue, quiero ver como tratar este asunto para que sean mínimos. Ahora mismo en una actualización normal (solo código, nada de nuevos datos y cambios de la base de datos) se queda la web inoperativa unos 5 segundos.

Ya veis que este proyecto lo estoy usando mucho para aprender cosicas de sistemas...

Un dato "curioso" para no aburriros con mi diario de gilipolleces:
En estos meses de funcionamiento se han rastreado 9959 usuarios lo que supone un 3,08% de los miembros totales del portal. O lo que es lo mismo... el 96.92% de los usuarios no ha visitado la web en estos meses.

Desconozco si dentro del numero de miembros se incluyen los usuarios borrados/baneados.