الاعراب والتدقيق





لنبدأ بفكرة. لنفترض أنك ، بصفتك مدققًا حقيقيًا ، تريد إجراء فحص لتقارير مربي الكلاب ، باستخدام ، من بين أشياء أخرى ، موارد طرف ثالث. للقيام بذلك ، تحاول الحصول على معلومات منظمة حول كلاب المربي ، مع العلم ، على سبيل المثال ، فقط باسم سلالاتهم ، وإنشاء جدول منه في Pandas ، مناسب لمزيد من المعالجة من أي طبيعة (جميع أنواع البحوث الإحصائية ، التجميع ، وما إلى ذلك). ولكن يتم تخزين بياناتك في عمق بعض مواقع الويب المجردة ، حيث يمكنك إخراجها فقط في شكل أرشيف ، حيث يتم تكديس المستندات بتنسيقات متعددة ، يوجد بداخلها نصوص وصور وجداول. وإذا كان هناك الكثير من سلالات الجراء ، ولكل منها عشرات ملفات pdf بجداول ، فأين لا تحتاج إلى جميع المعلومات من ، وأيضًا ، على سبيل المثال ، هل تحتاج إلى أسماء هذه الجداول أو الهوامش؟ دعنا نضيف عدة وظائف لمشروعنا ،حل المهام التالية: تفريغ وتفريغ الأرشيف بالبيانات ، البحث عن ملفات pdf ومعالجتها من الأرشيف ، تحليل البيانات المستلمة.



أولاً ، دعنا نستورد كل ما نحتاجه. دعنا نقسم المكتبات التي نحتاجها إلى مكتبات نظام:



import os
import re
import glob
import csv
import shutil


والخارجية التي تتطلب التثبيت (تثبيت نقطة ، كما قلت):



import requests as req
import pandas as pd
from zipfile import ZipFile
import tabula
import PyPDF2
from pdf2image import convert_from_path
from pytesseract import image_to_string
from PIL import Image, ImageDraw


الآن ، لكل من كلابك ، سنقوم بتنزيل أرشيف كبير بالبيانات ، مشيرًا إلى الموقع باسم سلالته:



def get_doquments_archive(breed):
            url = 'https://yourwebsite' + breed + '/document/download'
              with req.get(url, stream=True) as r:
                r.raise_for_status()
                with open('/Users/user/Desktop/' + breed + '.zip', 'wb') as f:
                         for chunk in r.iter_content(chunk_size=8192):
                                   f.write(chunk)


لدينا الآن أرشيف على سطح المكتب لدينا. دعنا نفك ضغطها ، لهذا نحتاج فقط إلى معرفة مسار الملف بالأرشيف:



def unzipper(zippath, cond = False):
 dirpath = zippath[:-4] + '_package'
 if os.path.exists(dirpath) and os.path.isdir(dirpath):
shutil.rmtree(dirpath)
os.mkdir(dirpath)
with ZipFile(zippath, 'r') as zipObj:
zipObj.extractall(path = dirpath)


في هذه الخطوة ، سنحصل على مجلد يحتوي على مستندات ، حيث يمكن أن تكون pdf و csv و xls و png وأشياء أخرى لطيفة. لنفترض أننا نريد معالجة عدة ملفات pdf تحتوي على جداول بها بيانات. لكن كيف تخرجهم من هناك؟ أولاً ، دعنا نحدد المستندات بالتنسيق المطلوب من المجلد:



all_pdfs = glob.glob(dirpath + '/*_pd*.pdf')


ممتاز. لدينا الآن مجموعة من الملفات بنصوص وجداول بداخلها. عند محاولة استخراج المعلومات من هناك ، قد يتضح أن الأدوات تتعرف على مثل هذا الخليط بطريقة ملتوية للغاية ، خاصة إذا كانت الجداول ملتصقة ببعضها البعض ، وكانت عناوينها أو الحواشي السفلية نصًا منفصلًا. تابولا يأتي لإنقاذ! لكن أولاً ، دعنا نخرج من الصفحة الأولى من كل مستند وصفًا نصيًا صغيرًا غير مدرج في الجدول (مثل هذا النص لجدول يمكن أن يكون مشكلة). نظرًا لأن الصفحة الأولى يمكن أن تحتوي أيضًا على جدول ، فلنستخدم التركيز:



def get_text_description(path):
pdfFileObj = open(path,'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
pages = convert_from_path(declar, 0)
page = pages[0]
pname = '/Users/user/Desktop/text_description.png'
page.save(pname, 'JPEG')
text = image_to_string(Image.open('/Users/user/Desktop/text_description.png'),
                                          lang = 'rus')
text_file = open('res', "w")
text_file.write(text)
text_file.close()


الآن لنبدأ العمل مع الجدول. إذا كنت محظوظًا ، وكان الجدول الموجود في ملف pdf الخاص بنا قابلاً للقراءة تمامًا ، فستقوم tabula بتحميله بشكل صحيح بتنسيق csv ، حتى لا تضطر إلى تحليل المعلومات:



tabula.convert_into(file, 'output_file.csv', output_format = "csv", pages = 'all')


شاهد كيف يمكن أن يكون من السهل الآن الحصول ، على سبيل المثال ، على بيانات حول شخصية الجرو المختار:



data = pd.read_csv('/Users/user/Desktop/output_file.csv')
temperament = data[data[''] == '']['']


ولكن ماذا لو قام مؤلف النص بلصق الجداول معًا ، أو أضاف عددًا مختلفًا من الأعمدة إلى الصفوف ، أو مزجها بالنص؟ ثم سنقوم بتحويل الملف المستلم من tabula إلى تنسيق جديد:



def get_table_data(path):
 data = []
 with open(path) as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
for val in row.values():
data.append(val)
data = str(data)
data = re.sub('\]|\[|,|\'', '', data)
data = data.replace("\\n", "")
return data


على ماذا؟ سيسمح لك هذا بالبحث عن المعلومات التي تحتاجها بسرعة وبدون ألم باستخدام التعبيرات العادية. نريد أن نجد مجموعة من ألوان التكاثر الممكنة:



def get_colors(data):
 res = re.search('^: (.*)', data).group(1)
 return res


الآن قمنا بتجميع قدر معين من المعلومات من الملفات واحدًا تلو الآخر (على سبيل المثال ، الشخصية ، الألوان ، الوزن). دعنا نضيفه إلى pandas dataframe كسطر جديد:



def append_new_row(dataframe, breed, temperament, colors, weight):
  return dataframe.append({'': breed,
'': temperament,
'': colors,
'' : weight
}, ignore_index=True)


ما لدينا الآن:







إذن ، قمنا بتفريغ أرشيف ببيانات من الموقع ، وفكنا محتوياته ، وأخذنا المستندات التي نحتاجها ، واستخرجنا معلومات مهمة منها ، ونسحبها إلى تنسيق مناسب. الآن يمكن مقارنة هذه البيانات مع تلك التي تقدمها الشركة ، وتحويلها وتحليلها ، وأكثر من ذلك بكثير! أكثر ملاءمة من التنزيل والكتابة يدويًا.



def clean_all(path):
os.remove(path + '.zip')
shutil.rmtree(path + '_package')


من المهم أن تظل أفعالك قانونية تمامًا. يمكنك أخذ البيانات من المواقع ، ولا يمكنك سرقة المحتوى. يمكنك التنزيل تلقائيًا ، لا يمكنك وضع الخادم. دراسة حقوق التأليف والنشر والقانون الجنائي للاتحاد الروسي ، لا تسبب ضررًا.



All Articles