ویکیپدیا بزرگترین دانشنامهی مردمی دنیا است که همگی با آن آشنا هستیم. در این مقاله، به آموزش ابزار Mixnode و نحوهی استخراج و تحلیل مقالات ویکیپدیا میپردازیم.
غنای اطلاعات ویکیپدیا بر هیچکس پوشیده نیست. از دریای اطلاعات این وبسایت میتوان برای تحقیقهای تجاری و غیرتجاری و تقریبا در هر زمینهای بهره برد. شرکتها، محققان، دانشمندان داده و حتی افراد صرفا کنجکاو، همهوهمه درزمرهی افرادی قرار میگیرند که سعی میکنند دادههای ویکیپدیا را استخراج و تحلیل کنند.
ویکیپدیا بهمثابهی گنجینهای است که از مجموعهای از صدهامیلیون صفحهی وب و میلیونها مقالهی وزین چندزبانه تشکیل شده است. این امر ویکیپدیا را به بهشت خزندگان وب (Web Crawler) تبدیل کرده است. با جستوجویی ساده در گیتهاب، متوجه میشوید بیش از سیصد خزندهی وب و پروژههای مشابه برای استخراج داده از ویکیپدیا وجود دارد.
وبکراولینگ، تنها راه موجود برای استخراج و تحلیل دادههای ویکیپدیا نیست. برای مثال، ویکیمدیا اجازهی استخراج دادهها در فرمتهای متنوعی را میدهد. همچنین، API ویکیمدیا نهتنها برای دریافت اطلاعات، بلکه برای ایجاد باتها و تعامل با مقالات بهطور برنامهنویسیشده استفاده میشود.
در آموزش زیر، روی ابزار Mixnode تمرکز میکنیم که استخراج و تحلیل دادهها از ویکیپدیا با استفاده از کوئریهای SQL را فراهم میآورد. برای استفاده از این ابزار باید با SQL آشنا باشید.
Mixnode چگونه کار میکند؟
Mixnode اجازه میدهد با وب مانند پایگاه داده برخورد کنید. با استفاده از Mixnode میتوانید کوئری بنویسید و آن را روی وب اجرا کنید. با اجرای کوئری مدنظر Mixnode بهطور خودکار صفحات لازم برای پاسخ به کوئری را پیدا میکند.
مثالهای زیر نحوهی کارکرد Mixnode و استخراج و تحلیل دادهها را شفافتر میکند.
مثال ۱: بهدستآوردن آدرس تمامی صفحات ویکیپدیا
select
url
from
pages
where
url_domain = 'wikipedia.org'
متغیر url نمایانگر آدرس صفحه است
pages جدولی است که هر ردیف آن مطابق با صفحهی منحصربهفرد در وب است
با url_domain = 'wikipedia.org' مطمئن میشویم که فقط صفحات ویکیپدیا و سابدامینهای آن (مانند en.wikipedia.org) مدنظر قرار میگیرند. اگر بخواهید فقط در ویکیپدیای فارسی جستوجو کنید، کافی است عبارت fa.wikipedia.org را جایگزین کنید.
مثال ۲: بهدستآوردن آدرس و عنوان تمامی مقالات ویکیپدیا
select
url,
css_text_first(content, 'h1#firstHeading') as title
from
pages
where
url_domain = 'wikipedia.org'
and
url like '%/wiki/%'
css_text_first(content, 'h1#firstHeading') عنوان مقالهی ویکیپدیا را خروجی میدهد. با نگاهی به سورس HTML مقالات ویکیپدیا، پی میبریم h1#firstHeading مسیر CSS برای عنوان مقاله است. css_text_first نیز تابعی است که اجازهی استخراج اولین مورد از انتخابگر CSS را میدهد. content در اینجا سورس کامل HTML صفحه است.
ازآنجاییکه قصد داریم عناوین مقالات را بهدست آوریم و میدانیم در آدرس مقالات ویکیپدیا از /wiki/ استفاده میشود، از url like '%/wiki/%' استفاده میکنیم تا مطمئن شویم نتایجمان فقط به مقالات مربوط میشود.
مثال ۳: بهدستآوردن عناوین تمامی مقالات شامل زیررشتهی Elon Musk
select
url,
css_text_first(content, 'h1#firstHeading') as title
from
pages
where
url_domain = 'wikipedia.org'
and
url like '%/wiki/%'
and
contains(content, 'Elon Musk')
contains() تابعی است که اجازهی بررسی وجود یک زیررشته در یک رشته را میدهد. با استفاده از contains(content, 'elon musk') مطمئن میشویم که در نتایجمان عبارت Elon Musk موجود است.
مثال ۴: مرتبسازی مقالات ویکیپدیا براساس تعداد ارجاعات
select
url,
css_text_first(content, 'h1#firstHeading') as title,
cardinality(css_text(content, 'ol.references li')) as reference_count
from
pages
where
url_domain = 'wikipedia.org'
and
url like '%/wiki/%'
order by reference_count desc
بررسی کد منبع یک مقالهی ویکیپدیا نشان میدهد تمامی ارجاعات و منابع با انتخابگر ol.references قابلدسترسی است. css_text(content, 'ol.references li') متن تمامی منابع مقاله را به ما میدهد و ازآنجاییکه فقط به تعداد نیاز داریم، پس از تابع cardinality() استفاده میکنیم که اندازهی یک آرایه را برمیگرداند. desc در خط آخر مقالات را بهصورت نزولی برایمان مرتب میکند. برای مرتبسازی بهصورت صعودی از asc استفاده کنید.
مثال ۵: مرتبسازی مقالات ویکیپدیا براساس طول مقاله
select
url,
css_text_first(content, 'h1#firstHeading') as title,
cardinality(words(css_text_first(content, '#content'))) as article_length
from
pages
where
url_domain = 'wikipedia.org'
and
url like '%/wiki/%'
order by article_length desc
words() آرایهای شامل تمامی کلمات یک متن را برمیگرداند. استفاده از cardinality(words(css_text_first(content, '#content'))) as article_length، تعداد کلمات یک مقاله را به ما میدهد.
مثال ۶: اندازهی میانگین یک مقالهی ویکیپدیا
select
avg(cardinality(words(css_text_first(content, '#content')))) as average_article_length
from
pages
where
url_domain = 'wikipedia.org'
and
url like '%/wiki/%'
تابع avg() میانگین دادههای ورودیاش را برمیگرداند که در اینجا، تعداد کلمات تمامی مقالات ویکیپدیاست.
مثال ۷: مرتبسازی مقالات ویکیپدیا براساس بحثهای آن
select
url,
remove_left(css_text_first(content, 'h1#firstHeading'), 'Talk:') as title,
cardinality(words(css_text_first(content, '#content'))) as discussion_length
from
pages
where
url_domain = 'wikipedia.org'
and
url like '%/wiki/Talk:%'
order by discussion_length desc
مباحث دربارهی یک مطلب در آدرسی مشابه /wiki/Talk: قرار دارند؛ بههمیندلیل از این عبارت استفاده میکنیم.
مثال ۸: پیداکردن تمامی مقالات ویکیپدیا که لینکی به zoomit.ir دارند
select
url,
css_text_first(content, 'h1#firstHeading') as title
from
pages
where
url_domain = 'wikipedia.org'
and
url like '%/wiki/%'
and
contains_any(content, array['href="https://www.zoomit.ir', 'href="http://www.zoomit.ir', 'href="https://zoomit.ir', 'href="http://zoomit.ir'])