In diesem Beitrag möchte ich diesen Artikel ergänzen und Ihnen erklären, wie Sie den Wikipedia WikiExtractor flexibler verwenden und Artikel nach Kategorien filtern können.
Alles begann damit, dass ich Definitionen für verschiedene Begriffe brauchte. Begriffe und ihre Definitionen sind normalerweise der erste Satz auf jeder Wikipedia-Seite. Auf dem einfachsten Weg extrahierte ich alle Artikel und griff mit Stammgästen schnell nach allem, was ich brauchte. Das Problem ist, dass die Größe der Definitionen 500 MB überschreitet und zu viele unnötige Dinge vorhanden sind, z. B. benannte Entitäten, Städte, Jahre usw. was ich nicht brauche.
Ich habe richtig angenommen, dass das WikiExtractor- Tool (ich werde eine andere Version verwenden, der Link wird unten sein) eine Art Filter hat, und es stellte sich heraus, dass es sich um einen Filter nach Kategorien handelt. Kategorien sind Tags für Artikel mit einer hierarchischen Struktur zum Organisieren von Seiten. Ich war froh, die Kategorie "Exakte Wissenschaften" aufstellen zu können und war sehr naiv davon überzeugt, dass alle Artikel, die sich auf die exakten Wissenschaften beziehen, in die Liste aufgenommen werden, aber das Wunder ist nicht geschehen - jede Seite hat ihre eigenen winzigen Kategorien und es gibt keine Informationen auf einer einzelnen Seite darüber, wie diese Kategorien zusammenhängen. Das heißt, wenn ich Seiten über exakte Wissenschaften benötige, muss ich alle Kategorien angeben, die Nachkommen für "Exakte Wissenschaften" sind.
Nun, es spielt keine Rolle, jetzt finde ich einen Service, dachte ich, der mir problemlos alle Kategorien von einem bestimmten Start an liefert. Leider fand ich nur das , wo können Sie nur sehen , wie diese Kategorien in Zusammenhang stehen. Ein Versuch, die Kategorien manuell zu durchlaufen, war ebenfalls erfolglos, aber ich war "froh", dass diese Kategorien keine Baumstruktur haben, wie ich die ganze Zeit dachte, sondern nur einen gerichteten Graphen mit Zyklen. Darüber hinaus schwebt die Hierarchie selbst sehr stark - ich werde im Voraus sagen, dass Sie durch Setzen des Startpunkts "Mathematik" leicht Alexander I erreichen können. Daher musste ich dieses Diagramm nur lokal wiederherstellen und irgendwie eine Liste von Kategorien erhalten, die für mich von Interesse sind.
, : - , , , - .
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
__
_
_
__
__
__
__
__
___
_
...
_
___
__
_____
_
_
____
_
_
_
_
__
_
_()
...
_
_
_
_
_
_
-_
_
_
_
_
_
Um diese Kategorien zum Filtern nach der russischen Sprache anzuwenden, müssen Sie jedoch etwas in der Quelle anpassen. Ich habe diese Version verwendet. Jetzt gibt es etwas Neues, vielleicht sind die folgenden Korrekturen nicht mehr relevant. In der Datei WikiExtractor.py müssen Sie "Kategorie" an zwei Stellen durch "Kategorie" ersetzen. Die Bereiche mit der bereits korrigierten Version werden nachfolgend dargestellt:
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))
Danach müssen Sie den Befehl ausführen
python WikiExtractor.py --filter_category categories --output wiki_filtered ruwiki-latest-pages-articles.xml
Dabei ist Kategorien die Datei mit Kategorien. Gefilterte Artikel werden in wiki_filtered angezeigt.
Das ist alles. Vielen Dank für Ihre Aufmerksamkeit.