اجرای SQL روی فایل های PDF — به زبان ساده

۲۲۴ بازدید
آخرین به‌روزرسانی: ۱۰ مهر ۱۴۰۲
زمان مطالعه: ۳ دقیقه
اجرای SQL روی فایل های PDF — به زبان ساده

امروزه، فایل‌های PDF، یک استاندارد غیر رسمی پذیرفته شده توسط عموم برای توزیع و به اشتراک‌گذاری اسناد دارای قالب ثابت محسوب می‌شوند. یک بررسی سریع روی فایل‌های ذخیره شده در کامپیوترها، حاکی از آن است که مقالات تخصصی، کتاب‌های الکترونیکی، اسلایدهای ارائه‌ها، قراردادها و اسناد کاری، همه و همه از نوع PDF هستند. میزان زیادی از اطلاعات مفید به صورت فایل‌های PDF ارائه می‌شوند. این امر، دلیل خوبی برای پشتیبانی از کوئری زدن روی فایل‌های PDF و در واقع، اجرای SQL روی فایل های PDF به منظور استفاده از داده‌های آن‌ها و انجام تحلیل داده‌های کارآمدتر است.

اجرای SQL روی فایل های PDF

اجرای SQL روی فایل های PDF

Rockset، یک موتور تحلیل و جستجو برای انجام تحلیل‌های داده تعاملی و زنده است. Rockset، امکان اجرای کوئری‌های SQL را روی داده‌های نیمه ساختار یافته در انواع فرمت‌های داده مانند CSV ،JSON و XLSX بدون نیاز به انجام هرگونه پیش پردازش داده‌ها از قبل، پشتیبانی می‌کند.

اکنون، نوع فایل PDF را نیز می‌توان به این لیست اضافه کرد. کاربران می‌توانند داده‌های PDF را با دیگر انواع داده از منابع مختلف ترکیب و در تحلیل‌های خود از آن‌ها استفاده کنند. انجام پردازش چند فایل PDF به طور هم‌زمان نیز می‌تواند ارزشمند باشد. برای مثال، در صورتی که مجموعه‌ای از قبض‌ها (مثلا قبض‌های برق یک فرد طی چند ماه یا سال)، همچون مثالی که در ادامه می‌آید وجود داشته باشد، می‌توان روی فایل‌های PDF به صورت کلی پردازش انجام داد.

اجرای SQL روی فایل های PDF

بارگذاری فایل‌های PDF

ابتدا باید از یک Collection (در Rockset، یک collection مجموعه‌ای از اسناد است)  روی دکمه Upload File در قسمت بالا سمت راست کنسول کلیک کرد و فرمت PDF را برای درج فایل‌ها در Rockset انتخاب کرد.

اجرای SQL روی فایل های PDF

کوئری زدن روی داده‌ها در فایل PDF

در اینجا، قبض‌های برق ۹ ماه از سال یک فرد، بارگذاری شده‌اند.

می‌توان از دستور DESCRIBE برای نمایش فیلدهایی که از PDF استخراج شده‌اند استفاده کرد.

> describe "elec-bills";
+--------------------------------------------+---------------+---------+-----------+
| field | occurrences | total | type |
|--------------------------------------------+---------------+---------+-----------|
| ['Author'] | 9 | 9 | string |
| ['CreationDate'] | 9 | 9 | string |
| ['Creator'] | 9 | 9 | string |
| ['ModDate'] | 9 | 9 | string |
| ['Producer'] | 9 | 9 | string |
| ['Subject'] | 9 | 9 | string |
| ['Title'] | 9 | 9 | string |
| ['_event_time'] | 9 | 9 | timestamp |
| ['_id'] | 9 | 9 | string |
| ['_meta'] | 9 | 9 | object |
| ['_meta', 'file_upload'] | 9 | 9 | object |
| ['_meta', 'file_upload', 'file'] | 9 | 9 | string |
| ['_meta', 'file_upload', 'file_upload_id'] | 9 | 9 | string |
| ['_meta', 'file_upload', 'upload_time'] | 9 | 9 | string |
| ['author'] | 9 | 9 | string |
| ['creation_date'] | 9 | 9 | int |
| ['creator'] | 9 | 9 | string |
| ['modification_date'] | 9 | 9 | int |
| ['producer'] | 9 | 9 | string |
| ['subject'] | 9 | 9 | string |
| ['text'] | 9 | 9 | string |
| ['title'] | 9 | 9 | string |
+--------------------------------------------+---------------+---------+-----------+

Rockset همه «فراداده‌ها» (Meta Data) مانند creation_date ،author و دیگر موارد را همراه با text از اسناد خارج می‌کند. فیلد text، معمولا قسمتی است که بیشتر اطلاعات PDF در آن قرار دارند. بنابراین، در ادامه بررسی می‌شود که چه چیزی در یک فیلد text نمونه وجود دارد.

+--------------------------------------------------------------+
| text |
|--------------------------------------------------------------|
| .... |
| .... |
| Statement Date: 10/11/2018 |
| Your Account Summary |
| .... |
| Total Amount Due: |
| $157.57 |
| Amount Enclosed: |
| ... |
+--------------------------------------------------------------+

ترکیب داده‌ها از چندین PDF

با توجه به اینکه قبض‌های برق ۹ ماه در Rockset یکپارچه و اندیس‌گذاری شده‌اند، اکنون می‌توان تحلیل‌هایی پیرامون استفاده از برق طی این چند ماه را ارائه کرد.

می‌توان یک کوئری SQL را برای انتخاب ماه/سال و قبض‌ها در میان text اجرا کرد.

> with details as (
    select tokenize(REGEXP_EXTRACT(text, 'Statement Date: .*'))[3] as month,
    tokenize(REGEXP_EXTRACT(text, 'Statement Date: .*'))[5] as year,
    cast(tokenize(REGEXP_EXTRACT(text, 'Total Amount Due:\n.*\nAmount Enclosed'))[4] as float) as amount
    from "elec-bills"
) 
select concat(month, '/', year) as billing_period, amount
from details
order by year asc, month;

+----------+------------------+
| amount   | billing_period   |
|----------+------------------|
| 47.55    | 04/2018          |
| 76.5     | 05/2018          |
| 52.28    | 06/2018          |
| 50.58    | 07/2018          |
| 47.62    | 08/2018          |
| 39.7     | 09/2018          |
|    | 10/2018          |
| 72.93    | 11/2018          |
| 157.57   | 12/2018          |
+----------+------------------+

و در نهایت، نتایج با استفاده از «آپاچی سوپرست» (Apache Superset) ترسیم می‌شوند. همانطور که از نمودار زیر مشهود است، قبض ماه اکتبر به طور شگفت‌انگیزی تقریبا برابر با صفر است. سوالی که در این وهله مطرح می‌شود این است که آیا یک ناهنجاری و یا دورافتادگی در داده‌ها به وقوع پیوسته است؟ پس از بررسی مجدد داده‌های مربوط به ماه اکتبر، معلوم می‌شود که کاربر در این بازه در سفر بوده و در نتیجه، مبلغ قبض برق آن‌ها تقریبا صفر بوده است. بنابراین، روش معرفی شده در اینجا به درستی کار می‌کند.

اجرای SQL روی فایل های PDF

اگر نوشته بالا برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

^^

بر اساس رای ۱ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
Towards Data Science
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *