No todas las palabras valen lo mismo
Volvemos a utilizar nuestra famosa escena de Cadena Perpetua. En este post la presentamos por primera vez, y hemos hecho con ella algunos experimentos interesantes. Aquí vamos a hacer un experimento tan fácil como ilustrativo: eliminar artículos y preposiciones:
así fue como penúltimo día trabajo pelotón convictos que había alquitranado tejado taller primavera 1949 terminó sentado diez mañana, bebiéndose cerveza pilsener helada cortesía mayor cabronazo que jamás haya estado cuidado prisión estatal.
No hay ningún problema para entender el significado de este extracto de la escena (sólo hemos utilizado el primer párrafo). La conclusión que se saca es que hay ciertas palabras que, aunque son necesarias para tener estructuras gramaticales correctas, aportan bastante menos al significado del documento que otras palabras. Además, si quisiéramos hacer un estudio sobre las palabras más frecuentes en un corpus de documentos, nuestro estudio aportaría poco si el top de palabras más frecuentes está lleno de artículos y preposiciones.
Este simple ejercicio nos ayuda a introducir un concepto muy importante dentro del Procesamiento de Lenguaje Natural: stop words.
Stop words
La intuición no falla: stop words son todas esas palabras que no queremos que se tengan en cuenta en ningún tipo de análisis del corpus. De otra forma: es la lista de palabras que queremos eliminar del corpus para dejar de considerarlas. Stop considering those words!
Es evidente que la lista de stop words es dependiente del idioma que se utilice en los documentos del corpus. Lo que no es tan evidente es que esa lista también es dependiente del dominio del propio corpus. Por ejemplo, si estuviéramos analizando el texto de la Constitución española, probablemente la palabra «artículo» se va a repetir mucho y puede convenir eliminarla para que no destaque innecesariamente.
Hay técnicas que ponderan de forma automática el peso que se otorga a las palabras en función de su presencia en los diferentes documentos del corpus (como TF-IDF). Seguro que tendremos oportunidad de hablar de ellas en algún post.
Como de costumbre, veamos cómo se utiliza la lista de stop words Python sobre las frases de la escena de Cadena Perpetua:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import pandas as pd import nltk from nltk.tokenize import RegexpTokenizer from nltk.corpus import stopwords nltk.download('stopwords') raw_text = "Y así fue como en el penúltimo día de trabajo el pelotón de convictos que había alquitranado el tejado del taller la primavera de 1949 terminó sentado a las diez de la mañana, bebiéndose una cerveza pilsener helada por cortesía del mayor cabronazo que jamás haya estado al cuidado de una prisión estatal. Ese maldito capullo incluso logró parecer benévolo. Nos sentamos a beber con el sol a la espalda y nos sentimos como hombres libres. Diablos, fue como si estuviéramos alquitranando el tejado de una de nuestras propias casas. Era como si fuéramos los señores de la creación. En cuanto a Andy, se pasó todo el descanso sentado en la sombra con una extraña sonrisa en su rostro, mirando cómo nos bebíamos nuestra cerveza. Algunos dirán que lo hizo para ganarse el favor de los celadores, o para ganarse amigos entre los presos. Pero yo creo que lo hizo para sentirse normal, aunque fuese sólo por un momento" corpus = raw_text.split('.') trimmed_corpus = [sentence.strip().lower() for sentence in corpus] word_tokenizer = RegexpTokenizer(r'\w+') tokenized_corpus = [word_tokenizer.tokenize(sentence) for sentence in trimmed_corpus] # We create a stop word list stops = set(stopwords.words("spanish")) filtered_tokenized_corpus = [] for tokenized_sentence in tokenized_corpus: filtered_tokenized_corpus.append([token for token in tokenized_sentence if token not in stops]) for index, sentence in enumerate(filtered_tokenized_corpus): print("Frase {} = {}\n".format(index + 1, sentence)) |
Frase 2 = [‘maldito’, ‘capullo’, ‘incluso’, ‘logró’, ‘parecer’, ‘benévolo’]
Frase 3 = [‘sentamos’, ‘beber’, ‘sol’, ‘espalda’, ‘sentimos’, ‘hombres’, ‘libres’]
Frase 4 = [‘diablos’, ‘si’, ‘alquitranando’, ‘tejado’, ‘propias’, ‘casas’]
Frase 5 = [‘si’, ‘señores’, ‘creación’]
Frase 6 = [‘cuanto’, ‘andy’, ‘pasó’, ‘descanso’, ‘sentado’, ‘sombra’, ‘extraña’, ‘sonrisa’, ‘rostro’, ‘mirando’, ‘cómo’, ‘bebíamos’, ‘cerveza’]
Frase 7 = [‘dirán’, ‘hizo’, ‘ganarse’, ‘favor’, ‘celadores’, ‘ganarse’, ‘amigos’, ‘presos’]
Frase 8 = [‘creo’, ‘hizo’, ‘sentirse’, ‘normal’, ‘aunque’, ‘sólo’, ‘momento’]
Takeaway
Hay palabras que aportan poco al significado de una frase o un documento y que por contra pueden introducir ruido en el análisis de un corpus. Es habitual construir una lista con esas palabras, llamada stop words, y eliminarlas del corpus. Las stop words son dependientes del idioma y del dominio, así que dependiendo del propósito de nuestro análisis la lista puede contener palabras diferentes.