اجرای SQL روی فایل های PDF — به زبان ساده
امروزه، فایلهای PDF، یک استاندارد غیر رسمی پذیرفته شده توسط عموم برای توزیع و به اشتراکگذاری اسناد دارای قالب ثابت محسوب میشوند. یک بررسی سریع روی فایلهای ذخیره شده در کامپیوترها، حاکی از آن است که مقالات تخصصی، کتابهای الکترونیکی، اسلایدهای ارائهها، قراردادها و اسناد کاری، همه و همه از نوع PDF هستند. میزان زیادی از اطلاعات مفید به صورت فایلهای PDF ارائه میشوند. این امر، دلیل خوبی برای پشتیبانی از کوئری زدن روی فایلهای PDF و در واقع، اجرای SQL روی فایل های PDF به منظور استفاده از دادههای آنها و انجام تحلیل دادههای کارآمدتر است.
اجرای SQL روی فایل های PDF
Rockset، یک موتور تحلیل و جستجو برای انجام تحلیلهای داده تعاملی و زنده است. Rockset، امکان اجرای کوئریهای SQL را روی دادههای نیمه ساختار یافته در انواع فرمتهای داده مانند CSV ،JSON و XLSX بدون نیاز به انجام هرگونه پیش پردازش دادهها از قبل، پشتیبانی میکند.
اکنون، نوع فایل PDF را نیز میتوان به این لیست اضافه کرد. کاربران میتوانند دادههای PDF را با دیگر انواع داده از منابع مختلف ترکیب و در تحلیلهای خود از آنها استفاده کنند. انجام پردازش چند فایل PDF به طور همزمان نیز میتواند ارزشمند باشد. برای مثال، در صورتی که مجموعهای از قبضها (مثلا قبضهای برق یک فرد طی چند ماه یا سال)، همچون مثالی که در ادامه میآید وجود داشته باشد، میتوان روی فایلهای PDF به صورت کلی پردازش انجام داد.
بارگذاری فایلهای PDF
ابتدا باید از یک Collection (در Rockset، یک collection مجموعهای از اسناد است) روی دکمه Upload File در قسمت بالا سمت راست کنسول کلیک کرد و فرمت PDF را برای درج فایلها در Rockset انتخاب کرد.
کوئری زدن روی دادهها در فایل 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) ترسیم میشوند. همانطور که از نمودار زیر مشهود است، قبض ماه اکتبر به طور شگفتانگیزی تقریبا برابر با صفر است. سوالی که در این وهله مطرح میشود این است که آیا یک ناهنجاری و یا دورافتادگی در دادهها به وقوع پیوسته است؟ پس از بررسی مجدد دادههای مربوط به ماه اکتبر، معلوم میشود که کاربر در این بازه در سفر بوده و در نتیجه، مبلغ قبض برق آنها تقریبا صفر بوده است. بنابراین، روش معرفی شده در اینجا به درستی کار میکند.
اگر نوشته بالا برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای دادهکاوی و یادگیری ماشین
- مجموعه آموزشهای داده کاوی یا Data Mining در متلب
- مجموعه آموزشهای پایگاه دادهها
- دسته بندی موجودیتهای نامدار (Named Entity) — راهنمای کاربردی
^^