Python para PNL: trabajar con archivos de texto y PDF

Este es el primer artículo de mi serie de artículos sobre Python para el procesamiento del lenguaje natural (NLP). En este artículo, comenzaremos con los conceptos básicos de Python para...

Este es el primer artículo de mi serie de artículos sobre Python para Procesamiento natural del lenguaje (PNL). En este artículo, comenzaremos con los conceptos básicos de Python para PNL. Veremos cómo podemos trabajar con archivos de texto simples y archivos PDF usando Python.

Trabajar con archivos de texto {#trabajar con archivos de texto}

Text files are probably the most basic types of files that you are going to encounter in your NLP endeavors. In this section, we will see how to leer de un archivo de texto in Python, create a text file, and escribir datos en el archivo de texto.

Leer un archivo de texto

Cree un archivo de texto con el siguiente texto y guárdelo en su directorio local con una extensión ".txt".

1
2
3
Welcome to Natural Language Processing
It is one of the most exciting research areas as of today
We will see how Python can be used to work with text files.

En mi caso, almacené el archivo llamado "myfile.txt" en mi directorio raíz "D:".

Leer todo el contenido del archivo

Ahora veamos cómo podemos leer todo el contenido del archivo. El primer paso es especificar la ruta del archivo, como se muestra a continuación:

1
myfile = open("D:\myfile.txt")

Para abrir el archivo, puede usar la función “abrir” incorporada de Python. Si ejecuta el código anterior y no ve un error, eso significa que su archivo se abrió con éxito. Asegúrese de cambiar la ruta del archivo a la ubicación en la que guardó su archivo de texto.

Veamos ahora lo que está almacenado en la variable myfile:

1
print(myfile)

La salida se ve así:

1
<_io.TextIOWrapper name='D:\\myfile.txt' mode='r' encoding='cp1252'>

El resultado dice que la variable myfile es un contenedor para el archivo myfile.txt y abre el archivo en modo de solo lectura.

Si especifica la ruta de archivo incorrecta, es probable que obtenga el siguiente error:

1
2
myfile222 = open("D:\myfile222.txt")
print(myfile222)
1
FileNotFoundError: [Errno 2] No such file or directory: 'D:\\myfile222.txt'

Cada vez que obtiene Errno 2, puede haber dos razones. O su archivo no existe o proporcionó la ruta de archivo incorrecta para la función abrir.

Ahora, leamos el contenido del archivo. Para hacerlo, debe llamar a la función read() en la variable myfile, como se muestra a continuación:

1
2
myfile = open("D:\myfile.txt")
print(myfile.read())

En la salida, debería ver el texto del archivo, como se muestra a continuación:

1
2
3
Welcome to Natural Language Processing
It is one of the most exciting research areas as of today
We will see how Python can be used to work with text files.

Ahora, si intenta volver a llamar al método read, verá que no se imprimirá nada en la consola:

1
print(myfile.read())

Esto se debe a que una vez que llamas al método read, el cursor se mueve al final del texto. Por lo tanto, cuando llama a leer nuevamente, no se muestra nada ya que no hay más texto para imprimir.

Una solución a este problema es que después de llamar al método read(), llame al método seek() y pase 0 como argumento. Esto moverá el cursor de regreso al inicio del archivo de texto. Mire el siguiente script para ver cómo funciona esto:

1
2
3
4
myfile = open("D:\myfile.txt")
print(myfile.read())
myfile.seek(0)
print(myfile.read())

En la salida, verá el contenido del archivo de texto impreso dos veces.

Una vez que haya terminado de trabajar con un archivo, es importante cerrarlo para que otras aplicaciones puedan acceder a él. Para hacerlo, debe llamar al método close().

1
myfile.close()
Leer un archivo línea por línea

En lugar de leer todo el contenido del archivo a la vez, también podemos leer el contenido del archivo linea por linea. Para hacerlo, necesitamos ejecutar el método readlines(), que devuelve cada línea del archivo de texto como un elemento de la lista.

1
2
myfile = open("D:\myfile.txt")
print(myfile.readlines())

En el resultado, verá cada línea en el archivo de texto como un elemento de lista:

1
['Welcome to Natural Language Processing\n', 'It is one of the most exciting research areas as of today\n', 'We will see how Python can be used to work with text files.']

En muchos casos, esto hace que sea más fácil trabajar con el texto. Por ejemplo, ahora podemos recorrer fácilmente cada línea e imprimir la primera palabra de la línea.

1
2
3
myfile = open("D:\myfile.txt")
for lines in myfile:
    print(lines.split()[0])

La salida se ve así:

1
2
3
Welcome
It
We

Escribir en un archivo de texto {#escribir en un archivo de texto}

Para escribir en un archivo de texto, simplemente tiene que abrir un archivo con el modo establecido en w o w+. El primero abre un archivo en modo de escritura, mientras que el segundo abre el archivo tanto en modo de lectura como de escritura. Si el archivo no existe, se creará. Es importante mencionar que si abre un archivo que ya contiene texto con el modo w o w+, se eliminará todo el contenido del archivo existente, como se muestra a continuación:

1
2
myfile = open("D:\myfile.txt", 'w+')
print(myfile.read())

En la salida, no verá nada impreso en la pantalla ya que el archivo se abre usando el modo w+, todo el contenido del archivo se ha eliminado. Si desea evitar esto, querrá agregar texto en su lugar, que también cubro a continuación.

Ahora, escribamos algo de contenido en el archivo usando el método write().

1
2
3
4
5
myfile = open("D:\myfile.txt", 'w+')
print(myfile.read())
myfile.write("The file has been rewritten")
myfile.seek(0)
print(myfile.read())

En el script anterior, escribimos texto en el archivo y luego llamamos al método seek() para mover el cursor de vuelta al inicio y luego llamamos al método read para leer el contenido del archivo. En el resultado, verá el contenido recién agregado como se muestra a continuación:

1
The file has been rewritten

Muchas veces, simplemente no necesita borrar el contenido existente del archivo. Más bien, es posible que deba agregar el contenido al final del archivo.

Para hacerlo, debe abrir el archivo con el modo a+ que se refiere a agregar más leer.

Nuevamente cree un archivo con los siguientes contenidos y guárdelo como "myfile.txt" en el directorio "D":

1
2
3
Welcome to Natural Language Processing
It is one of the most exciting research areas as of today
We will see how Python can be used to work with text files.

Ejecute el siguiente script para abrir el archivo con el modo de adición:

1
2
3
myfile = open("D:\myfile.txt", 'a+')
myfile.seek(0)
print(myfile.read())

En la salida, verá el contenido del archivo.

A continuación, agreguemos algo de texto al archivo.

1
myfile.write("\nThis is a new line")

Ahora vamos a leer de nuevo el contenido del archivo:

1
2
myfile.seek(0)
print(myfile.read())

En el resultado, verá la línea recién agregada al final del texto como se muestra a continuación:

1
2
3
4
Welcome to Natural Language Processing
It is one of the most exciting research areas as of today
We will see how Python can be used to work with text files.
This is a new line

Finalmente, antes de pasar a la siguiente sección, veamos cómo se puede usar el administrador de contexto para cerrar automáticamente el archivo después de realizar las operaciones deseadas.

1
2
with open("D:\myfile.txt") as myfile:
    print(myfile.read())

Usando la palabra clave with, como se muestra arriba, no necesita cerrar explícitamente el archivo. Más bien, la secuencia de comandos anterior abre el archivo, lee su contenido y luego lo cierra automáticamente.

Trabajar con archivos PDF

Además de los archivos de texto, a menudo necesitamos trabajar con archivos PDF para realizar diferentes tareas de procesamiento de lenguaje natural. De manera predeterminada, Python no viene con ninguna biblioteca integrada que pueda usarse para leer o escribir archivos PDF. Más bien, podemos usar la biblioteca PyPDF2.

Antes de que podamos usar la biblioteca PyPDF2, debemos instalarla. Si está utilizando el instalador pip, puede usar el siguiente comando para instalar la biblioteca PyPDF2:

1
$ pip install PyPDF2

Alternativamente, si está utilizando Python desde el entorno de Anaconda, puede ejecutar el siguiente comando en el símbolo del sistema de conda:

1
$ conda install -c conda-forge pypdf2

Nota: Es importante mencionar aquí que un documento PDF se puede crear a partir de diferentes fuentes, como documentos de procesamiento de texto, imágenes, etc. En este artículo, solo trataremos los documentos PDF creados con procesadores de texto. Para los documentos PDF creados a partir de imágenes, existen otras bibliotecas especializadas que explicaré en un artículo posterior. Por ahora, solo trabajaremos con los documentos PDF generados con procesadores de texto.

Como documento ficticio para jugar, puede descargar el PDF desde este enlace:

http://www.bavtailor.com/wp-content/uploads/2018/10/Lorem-Ipsum.pdf

Descargue el documento localmente en la raíz de la unidad "D".

Leer un documento PDF

Para leer un documento PDF, primero tenemos que abrirlo como cualquier archivo ordinario. Mira el siguiente guión:

1
2
import PyPDF2
mypdf = open('D:\Lorem-Ipsum.pdf', mode='rb')

Es importante mencionar que al abrir un archivo PDF, el modo debe establecerse en rb, que significa "leer binario", ya que la mayoría de los archivos PDF están en formato binario.

Una vez que se abre el archivo, necesitaremos llamar a la función PdfFileReader() de la biblioteca PyPDF2, como se muestra a continuación.

1
pdf_document = PyPDF2.PdfFileReader(mypdf)

Ahora, usando la variable pdf_document, podemos realizar una variedad de funciones de lectura. Por ejemplo, para obtener el número total de páginas en el documento PDF, podemos usar el atributo numPages:

1
pdf_document.numPages

Dado que solo tenemos una página 1, en nuestro documento PDF, verá 1 en la salida.

Finalmente, para extraer el texto del documento PDF, primero debe obtener la página del documento PDF usando la función getPage().

A continuación, puede llamar a la función extractText() para extraer el texto de esa página en particular.

El siguiente script extrae el texto de la primera página del PDF y luego lo imprime en la consola.

1
2
3
first_page = pdf_document.getPage(0)

print(first_page.extractText())

En la salida, debería ver el texto de la primera página del PDF.

Escribir en un documento PDF {#escribir en un documento PDF}

No es posible escribir cadenas de Python directamente en un documento PDF utilizando la biblioteca PyPDF2 debido a las fuentes y otras restricciones. Sin embargo, por el bien de la demostración, leeremos el contenido de nuestro documento PDF y luego escribiremos ese contenido en otro archivo PDF que crearemos.

Primero leamos el contenido de la primera página de nuestro documento PDF.

1
2
3
4
5
6
7
import PyPDF2

mypdf = open('D:\Lorem-Ipsum.pdf', mode='rb')
pdf_document = PyPDF2.PdfFileReader(mypdf)
pdf_document.numPages

page_one = pdf_document.getPage(0)

El script anterior lee la primera página de nuestro documento PDF. Ahora podemos escribir el contenido de la primera página en un nuevo documento PDF usando el siguiente script:

1
pdf_document_writer = PyPDF2.PdfFileWriter()

La secuencia de comandos anterior crea un objeto que se puede usar para escribir contenido en un archivo PDF. Primero, agregaremos una página a este objeto y le pasaremos la página que recuperamos del otro PDF.

1
pdf_document_writer.addPage(page_one)

A continuación, debemos abrir un nuevo archivo con permisos wb (escribir binario). Abrir un archivo con tales permisos crea un nuevo archivo si no existe uno.

1
pdf_output_file = open('new_pdf_file.pdf', 'wb')

Finalmente, debemos llamar al método write() en el objeto de escritura de PDF y pasarle el archivo recién creado.

1
pdf_document_writer.write(pdf_output_file)

Cierre los archivos mypdf y pdf_output_file y vaya al directorio de trabajo del programa. Debería ver un nuevo archivo new_pdf_file.pdf en su editor. Abra el archivo y debería ver que contiene el contenido de la primera página de nuestro PDF original.

Intentemos leer el contenido de nuestro documento PDF recién creado:

1
2
3
4
5
6
7
8
9
import PyPDF2

mypdf = open(r'C:\Users\Admin\new_pdf_file.pdf', mode='rb')

pdf_document = PyPDF2.PdfFileReader(mypdf)
pdf_document.numPages
page_one = pdf_document.getPage(0)

print(page_one.extractText())

Trabajemos ahora con un archivo PDF más grande. Descarga el archivo PDF desde este enlace:

http://ctan.math.utah.edu/ctan/tex-archive/macros/latex/contrib/lipsum/lipsum.pdf

Guárdelo en su directorio local. El nombre del archivo descargado será "lipsum.pdf".

Ejecute el siguiente script para ver el número de páginas en el archivo:

1
2
3
4
5
import PyPDF2

mypdf = open(r'D:\lipsum.pdf', mode='rb')
pdf_document = PyPDF2.PdfFileReader(mypdf)
pdf_document.numPages

En la salida, verá 87 impresos ya que hay 87 páginas en el PDF. Imprimamos todas las páginas del documento en la consola:

1
2
3
4
5
6
7
8
import PyPDF2

mypdf = open(r'D:\lipsum.pdf', mode='rb')
pdf_document = PyPDF2.PdfFileReader(mypdf)

for i in range(pdf_document.numPages):
    page_to_print = pdf_document.getPage(i)
    print(page_to_print.extractText())

En la salida, verá todas las páginas del documento PDF, impresas en la pantalla.

Conclusión

Leer y escribir documentos de texto es un paso fundamental para desarrollar aplicaciones de procesamiento de lenguaje natural. En este artículo, explicamos cómo podemos trabajar con los archivos de texto y PDF usando Python. Vimos cómo leer y escribir archivos de texto y PDF.

En el próximo artículo, comenzaremos nuestra discusión sobre algunas otras tareas de NLP como derivación, lematización, tokenización con la biblioteca spaCy.