Buscar
 
 

Resultados por:
 

 


Rechercher Búsqueda avanzada

Últimos temas
» Videocreación
por SaraB Hoy a las 02:28

» Asociación de imágenes
por psicosurf Hoy a las 01:33

» Idolos con pies de barro
por Albedrío? Hoy a las 01:13

» El más bello de los ruidos
por Brisa Hoy a las 00:53

» El buen salvaje
por Piére Sâtre Hoy a las 00:17

» Yo soy catalán
por Albedrío? Ayer a las 23:34

» Inteligencia colectiva
por Albedrío? Ayer a las 22:56

» Música made in Spain.
por Yomisma Ayer a las 19:55

» Facebook AD
por Albedrío? Ayer a las 14:58

» Cuaderno de campo: expedición Campos de Refugiados Saharauis en Tindouf ( Argelia)
por crr Ayer a las 14:28


Categorización automática de textos usando PLN

Ver el tema anterior Ver el tema siguiente Ir abajo

Categorización automática de textos usando PLN

Mensaje por Willy el Jue Feb 09 2017, 20:35

Como lo prometido es deuda, aquí va una pequeña introducción al Procesamiento del Lenguaje Natural (PLN, no confundir con PNL), y que es un área, dentro de la inteligencia artificial, que se dedica a facilitar la interacción del ser humano con la máquina usando lenguaje propio del primero y no de la segunda. La definición me la acabo de inventar, pero creo que puede valer.

Vamos a centrarnos en un aspecto concreto del PLN, que es la categorización de textos escritos en lenguaje natural. Podríamos hablar también de traducción automática de textos, reconocimiento de voz, etc, pero se nos va a ir de las manos, así que empezamos por eso y luego vamos viendo.

La categorización de textos se usa en muchos ámbitos de las nuevas tecnologías, por ejemplo el buscador de Google usa técnicas PLN, así como los filtros de spam para emails, filtros paternos para navegadores web etc. La filosofía es bastante sencilla de entender ya que se basa en el propio funcionamiento del ser humano: primero aprender/entrenar, luego operar en base a ese aprendizaje/entrenamiento, y finalmente recibir feedback acerca del buen/mal funcionamiento

1- Aprendizaje automático.

1.1- Establecimiento de categorías

Si hablamos de categorización de textos, en primer lugar se debe definir cuáles son esas categorías en el ámbito en el que nos estamos moviendo. Si lo que queremos es desarrollar un filtro anti-spam, las categorías serán 2: correo no deseado (Spam) y correo sí deseado (Ham). Es importante resaltar que se usa "deseado" y "no deseado" intencionadamente, ya que lo que para una persona puede ser correo no deseado para otra puede ser sí deseado. Por ejemplo, un anuncio de Viagra puede ser no deseado para mi (que todavía estoy hecho un toro) pero sí deseado para, yo que sé, por decir un nombre al azar, Albedrío Beso

Por poner otro ejemplo, de categorías, si quisiéramos desarrollar un categorizador que sea capaz de decirnos quién ha escrito qué post en el foro (para detectar usuarios clones, por ejemplo), las categorías serían todos y cada uno de los usuarios del foro. Si quisiéramos determinar si un post ha sido escrito por un usuario en concreto o no, las categorías serían dos, la que representa a ese usuario en concreto y la que representa a todos los demás. También es importante señalar que cuantas más categorías haya, más impreciso será nuestro categorizador.

1.2- Colecciones de entrenamiento

Una vez establecidas las categorías, el siguiente paso es conseguir una colección de textos ya categorizados. En el caso de un filtro de spam, tendríamos, por un lado, un conjunto de emails ya categorizados como Spam y otro conjunto categorizado como Ham. Evidentemente, cuanto más grande sean las colecciones, mejor entrenamiento conseguiremos y mayor precisión a la hora de operar. En el caso de un filtro de Spam en cuyo desarrollo colaboré, usamos 2000 emails de cada categoría y conseguimos una precisión mayor al 99% de aciertos con una tasa de 0'05% de falsos positivos (más adelante hablaremos de lo que son falsos positivos y por qué es importante que esta tasa sea menor que la de falsos negativos para el caso concreto del Spam)


1.3 - Tokenización de textos

El siguiente paso es establecer la definición de "token", o lo que es lo mismo, definir como vamos a dividir cada texto en trozos "digeribles", y que no siempre será tan sencillo como dividir el texto en palabras y ya está.

Dependiendo del categorizador que vayamos a desarrollar, la tokenización se hará de una manera u otra. Por ejemplo, si lo que queremos es desarrollar un programa que detecte en qué idioma está escrito un texto, dividiremos cada texto de entrenamiento en "trigramas", o sea, secuencias de 3 letras ya que cada idioma tiene una frecuencia de aparición distinta de cada trigrama. En inglés, por ejemplo, es muy frecuente el uso del trigrama "ing" (going, doing, making, etc) mientras que en español es mucho menos frecuente.

En muchas ocasiones se desechan los símbolos de puntuación pues no aportan información relevante, mientras que en otros casos tienen mucha importancia. Por ejemplo, en un filtro de spam es relevante tener en cuenta el símbolo de exclamación ! (compre esto!!!!! compre aquello!!!!! Gran oferta!!!! Sexo gratis!!!!!!!) o los símbolos monetarios. También lo son, o lo eran en su momento, los símbolos que se usan en el lenguaje HTML, pues la probabilidad de que un email escrito en HTML fuera spam era bastante mayor que los que estaban escritos en texto plano. Ahora ya esos símbolos han dejado de tener tanta importancia pues la mayoría de las aplicaciones de correo ya usan HTML por defecto al enviar correos.

Por otro lado, también se suelen usar stoplists, o sea, listas de palabras que no aportan información y que se quieren ignorar para "aligerar" el proceso de entrenamiento (y que puede llegar a ser muy costoso en tiempo. El entrenamiento de un filtro de spam es relativamente rápido, 3-4 horas para 2000 emails en un PC normal y corriente, pero porque sólo hay 2 categorías. Cuando hay muchas categorías el tiempo aumenta exponencialmente). Generalmente las palabras que se meten en estas stoplists suelen ser los pronombres, los artículos y las preposiciones. En el caso del filtro que mencionaba antes para categorizar posts y saber qué usuario los ha escrito, probablemente no meteríamos las preposiciones en la stoplist ya que cada usuario las usa de manera distinta (algunos tendemos a usar unas preposiciones más que otras, por ejemplo).

Otra cosa importante es tener en cuenta la "metainformación" que contienen los textos a la hora de crear los tokens. Por ejemplo, en el caso de un filtro de spam, el remitente del email es importante para saber si es o no spam, así como mucha información oculta que nosotros no vemos pero que usan los servidores de correo y que suele ser muy relevante para detectar spam (no lo cuento porque la cosa es larga de explicar)
Por poner otro ejemplo, en el caso del detector de creadores de posts del foro, sería relevante, por ejemplo, coger como token el día de la semana en el que se escribió el post, o la hora del día, ya que cada uno solemos escribir más unos días que otros, o dentro de unas franjas horarias determinadas.

En resumen, aquí el truco está en conocerse bien el ámbito de uso del categorizador, analizar bien que "pinta" tienen los textos de entrenamiento, qué información es relevante, y sobre todo, cual no lo es: tengamos en cuenta que lo deseable es usar aprendizaje automático puro, es decir, que no se programa a la máquina con reglas heurísticas sino que se la programa para que él mismo cree las suyas propias adaptándose a la colección de entrenamiento. Por eso es más importante quitar ruido que poner inteligencia, pues nos interesa que ésta última la ponga la máquina.

1.4 - Cálculo de frecuencias

Una vez que hemos troceado el texto en tokens, es decir, hemos troceado los textos en "átomos" de información, el siguiente paso es contabilizar cuantas veces aparece cada token en los textos de entrenamiento, y, de esta manera, obtener una tabla por cada categoría con dos columnas cada una: token / frecuencia de aparición

2- Operación/Ejecución

Una vez que ya está entrenado el sistema, lo siguiente es ponerlo a prueba. Para ello, cogeremos el texto que queremos categorizar, lo dividiremos en tokens como ya hemos descrito antes (exactamente de la misma manera, como es lógico) y una vez tengamos la lista de tokens, usaremos cierto algoritmo para calcular la probabilidad combinada de todos ellos. Digo "cierto algoritmo" porque aquí también entra en juego el dominio en el que nos movamos. Hay varios algoritmos diferentes, pero el que nosotros usamos fue un algoritmo basado en el teorema de Bayes llamado "Naive Bayes" (Bayes ingenuo)

[Tienes que estar registrado y conectado para ver este vínculo]

El algoritmo es bastante sencillo:

Supongamos que tenemos 2 categorías, y, tras dividir todos los textos de entrenamiento de esa categoría, 100 tokens (t1, t2, t3...t100)

Lo primero que haremos será calcular la probabilidad de que el texto pertenezca a la categoría 1, y para ello cogeremos cada token del texto, lo buscaremos en la tabla de la categoría 1 que obtuvimos en la fase de entrenamiento y anotaremos la frecuencia registrada para ese token en esa categoría.

Ahora calcularemos la probabilidad de que un texto que contenga ese token pertenezca a esa categoría concreta. Si la frecuencia de aparición de un token en la categoría 1 es 500 y había 1000 textos de entrenamiento, la probabilidad de ese token asociada a la categoría 1 será 0,5. Si la frecuencia de aparición de ese token en la categoaría 2 es de 200 y había 1000 textos en esa categoría, la probabilidad de ese token asociada a la categoría 2 es de 0'2. Dicho de otro modo, estamos calculando la "estrechez" de la relación existente entre un token y una categoría. Cuanto más estrecha es la relación, más peso aporta a la hora de decidir si un texto que contiene ese token pertenece a esa categoría.

Así, iremos uno por uno con todos los tokens, anotando sus probabilidades.

Si alguno de los tokens del texto que se quiere categorizar es "nuevo", es decir, es un token que no apareció en ningún texto de la colección de entrenamiento, su probabilidad en cada categoría será 50% (0,5) en cada una de las categorías*, y no 0 como se podría pensar en un principio ya que, a 0 frecuencia y 1000 textos => 0/1000 = 0. Más adelante veremos que esto puede variar.

Finalmente calcularemos la probabilidad combinada, o sea, la probabilidad de que el texto completo sea de la categoría 1:

abc          
---------------------------
abc + (1 - a)(1 - b)(1 - c)

siendo "a" la probabilidad del token1 en esa categoría, "b" la probabilidad del token2, "c" la probabilidad del token3 etc...

Una vez tenemos la probabilidad de que ese texto pertenezca a esa categoría, haremos lo mismo para las categorías 2 y 3, y finalmente escogeremos aquella que tenga una probabilidad más alta.

* Como decía por ahí atrás, hay casos en los que el perjuicio obtenido al clasificar erróneamente un texto como categoría 1 es mayor que el obtenido al equivocarse y meterlo en la categoría 2. El caso del Spam es un ejemplo. Hago menos daño al usuario si no le detecto un email de Spam (falso negativo) y lo dejo pasar que si le detecto un email de su madre como Spam (falso positivo) y me lo cargo (y si es de su novio/a, ni te cuento el daño que le hago).

Para reflejar eso, se suelen usar un sesgo en la probabilidad (si no hay más de un 70% de probabilidad de que sea Spam, lo dejo pasar). Y en el caso de los tokens "nuevos", en vez de asignarle una probabilidad de 50%/50%, se le da un 40%/60% por ejemplo, donde 40 sería para la categoría peligrosa y 60 para la menos peligrosa.


3- Feedback

Por último, queda la fase de feedback, o sea, retroalimentar al sistema con información acerca de los errores que ha cometido.
Lo que se hace en esta fase es prácticamente lo mismo que en la fase de entrenamiento. Se coge el texto que se ha clasificado mal y se le dice al sistema que es un texto de entrenamiento y que la categoría correcta es X. Con esta información, el sistema lo que tendrá que hacer es irse a las tablas obtenidas en la fase de entrenamiento, restar de la categoría incorrecta la frecuencia de cada uno de los tokens del texto mal clasificado, y sumárselas a la categoría correcta.

Es importante señalar que el feedback lo da el usuario, es decir, que hay que proveerle de algún mecanismo para que pueda indicar al sistema cuando se ha equivocado y cuando ha acertado. Cada vez que le das al "Me gusta" en Facebook, entre otras cosas, probablemente estás alimentando algún sistema de clasificación. También son muy típicos los "Haz clic aquí si éste texto ha sido relevante para tu búsqueda" en los buscadores de internet.

Y eso es to, eso es to, eso es todo amigos.

Cualquier duda, me decís.

Un artículo mítico sobre el tema:

[Tienes que estar registrado y conectado para ver este vínculo]

Willy

Puntos : 9540
Cantidad de envíos : 6101
Fecha de inscripción : 29/04/2010

Volver arriba Ir abajo

Re: Categorización automática de textos usando PLN

Mensaje por Albedrío? el Vie Feb 10 2017, 23:43

[Tienes que estar registrado y conectado para ver esa imagen]
avatar
Albedrío?

Puntos : 5626
Cantidad de envíos : 2232
Fecha de inscripción : 27/09/2013
Edad : 38
Localización : Aquí

Volver arriba Ir abajo

Re: Categorización automática de textos usando PLN

Mensaje por Jorge M. L. el Sáb Feb 11 2017, 17:07

Muy currado el hilo. Interesante enterarse poco a poco de cómo nos maneja Internet, y no viceversa.


"Veo las notas, un Do agudo táctil, clímax de la bella escala vital. Pasando por los semitonos tenues de la constante diaria. Ven a mí diosa de largo pelo, intocable por los huecos ojos de un ser desahuciado.

Si te veo lloro, si te toco te pierdo, si te pierdo quebranto.

Ven...

Inspiración".


[Tienes que estar registrado y conectado para ver esa imagen]

avatar
Jorge M. L.


Puntos : 2512
Cantidad de envíos : 950
Fecha de inscripción : 12/11/2015
Edad : 21
Localización : LeBlanc

Volver arriba Ir abajo

Re: Categorización automática de textos usando PLN

Mensaje por Willy el Lun Feb 13 2017, 20:39

Jorge M. L. escribió:Muy currado el hilo. Interesante enterarse poco a poco de cómo nos maneja Internet, y no viceversa.

Bueno, no hay que ver sólo la parte negativa. Gracias a esos mecanismos tenemos una Internet más ordenada. Los más jóvenes no lo habréis sufrido, pero hubo un tiempo en el que encontrar información en Internet era toda una aventura. Los buscadores no eran universales (buscaban únicamente en aquellas páginas que estaban dadas de alta en el buscador) y no eran tan potentes (las búsquedas instantáneas que da Google, por ejemplo, no eran tan instantáneas por aquél entonces Laughing )


Willy

Puntos : 9540
Cantidad de envíos : 6101
Fecha de inscripción : 29/04/2010

Volver arriba Ir abajo

Re: Categorización automática de textos usando PLN

Mensaje por Miltriades Eupator el Dom Mar 19 2017, 05:06

Lo que tu mencionas no se si esta en consonancia con las cadenas de Markov ya que tocas el tema de probabilidad. Las cadenas de Markov han permitido el desarrollo de algortimos para el procesamiento de textos y detección de voz a través del uso de diccionarios desde el punto de computación. Estas cadenas permiten modelar el sistema en este caso un texto por ejemplo desde el punto de vista estocastico.
avatar
Miltriades Eupator

Puntos : 1979
Cantidad de envíos : 301
Fecha de inscripción : 15/04/2013
Edad : 29
Localización : Colombia

Volver arriba Ir abajo

Re: Categorización automática de textos usando PLN

Mensaje por Willy el Dom Mar 19 2017, 11:28

Buenas!!

Para abordar el tema del procesamiento de textos en lenguaje natural lo primero que hacemos es decidir el nivel de complejidad en el que necesitamos movernos para abordar el problema.
Así, un texto puede ser simplemente un conjunto de letras y símbolos, si eso nos sirve para cumplir con nuestro objetivo, o necesitamos complicarlo diciendo que un texto es un conjunto de palabras, o más aún, diciendo que un texto es un conjunto de frases.

La estrategia que hemos planteado se basa en que un texto es únicamente un conjunto de palabras, y no importa el orden de aparición de las mismas, sino únicamente su frecuencia.

Si necesitáramos desarrollar, por ejemplo, un sistema que compruebe la corrección sintáctica de un texto, necesitaríamos ascender en ese nivel de complejidad, ya que en este caso el orden de aparición de las palabras es absolutamente relevante, y entonces hablaríamos de frases, y no sólo de palabras.

Y en este caso es cuando entrarían en juego las máquinas de estados, las cadenas de Markov etc.

Willy

Puntos : 9540
Cantidad de envíos : 6101
Fecha de inscripción : 29/04/2010

Volver arriba Ir abajo

Re: Categorización automática de textos usando PLN

Mensaje por Disperso el Sáb Abr 29 2017, 01:01

Willy has hecho o haces más cosas de reconocimiento de patrones o sólo esa?
Y Big Data?
avatar
Disperso

Puntos : 4162
Cantidad de envíos : 2016
Fecha de inscripción : 11/03/2013
Localización : La parra

Volver arriba Ir abajo

Re: Categorización automática de textos usando PLN

Mensaje por Willy el Sáb Abr 29 2017, 10:56

No he hecho más. El curro me llevo por otros derroteros.
El BigData si que lo tengo al alcance, pero tendría que ceder tiempo de otras cosas que ahora mismo son prioritarias

Willy

Puntos : 9540
Cantidad de envíos : 6101
Fecha de inscripción : 29/04/2010

Volver arriba Ir abajo

Re: Categorización automática de textos usando PLN

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.