وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

پایتون برای NLP: کار با متن و فایل های PDF

0 5
زمان لازم برای مطالعه: 8 دقیقه


این اولین مقاله از سری مقالات من است روی پایتون برای پردازش زبان طبیعی (NLP). در این مقاله با اصول اولیه پایتون برای NLP شروع می کنیم. خواهیم دید که چگونه می توانیم با فایل های متنی ساده و فایل های PDF با استفاده از پایتون کار کنیم.

کار با فایل های متنی

فایل‌های متنی احتمالاً ابتدایی‌ترین نوع فایل‌هایی هستند که در تلاش‌های NLP خود با آن‌ها مواجه خواهید شد. در این قسمت روش خواندن از یک فایل متنی در پایتون، ایجاد یک فایل متنی و نوشتن داده در فایل متنی را خواهیم دید.

خواندن یک فایل متنی

یک فایل متنی با متن زیر ایجاد کنید و آن را در فهرست محلی خود با a ذخیره کنید .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 در من root دایرکتوری “D:”.

خواندن تمام محتویات فایل

حال بیایید ببینیم چگونه می توانیم کل محتویات فایل را بخوانیم. اولین قدم این است که مسیر فایل را مانند شکل زیر مشخص کنید:

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

برای باز کردن فایل، می توانید از برنامه داخلی پایتون استفاده کنید open تابع. اگر کد بالا را اجرا کردید و خطایی مشاهده نکردید، به این معنی است که فایل شما با موفقیت باز شده است. مطمئن شوید که مسیر فایل را به مکانی که فایل متنی خود را در آن ذخیره کرده اید تغییر دهید.

حال بیایید ببینیم چه چیزی در آن ذخیره شده است myfile متغیر:

print(myfile)

خروجی به شکل زیر است:

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

خروجی می خواند که myfile متغیر یک بسته بندی به myfile.txt فایل و فایل را در حالت فقط خواندنی باز می کند.

اگر مسیر فایل را اشتباه مشخص کنید، احتمالاً با خطای زیر مواجه خواهید شد:

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 روش دوباره، خواهید دید که چیزی چاپ نمی شود روی را console:

print(myfile.read())

این به این دلیل است که یک بار با آن تماس بگیرید read در روش، مکان نما به انتهای متن منتقل می شود. بنابراین، وقتی دوباره خواندن را فرا می‌خوانید، هیچ چیزی نمایش داده نمی‌شود زیرا متن دیگری برای آن وجود ندارد print.

راه حل این مشکل این است که پس از تماس با read() روش، تماس بگیرید seek() متد و 0 را به عنوان آرگومان ارسال کنید. با این کار مکان نما به ابتدای فایل متنی باز می گردد. به اسکریپت زیر نگاه کنید تا ببینید چگونه کار می کند:

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

در خروجی مشاهده می کنید که محتوای فایل متنی دو بار چاپ شده است.

پس از اتمام کار با یک فایل، مهم است که فایل را ببندید تا سایر برنامه ها بتوانند به فایل دسترسی داشته باشند. برای انجام این کار، باید با شماره تماس بگیرید close() روش.

myfile.close()

خواندن یک فایل خط به خط

به جای خواندن تمام محتویات فایل یکجا، می توانیم محتویات فایل را خط به خط نیز بخوانیم. برای انجام این کار، باید آن را اجرا کنیم readlines() روش، که هر خط در فایل متنی را به عنوان یک آیتم فهرست برمی گرداند.

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.')

در بسیاری از موارد این کار با متن را آسان تر می کند. به عنوان مثال، اکنون می توانیم به راحتی از طریق هر خط و print اولین کلمه در سطر

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+ حالتی که به اضافه کردن بعلاوه خواندن اشاره دارد.

دوباره یک فایل با محتوای زیر ایجاد کنید و آن را به عنوان ذخیره کنید 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 داریم. به طور پیش فرض، پایتون با هیچ کتابخانه داخلی که بتوان از آن برای خواندن یا نوشتن فایل های PDF استفاده کرد، ارائه نمی شود. بلکه می توانیم از PyPDF2 کتابخانه

قبل از اینکه بتوانیم از کتابخانه PyPDF2 استفاده کنیم، باید آن را نصب کنیم. اگر استفاده می کنید pip نصب کننده، می توانید از دستور زیر برای نصب کتابخانه PyPDF2 استفاده کنید:

$ pip install PyPDF2

از طرف دیگر، اگر از پایتون از محیط Anaconda استفاده می کنید، می توانید دستور زیر را در خط فرمان conda اجرا کنید:

$ conda install -c conda-forge pypdf2

توجه داشته باشید: در اینجا ذکر این نکته ضروری است که یک سند PDF را می توان از منابع مختلفی مانند اسناد پردازش کلمه، تصاویر و … ایجاد کرد. در این مقاله فقط به اسناد PDF ایجاد شده با استفاده از واژه پرداز می پردازیم. برای اسناد PDF ایجاد شده با استفاده از تصاویر، کتابخانه های تخصصی دیگری وجود دارد که در مقاله بعدی توضیح خواهم داد. در حال حاضر، ما فقط با اسناد PDF تولید شده با استفاده از پردازشگرهای کلمه کار خواهیم کرد.

به عنوان یک سند ساختگی برای بازی کردن، می توانید PDF را از این لینک دانلود کنید:

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

دانلود سند به صورت محلی در root از درایو “D”.

خواندن یک سند PDF

برای خواندن یک سند PDF ابتدا باید آن را مانند هر فایل معمولی باز کنیم. به اسکریپت زیر نگاه کنید:

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

ذکر این نکته ضروری است که هنگام باز کردن یک فایل PDF، حالت باید روی آن تنظیم شود rb، که مخفف “خواندن باینری” است زیرا اکثر فایل های PDF در فرمت باینری هستند.

پس از باز شدن فایل، باید با آن تماس بگیریم PdfFileReader() عملکرد کتابخانه PyPDF2، همانطور که در زیر نشان داده شده است.

pdf_document = PyPDF2.PdfFileReader(mypdf)

در حال حاضر با استفاده از pdf_document متغیر، ما می توانیم انواع توابع خواندن را انجام دهیم. به عنوان مثال، برای به دست آوردن تعداد کل صفحات در سند PDF، می توانیم از آن استفاده کنیم numPages صفت:

pdf_document.numPages

از آنجایی که ما فقط یک 1 داریم page، در سند PDF ما، 1 را در خروجی خواهید دید.

در نهایت، برای استخراج متن از سند PDF، ابتدا باید آن را دریافت کنید page سند PDF با استفاده از getPage() تابع.

بعد، شما می توانید تماس بگیرید extractText() تابع استخراج متن از آن خاص است page.

اسکریپت زیر متن را از متن اول استخراج می کند page PDF و سپس آن را چاپ می کند روی را console.

first_page = pdf_document.getPage(0)

print(first_page.extractText())

در خروجی باید متن را از اول ببینید page از PDF.

نوشتن در یک سند PDF

با استفاده از کتابخانه PyPDF2 به دلیل فونت ها و سایر محدودیت ها امکان نوشتن مستقیم رشته های Python در اسناد PDF وجود ندارد. با این حال، برای نشان دادن، ما مطالب را از سند PDF خود می خوانیم و سپس آن محتوا را در فایل PDF دیگری که ایجاد خواهیم کرد، می نویسیم.

ابتدا مطالب اولی را بخوانیم page سند 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)

اسکریپت بالا اولین مورد را می خواند page سند PDF ما حالا می توانیم مطالب را از اول بنویسیم page به یک سند PDF جدید با استفاده از اسکریپت زیر:

pdf_document_writer = PyPDF2.PdfFileWriter()

اسکریپت بالا یک شی ایجاد می کند که می توان از آن برای نوشتن محتوا در یک فایل PDF استفاده کرد. ابتدا الف را اضافه می کنیم page به این شی و ارسال آن page که از پی دی اف دیگر بازیابی کردیم.

pdf_document_writer.addPage(page_one)

در مرحله بعد، باید یک فایل جدید با استفاده از آن باز کنیم wb مجوزهای (دودویی بنویسید). باز کردن یک فایل با چنین مجوزهایی، در صورتی که وجود نداشته باشد، یک فایل جدید ایجاد می کند.

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

در نهایت، ما باید با آن تماس بگیریم write() روش روی PDF writer را شیء کرده و فایل جدید ایجاد شده را ارسال کنید.

pdf_document_writer.write(pdf_output_file)

هر دو را ببندید mypdf و pdf_output_file فایل ها و به دایرکتوری کاری برنامه بروید. شما باید یک فایل جدید ببینید new_pdf_file.pdf در ویرایشگر شما فایل را باز کنید و ببینید که حاوی محتویات اول است page از 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 بزرگتر کار کنیم. فایل پی دی اف را از این لینک دانلود کنید:

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

آن را در فهرست محلی خود ذخیره کنید. نام فایل دانلود شده خواهد بود lipsum.pdf.

برای مشاهده تعداد صفحات فایل اسکریپت زیر را اجرا کنید:

import PyPDF2

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

در خروجی، 87 صفحه چاپ شده را خواهید دید زیرا 87 صفحه در PDF وجود دارد. اجازه دهید print تمام صفحات سند روی را console:

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 کار کنیم. روش خواندن و نوشتن فایل های متنی و PDF را دیدیم.

در مقاله بعدی، ما بحث خود را در مورد چند کار دیگر NLP مانند stemming، lemmatization، tokenization با کتابخانه spaCy آغاز خواهیم کرد.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-24 07:23:03

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید