PNL simple en Python con TextBlob: Tokenización

En este artículo, veremos cómo tokenizar un texto dado usando la biblioteca TextBlob. También veremos ejemplos de cómo tokenizar palabras y oraciones.

Introducción

La cantidad de datos textuales en Internet ha aumentado significativamente en las últimas décadas. No hay duda de que el procesamiento de esta cantidad de información debe ser automatizado, y el paquete TextBlob es una de las formas bastante simples de realizar * PNL* - Procesamiento del Lenguaje Natural.

Proporciona una API simple para sumergirse en tareas comunes de procesamiento de lenguaje natural (NLP), como etiquetado de partes del discurso, extracción de frases nominales, tokenización, análisis de sentimientos, clasificación, traducción y más.

No se necesitan requisitos técnicos especiales para utilizar esta biblioteca. Por ejemplo, TextBlob es aplicable tanto para Python 2 como para Python 3. En caso de que no tenga ninguna información textual a mano, TextBlob proporciona los corpus necesarios de la base de datos NLTK.

Instalando TextBlob

Empecemos instalando TextBlob y el corpus NLTK:

1
2
$ pip install -U textblob
$ python -m textblob.download_corpora

Nota: Este proceso puede llevar algún tiempo debido a la gran cantidad de algoritmos y corpus que contiene esta biblioteca.

¿Qué es la tokenización?

Antes de profundizar en el campo de la PNL, también debería poder reconocer estos términos clave:

  • Corpus (o corpora en plural) - es simplemente una determinada colección de datos lingüísticos (por ejemplo, textos). Los corpus se utilizan normalmente para entrenar diferentes modelos de clasificación de texto o análisis de sentimiento, por ejemplo.

  • Token: es una cadena final que se separa del texto principal o, en otras palabras, es una salida de tokenización.

¿Qué es la tokenización en sí?

La tokenización o segmentación de palabras es un proceso simple de separar oraciones o palabras del corpus en pequeñas unidades, es decir, tokens.

Una ilustración de esto podría ser la siguiente oración:

  • Input (corpus): El mal que hacen los hombres vive tras ellos

  • Salida (fichas): | El | mal | que | hombres | hacer | vive | después de | ellos |

Aquí, la oración de entrada se tokeniza sobre la base de espacios entre palabras. También puede tokenizar caracteres de una sola palabra (por ejemplo, a-p-p-l-e de apple) o separar oraciones de un texto.

La tokenización es una de las etapas básicas y cruciales del procesamiento del lenguaje. Transforma material textual no estructurado en datos. Esto podría aplicarse aún más en el desarrollo de varios modelos de traducción automática, optimización de motores de búsqueda o diferentes consultas comerciales.

Implementando tokenización en código

En primer lugar, es necesario establecer un objeto TextBlob y definir un corpus de muestra que se tokenizará más adelante. Por ejemplo, intentemos tokenizar una parte del poema If escrito por R. Kipling:

1
2
3
4
5
from textblob import TextBlob

# Creating the corpus
corpus = '''If you can force your heart and nerve and sinew to serve your turn long after they are gone. And so hold on when there is nothing in you except the Will which says to them: 'Hold on!'
'''

Una vez que se crea el objeto, debe pasarse como argumento al constructor TextBlob:

1
blob_object = TextBlob(corpus)

Una vez construido, podemos realizar varias operaciones en este blob_object. Ya contiene nuestro corpus, categorizado hasta cierto punto.

Tokenización de palabras {#tokenización de palabras}

Finalmente, para obtener las palabras tokenizadas, simplemente recuperamos el atributo words del blob_object creado. Esto nos da una lista que contiene objetos Word, que se comportan de manera muy similar a los objetos str:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
from textblob import TextBlob

corpus = '''If you can force your heart and nerve and sinew to serve your turn long after they are gone. And so hold on when there is nothing in you except the Will which says to them: 'Hold on!'
'''

blob_object = TextBlob(corpus)

# Word tokenization of the sample corpus
corpus_words = blob_object.words
# To see all tokens
print(corpus_words)
# To count the number of tokens
print(len(corpus_words))

Los comandos de salida deberían darte lo siguiente:

1
2
['If', 'you', 'can', 'force', 'your', 'heart', 'and', 'nerve', 'and', 'sinew', 'to', 'serve', 'your', 'turn', 'long', 'after', 'they', 'are', 'gone', 'and', 'so', 'hold', 'on', 'when', 'there', 'is', 'nothing', 'in', 'you', 'except', 'the', 'Will', 'which', 'says', 'to', 'them', 'Hold', 'on']
38

Vale la pena señalar que este enfoque tokeniza las palabras usando SPACE como carácter delimitador. Podemos cambiar este delimitador, por ejemplo, a un TAB:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
from textblob import TextBlob
from nltk.tokenize import TabTokenizer

corpus = '''If you can force your heart and nerve and sinew to serve your turn long after they are gone.  And so hold on when there is nothing in you except the Will which says to them: 'Hold on!'
'''

tokenizer = TabTokenizer()
blob_object = TextBlob(corpus, tokenizer = tokenizer)

# Word tokenization of the sample corpus
corpus_words = blob_object.tokens
# To see all tokens
print(corpus_words)

Tenga en cuenta que hemos agregado una TAB después de la primera oración aquí. Cómo, el corpus de las palabras se parece a:

1
['If you can force your heart and nerve and sinew to serve your turn long after they are gone.','And so hold on when there is nothing in you except the Will which says to them: 'Hold on!']

nltk.tokenize también contiene otras opciones de tokenización. De forma predeterminada, utiliza el SpaceTokenizer que no necesita definir explícitamente, pero puede hacerlo. Aparte de estos dos, también contiene tokenizadores útiles como LineTokenizer, BlankLineTokenizer y WordPunctTokenizer.

Puede encontrar una lista completa en su [documentación] (https://www.nltk.org/_modules/nltk/tokenize.html).

Tokenización de oraciones

Para tokenizar a nivel de oración, usaremos el mismo blob_object. Esta vez, en lugar del atributo palabras, usaremos el atributo oraciones. Esto devuelve una lista de objetos Sentence:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
from textblob import TextBlob

corpus = '''If you can force your heart and nerve and sinew to serve your turn long after they are gone. And so hold on when there is nothing in you except the Will which says to them: 'Hold on!'
'''

blob_object = TextBlob(corpus)

# Sentence tokenization of the sample corpus
corpus_sentence = blob_object.sentences
# To identify all tokens
print(corpus_sentence)
# To count the number of tokens
print(len(corpus_sentence))

Producción:

1
2
[Sentence("If you can force your heart and nerve and sinew to serve your turn long after they are gone"), Sentence("And so hold on when there is nothing in you except the Will which says to them: 'Hold on!")]
2

Conclusión

La tokenización es un paso de preprocesamiento de datos muy importante en NLP e implica dividir un texto en fragmentos más pequeños llamados tokens. Estos tokens pueden ser palabras individuales, oraciones o caracteres en el texto original.

TextBlob es una gran biblioteca para ingresar a la PNL, ya que ofrece una API simple que permite a los usuarios pasar rápidamente a realizar tareas de PNL.

En este artículo, discutimos solo una de las tareas de PNL con las que se ocupa TextBlob, pero en una próxima serie, veremos cómo resolver problemas más complejos, como lidiar con inflexiones de palabras, formas plurales y singulares de palabras, y más.