غنای اطلاعات ویکیپدیا بر هیچکس پوشیده نیست. از دریای اطلاعات این وبسایت میتوان برای تحقیقهای تجاری و غیرتجاری و تقریبا در هر زمینهای بهره برد. شرکتها، محققان، دانشمندان داده و حتی افراد صرفا کنجکاو، همهوهمه درزمرهی افرادی قرار میگیرند که سعی میکنند دادههای ویکیپدیا را استخراج و تحلیل کنند.
ویکیپدیا بهمثابهی گنجینهای است که از مجموعهای از صدهامیلیون صفحهی وب و میلیونها مقالهی وزین چندزبانه تشکیل شده است. این امر ویکیپدیا را به بهشت خزندگان وب (Web Crawler) تبدیل کرده است. با جستوجویی ساده در گیتهاب، متوجه میشوید بیش از سیصد خزندهی وب و پروژههای مشابه برای استخراج داده از ویکیپدیا وجود دارد.
وبکراولینگ، تنها راه موجود برای استخراج و تحلیل دادههای ویکیپدیا نیست. برای مثال، ویکیمدیااجازهی استخراج دادهها در فرمتهای متنوعی را میدهد. همچنین، API ویکیمدیا نهتنها برای دریافت اطلاعات، بلکه برای ایجاد باتها و تعامل با مقالات بهطور برنامهنویسیشده استفاده میشود.
در آموزش زیر، روی ابزار Mixnode تمرکز میکنیم که استخراج و تحلیل دادهها از ویکیپدیا با استفاده از کوئریهای SQL را فراهم میآورد. برای استفاده از این ابزار باید با SQL آشنا باشید.
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 صفحه است.
url like '%/wiki/%'
استفاده میکنیم تا مطمئن شویم نتایجمان فقط به مقالات مربوط میشود.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
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'])
دیدگاه شما چیست؟ تجربهی استفاده از این ابزار را داشتهاید؟ ابزارهای دیگری برای تحلیل و استخراج دادهها از ویکیپدیا میشناسید؟ نظرات خود را با ما و کاربران زومیت بهاشتراک بگذارید.