في هذا المنشور ، أود استكمال هذه المقالة وإخبارك كيف يمكنك استخدام Wikipedia WikiExtractor بشكل أكثر مرونة ، وتصفية المقالات حسب الفئة.
بدأ كل شيء بحقيقة أنني كنت بحاجة إلى تعريفات لمصطلحات مختلفة. عادة ما تكون المصطلحات وتعريفاتها هي الجملة الأولى في كل صفحة من صفحات ويكيبيديا. باتباع أبسط مسار ، استخرجت جميع المقالات وأخذت بسرعة كل ما أحتاجه مع النظاميين. المشكلة هي أن التعريفات تجاوزت 500 ميجابايت ، وكان هناك الكثير من الأشياء غير الضرورية ، على سبيل المثال ، الكيانات والمدن والسنوات ، إلخ. الذي لا احتاجه.
لقد افترضت بشكل صحيح أن أداة WikiExtractor ( سأستخدم إصدارًا مختلفًا ، سيكون الرابط أدناه) بها نوع من المرشحات ، واتضح أنها عامل تصفية فئة. الفئات هي علامات للمقالات التي لها هيكل هرمي لتنظيم الصفحات. كان من دواعي سروري أن أضع فئة "بالضبط العلوم" ، معتقدًا بسذاجة كبيرة أنه سيتم تضمين جميع المقالات المتعلقة بالعلوم الدقيقة في القائمة ، لكن المعجزة لم تحدث - كل صفحة بها مجموعة صغيرة خاصة بها من الفئات ولا توجد معلومات في صفحة واحدة حول كيفية ارتباط هذه الفئات. هذا يعني أنه إذا كنت بحاجة إلى صفحات عن العلوم الدقيقة ، يجب أن أشير إلى جميع الفئات التي تنحدر من "العلوم الدقيقة".
حسنًا ، لا يهم ، الآن سأجد خدمة ، كما اعتقدت ، والتي ستشحن بسهولة جميع الفئات من بداية معينة إلي. لسوء الحظ ، وجدت هذا حيث يمكنك فقط معرفة كيفية ارتباط هذه الفئات. كانت محاولة تكرار الفئات يدويًا أيضًا غير ناجحة ، لكنني كنت "سعيدًا" لأن هذه الفئات لها هيكل ليس من شجرة ، كما اعتقدت طوال هذا الوقت ، ولكن مجرد رسم بياني موجه مع دورات. علاوة على ذلك ، فإن التسلسل الهرمي نفسه يطفو كثيرًا - سأقول مقدمًا أنه من خلال تحديد نقطة البداية "الرياضيات" ، يمكنك الوصول بسهولة إلى ألكسندر الأول. ونتيجة لذلك ، كان علي فقط استعادة هذا الرسم البياني محليًا والحصول بطريقة ما على قائمة الفئات التي تهمني.
لذلك ، يتم طرح المهمة على النحو التالي: بدءًا من قمة الرأس ، احصل على قائمة بجميع الفئات المرتبطة بهذا الرأس ، مع القدرة على الحد منها بطريقة ما.
تم إنجاز العمل على جهاز يعمل بنظام التشغيل Ubuntu 16.04 ، لكنني أعتقد أن الإرشادات التالية لن تسبب مشاكل في 18.04.
تنزيل البيانات ونشرها
بادئ ذي بدء ، نحتاج إلى تنزيل جميع البيانات اللازمة من هنا ، وهي
- ruwiki-latest-pages-articles.xml.bz2
- ruwiki-latest-categorylinks.sql.gz
- ruwiki-latest-category.sql.gz
- ruwiki-latest-page.sql.gz
categorylinks , , [[Category:Title]] , . cl_from, id , cl_to, . , id , page () page_id page_title. , . , , , , , . category([](category table)) cat_title. pages-articles.xml .
mysql. ,
sudo apt-get install mysql-server mysql-client
, mysql , .
$ mysql -u username -p
mysql> create database category;
mysql> create database categorylinks;
mysql> create database page;
, . .
$ mysql -u username -p category < ruwiki-latest-category.sql
$ mysql -u username -p categorylinks < ruwiki-latest-categorylinks.sql
$ mysql -u username -p page < ruwiki-latest-page.sql
, csv.
mysql> select page_title, cl_to from categorylinks.categorylinks join page.page
on cl_from = page_id where page_title in (select cat_title from category) INTO outfile '/var/lib/mysql-files/category.csv' FIELDS terminated by ';' enclosed by '"' lines terminated by '\n';
. .
, , — , . , , , , 1,6 1,1. .
import pandas as pd
import networkx as nx
from tqdm.auto import tqdm, trange
#Filtering
df = pd.read_csv("category.csv", sep=";", error_bad_lines=False)
df = df.dropna()
df_filtered = df[df.parant.str.contains("[--]+:") != True]
df_filtered = df_filtered[df_filtered.parant.str.contains(",_") != True]
df_filtered = df_filtered[df_filtered.parant.str.contains("__") != True]
df_filtered = df_filtered[df_filtered.parant.str.contains("_") != True]
df_filtered = df_filtered[df_filtered.parant.str.contains(",_") != True]
df_filtered = df_filtered[df_filtered.parant.str.contains("__") != True]
df_filtered = df_filtered[df_filtered.parant.str.contains("__") != True]
df_filtered = df_filtered[df_filtered.parant.str.contains("_") != True]
df_filtered = df_filtered[df_filtered.parant.str.contains("__") != True]
df_filtered = df_filtered[df_filtered.parant.str.contains("") != True]
# Graph recovering
G = nx.DiGraph()
c = 0
for i, gr in tqdm(df_filtered.groupby('child')):
vertex = set()
edges = []
for i, r in gr.iterrows():
G.add_node(r.parant, color="white")
G.add_node(r.child, color="white")
G.add_edge(r.parant, r.child)
, , , , .
counter = 0
nodes = []
def dfs(G, node, max_depth):
global nodes, counter
G.nodes[node]['color'] = 'gray'
nodes.append(node)
counter += 1
if counter == max_depth:
counter -= 1
return
for v in G.successors(node):
if G.nodes[v]['color'] == 'white':
dfs(G, v, max_depth)
elif G.nodes[v]['color'] == 'gray':
continue
counter -= 1
, nodes . " " 5 . 2500 . , , , , - , , , — , . , , .
, .
_
CAM
__
_
_
__
__
__
__
__
___
_
...
_
___
__
_____
_
_
____
_
_
_
_
__
_
_()
...
_
_
_
_
_
_
-_
_
_
_
_
_
من أجل تطبيق هذه الفئات للتصفية للغة الروسية ، ومع ذلك ، تحتاج إلى تعديل شيء ما في المصادر. لقد استخدمت هذا الإصدار. الآن هناك شيء جديد ، ربما لم تعد الإصلاحات أدناه ذات صلة. في ملف WikiExtractor.py ، تحتاج إلى استبدال "الفئة" بكلمة "الفئة" في مكانين. المجالات مع النسخة المصححة بالفعل معروضة أدناه:
tagRE = re.compile(r'(.*?)<(/?\w+)[^>]*?>(?:([^<]*)(<.*?>)?)?')
# 1 2 3 4
keyRE = re.compile(r'key="(\d*)"')
catRE = re.compile(r'\[\[:([^\|]+).*\]\].*') # capture the category name [[Category:Category name|Sortkey]]"
def load_templates(file, output_file=None):
...
if inText:
page.append(line)
# extract categories
if line.lstrip().startswith('[[:'):
mCat = catRE.search(line)
if mCat:
catSet.add(mCat.group(1))
بعد ذلك تحتاج إلى تشغيل الأمر
python WikiExtractor.py --filter_category categories --output wiki_filtered ruwiki-latest-pages-articles.xml
حيث الفئات هي ملف الفئات. ستكون المقالات التي تمت تصفيتها في wiki_filtertered.
هذا كل شئ. شكرآ لك على أهتمامك.