miércoles, 3 de octubre de 2012

Normalización del Texto => Tokenización

Antes de realizar una tarea de PLN hay que normalizar el texto, esto incluye 3 actividades:

1. Segmentación/tokenización de las palabras.
2. Normalización del formato de las plabras
3. Segmentación de las oraciones en el texto.

Algunos conceptos:

Lema (Lemma): palabras que comparten un tronco común, que hacen referencia al mismo concepto básico 
           Ejemplo: gato, gatos, gata son palabras con el mismo lema.



Forma de la palabra (Wordform): la forma completa de la palabra.
           Ejemplo: gato, gatos, gata son palabras con distinta forma (different wordform)

Tipo (Type): Un elemento del vocabulario.
                      (por ahora pensemos en el vocabulario como un conjunto de palabras)

Token: una instancia de un tipo en un texto dado.

            Ejemplo, en la oración: "Templada y riente (como lo son las del otoño en la muy graciosa ciudad de Buenos Aires) resplandecía la mañana de aquel veintiocho de abril"

hay 25 palabras, pero en verdad si contamos a "Buenos-Aires" como una sola palabra (ya que es un nombre propio) hay: 24 => 24 tokens

Pero tipos hay: 21 ya que las palabras: "de" y "la" se repiten.

si pasáramos a sus lemas las palabras de la oración entonces los tipos serían: 18 ya que "de" y "del" tienen el mismo lema y "la", "lo" y "las" también comparten un mismo lema.


N = número de tokens
V = vocabulario (conjunto de tipos )
|V| = tamaño del vocabulario

Ejemplos de Vocabularios:

Tokens = N Types = |V|
conversaciones telefónicas atendidas por una central 2.4 millones 20 mil
Shakespeare (obras completas) 884.000 31.000


Algoritmo Simple de Tokenización

La forma más sencilla de Tokenización es identificar las palabras separando los caracteres alfabéticos de los demás, en particular del carácter espacio: " ". A continuación voy a mostrar una forma de muy sencilla de Tokenizar un texto en Linux utilizando el comando: "tr", sin embargo esta forma solo vale en ingles ya que "tr" no soporta codificaciones de caracteres que usen más de 1 byte como por ejemplo Unicode. 

tr 'A-Za-z' '\n' < archivo_de_texto.txt | sort | uniq -c

esto mostrará una lista de palabras únicas, es decir de tipos, ordenadas alfabeticamente junto con la cantidad de veces que se repiten. Por ejemplo para el archivo: alice_in_wonderland.txt (el texto original en ingles de Alicia en el País de las Maravillas)

mostrará algo como:

615 a
  17 A
    1 abide
    1 able
  94 about
    3 above
......

Para unificar lo que está en mayúsculas y minúsculas usamos la siguiente secuencia:

tr 'A-Z' 'a-z' < alice_in_wonderland.txt | tr -sc 'A-Za-z' '\n' | sort | uniq -c

y para ordenar por cantidad de apariciones:

tr 'A-Z' 'a-z' < alice_in_wonderland.txt | tr -sc 'A-Za-z' '\n' | sort | uniq -c | sort -n -r

esto mostrará algo como

1644 the
 872  and
  729 to
  632 a
.....

Problemas comunes de Tokenización

Buenos Aires   => 1 token ó 2 ?
estado del arte => 1 token ó 3 ?
RR.HH.          => 1 token ó 2

En ingles y en francés donde son comunes los apostrofes aparecen otros inconvenientes:

What´re, I'm, isn't => what are, I am, is not
L'ensemble =>Le ensemble

En alemán aparecen otro tipo de errores con las palabras compuestas (que pueden escribirse todas juntas):

Lebensversicherungsgesellschaftangestellter => "El seguro de vida empleado de la compañía"

En Chino y Japones no hay separación entre las palabras, además en Japones pueden aparecer distintos alfabetos entremezclados: Katana, Hiragana, kanji y Romanji








1 comentario:

  1. ¿Por qué la tokenizacion se debe aplicar antes de clasificar textos?

    ResponderEliminar