Рубрики
Без рубрики

Python для НЛП: Работа с текстовыми и PDF-файлами

Автор оригинала: Usman Malik.

Python для НЛП: Работа с текстовыми и PDF-файлами

Это первая статья в моей серии статей по Python for Natural Language Processing (NLP). В этой статье мы начнем с основ Python для НЛП. Мы увидим, как мы можем работать с простыми текстовыми файлами и PDF-файлами с помощью Python.

Работа с текстовыми файлами

Текстовые файлы, вероятно, являются самыми основными типами файлов, с которыми вы столкнетесь в своих попытках НЛП. В этом разделе мы рассмотрим, как читать из текстового файла в Python, создавать текстовый файл и записывать данные в текстовый файл .

Чтение текстового файла

Создайте текстовый файл со следующим текстом и сохраните его в локальном каталоге с расширением “.txt”.

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.

В моем случае я сохранил файл с именем “myfile.txt” в моем корневом каталоге “D:”.

Чтение Всего Содержимого Файла

Теперь давайте посмотрим, как мы можем прочитать все содержимое файла. Первым шагом является указание пути к файлу, как показано ниже:

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

Чтобы открыть файл, вы можете использовать встроенную функцию Python open . Если вы выполняете вышеприведенный фрагмент кода и не видите ошибки, это означает, что ваш файл был успешно открыт. Обязательно измените путь к файлу на тот, в котором вы сохранили текстовый файл.

Давайте теперь посмотрим, что хранится в переменной myfile :

print(myfile)

Вывод выглядит следующим образом:

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

Вывод гласит, что переменная my file является оболочкой для myfile.txt file и открывает файл в режиме только для чтения.

Если вы укажете неправильный путь к файлу, то, скорее всего, получите следующую ошибку:

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

Всякий раз, когда вы получаете Errno 2, могут быть две причины. Либо ваш файл не существует, либо вы указали неверный путь к файлу функции open .

Теперь давайте прочитаем содержимое файла. Для этого вам нужно вызвать функцию read() в переменной myfile , как показано ниже:

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

В выходных данных вы должны увидеть текст файла, как показано ниже:

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.

Теперь, если вы попытаетесь снова вызвать метод read , вы увидите, что на консоли ничего не будет напечатано:

print(myfile.read())

Это происходит потому, что как только вы вызываете метод read , курсор перемещается в конец текста. Поэтому, когда вы снова вызываете read, ничего не отображается, так как больше нет текста для печати.

Решение этой проблемы заключается в том, что после вызова метода read() вызовите метод seek() и передайте 0 в качестве аргумента. Это приведет к перемещению курсора обратно в начало текстового файла. Посмотрите на следующий сценарий, чтобы увидеть, как это работает:

myfile = open("D:\myfile.txt")
print(myfile.read())
myfile.seek(0)
print(myfile.read())

В выходных данных вы увидите содержимое текстового файла, напечатанного дважды.

Как только вы закончите работу с файлом, важно закрыть его, чтобы другие приложения могли получить к нему доступ. Для этого вам нужно вызвать метод close () .

myfile.close()
Чтение файла Строка за строкой

Вместо того, чтобы читать все содержимое файла сразу, мы также можем читать содержимое файла строка за строкой . Для этого нам нужно выполнить метод readlines () , который возвращает каждую строку в текстовом файле в виде listitem.

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

В выходных данных вы увидите каждую строку в текстовом файле как элемент списка:

['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.']

Во многих случаях это облегчает работу с текстом. Например, теперь мы можем легко перебирать каждую строку и печатать первое слово в строке.

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

Вывод выглядит следующим образом:

Welcome
It
We

Запись в текстовый файл

Для записи в текстовый файл вам просто нужно открыть файл с режимом, установленным на w или w+ . Первый открывает файл в режиме записи, в то время как второй открывает файл как в режиме чтения, так и в режиме записи. Если файл не существует, он будет создан. Важно отметить, что если вы откроете файл, который уже содержит некоторый текст в режиме w или w+ , все существующее содержимое файла будет удалено, как показано ниже:

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

В выводе вы не увидите ничего напечатанного на экране, так как файл открыт в режиме w+ , все содержимое файла было удалено. Если вы хотите избежать этого, то вместо этого вам нужно будет добавить текст, который я также рассмотрю ниже.

Теперь давайте запишем некоторое содержимое в файл с помощью метода write () .

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

В приведенном выше сценарии мы записываем текст в файл, а затем вызываем метод seek () , чтобы переместить курсор обратно в начало, а затем вызываем метод read , чтобы прочитать содержимое файла. В выходных данных вы увидите только что добавленный контент, как показано ниже:

The file has been rewritten

Часто вам не нужно просто стереть существующее содержимое файла. Скорее всего, вам может понадобиться добавить содержимое в конце файла.

Для этого вам нужно открыть файл с режимом a+ , который ссылается на append plus read.

Снова создайте файл со следующим содержимым и сохраните его как “myfile.txt” в каталоге “D”:

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.

Выполните следующий сценарий, чтобы открыть файл в режиме добавления:

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

В выходных данных вы увидите содержимое файла.

Далее, давайте добавим немного текста в файл.

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

Давайте теперь еще раз прочитаем содержимое файла:

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

В выходных данных вы увидите новую добавленную строку в конце текста, как показано ниже:

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

Наконец, прежде чем перейти к следующему разделу, давайте посмотрим, как можно использовать context manager для автоматического закрытия файла после выполнения нужных операций.

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

Используя ключевое слово with , как показано выше, вам не нужно явно закрывать файл. Скорее, приведенный выше сценарий открывает файл, считывает его содержимое, а затем автоматически закрывает.

Работа с PDF-файлами

В дополнение к текстовым файлам нам часто приходится работать с PDF-файлами для выполнения различных задач обработки естественного языка. По умолчанию Python не поставляется с какой-либо встроенной библиотекой, которая может быть использована для чтения или записи PDF-файлов. Скорее, мы можем использовать библиотеку PyPDF2 .

Прежде чем мы сможем использовать библиотеку PyPDF2, нам нужно ее установить. Если вы используете pip installer, вы можете использовать следующую команду для установки библиотеки PyPDF2:

$ pip install PyPDF2

Кроме того, если вы используете Python из среды Anaconda, вы можете выполнить следующую команду в командной строке conda:

$ conda install -c conda-forge pypdf2

Примечание : Здесь важно отметить, что PDF-документ может быть создан из различных источников, таких как текстовые документы, изображения и т. Д. В этой статье мы будем иметь дело только с PDF-документами, созданными с помощью текстовых процессоров. Для PDF-документов, созданных с использованием изображений, существуют и другие специализированные библиотеки, о которых я расскажу в следующей статье. Пока мы будем работать только с PDF-документами, созданными с помощью текстовых процессоров.

В качестве фиктивного документа для игры вы можете скачать PDF-файл по этой ссылке:

В качестве фиктивного документа для игры вы можете скачать PDF-файл по этой ссылке:

Загрузите документ локально в корень диска “D”.

Чтение PDF-документа

Чтобы прочитать PDF-документ, мы сначала должны открыть его, как любой обычный файл. Посмотрите на следующий сценарий:

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

Важно отметить, что при открытии PDF-файла режим должен быть установлен в rb , что означает “читать двоичный файл”, поскольку большинство PDF-файлов находятся в двоичном формате.

Как только файл будет открыт, нам нужно будет вызвать функцию Pdf File Reader() библиотеки PyPDF2, как показано ниже.

pdf_document = PyPDF2.PdfFileReader(mypdf)

Теперь, используя переменную pdf_document , мы можем выполнять различные функции чтения. Например, чтобы получить общее количество страниц в PDF-документе, мы можем использовать атрибут NumPages :

pdf_document.numPages

Поскольку у нас есть только одна страница 1, в нашем PDF-документе вы увидите 1 в выводе.

Наконец, чтобы извлечь текст из PDF-документа, сначала нужно получить страницу PDF-документа с помощью функции getPage () .

Затем вы можете вызвать функцию extractText () , чтобы извлечь текст с этой конкретной страницы.

Следующий сценарий извлекает текст с первой страницы PDF-файла и затем печатает его на консоли.

first_page = pdf_document.getPage(0)

print(first_page.extractText())

В выходных данных вы должны увидеть текст с первой страницы PDF-файла.

Запись в PDF-документ

Непосредственно записать строки Python в PDF – документ с помощью библиотеки PyPDF2 невозможно из-за шрифтов и других ограничений. Однако для демонстрации мы прочитаем содержимое нашего PDF-документа, а затем запишем его в другой PDF-файл, который мы создадим.

Давайте сначала ознакомимся с содержанием первой страницы нашего PDF-документа.

import PyPDF2

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

page_one = pdf_document.getPage(0)

Приведенный выше скрипт читает первую страницу нашего PDF-документа. Теперь мы можем записать содержимое с первой страницы в новый PDF-документ, используя следующий скрипт:

pdf_document_writer = PyPDF2.PdfFileWriter()

Приведенный выше сценарий создает объект, который можно использовать для записи содержимого в PDF-файл. Сначала мы добавим страницу к этому объекту и передадим ему страницу, которую мы извлекли из другого PDF-файла.

pdf_document_writer.addPage(page_one)

Далее нам нужно открыть новый файл с разрешениями wb (write binary). Открытие файла с такими разрешениями создает новый файл, если он не существует.

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

Наконец, нам нужно вызвать метод write() для объекта PDF writer и передать ему вновь созданный файл.

pdf_document_writer.write(pdf_output_file)

Закройте оба файла my pdf и pdf_output_file и перейдите в рабочий каталог программы. Вы должны увидеть новый файл new_pdf_file.pdf в вашем редакторе. Откройте файл, и вы увидите, что он содержит содержимое с первой страницы нашего оригинального PDF-файла.

Давайте попробуем прочитать содержание нашего недавно созданного PDF документа:

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())

Теперь давайте поработаем с большим PDF-файлом. Скачать PDF файл можно по этой ссылке:

Теперь давайте поработаем с большим PDF-файлом. Скачать PDF файл можно по этой ссылке:

Сохраните его в своем локальном каталоге. Имя загруженного файла будет “lipsum.pdf”.

Выполните следующий сценарий, чтобы увидеть количество страниц в файле:

import PyPDF2

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

В выходных данных вы увидите 87 распечатанных страниц, так как в PDF-файле есть 87 страниц. Давайте распечатаем все страницы документа на консоли:

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())

В выводе вы увидите все страницы PDF-документа, напечатанные на экране.

Вывод

Чтение и написание текстовых документов является фундаментальным шагом для разработки приложений обработки естественного языка. В этой статье мы объяснили, как мы можем работать с текстовыми и PDF-файлами с помощью Python. Мы видели, как читать и писать текстовые и PDF-файлы.

В следующей статье мы начнем обсуждение некоторых других задач НЛП , таких как стемминг, лемматизация, токенизация с помощью библиотеки spaCy.