Get all revisions that are redirects

For a given wiki we want to find all revisions that are redirects. We query wmf.mediawiki_wikitext_history.

How:

  • get all redirect-aliases
    • for any wiki we can extract all redirect-aliases from '%s-latest-siteinfo-namespaces.json.gz'
  • query all revision-ids that are redirects
    • we look at the column 'revision_text'
    • we check whether the it starts with the string '#redirect [[*]]' or any of its aliases using sql's LIKE command
    • we only consider lower-case strings (syntax agnostic to capitalization)
  • regexp-extract to get redirect-page from text-field
In [1]:
import os
from pyspark.sql.functions import  col,regexp_extract ## for extracting redirect-page
from redirect import get_redirect_aliases ## for getting redirect-aliases
In [2]:
## select the wmf table
sqlContext.sql('USE wmf')
Out[2]:
DataFrame[]

Which wiki

In [3]:
wiki_date = '2019-07'
wiki_name = 'rowiki'

Get all redirect - aliases

In [4]:
## we look up the json of the latest siteinfo-namespaces file
filename = os.path.join('/mnt','data','xmldatadumps','public','%s'%wiki_name,'latest','%s-latest-siteinfo-namespaces.json.gz'%wiki_name)
list_redirect_aliases = get_redirect_aliases(filename)
print(list_redirect_aliases)
['#REDIRECT', '#REDIRECTEAZA']

Query

In [5]:
## construct the string-matching condition
str_revision_redirect_match = '('
for i_redirect_alias, redirect_alias in enumerate(list_redirect_aliases):
    if i_redirect_alias > 0:
        str_revision_redirect_match += ' OR '
    str_revision_redirect_match += 'LOWER(revision_text) LIKE "%s [[%%]]%%"'%(redirect_alias.lower())
str_revision_redirect_match += ')'
print(str_revision_redirect_match)
(LOWER(revision_text) LIKE "#redirect [[%]]%" OR LOWER(revision_text) LIKE "#redirecteaza [[%]]%")
In [10]:
## query all revision which start with '#redirect [[*]]' or one of its redirect-aliases

query = 'SELECT page_id, revision_id, page_title, revision_text \
FROM wmf.mediawiki_wikitext_history \
WHERE snapshot="%s" \
AND wiki_db="%s" \
AND page_namespace = 0 \
AND %s \
ORDER BY page_id, revision_id \
'\
%(wiki_date,wiki_name,str_revision_redirect_match)
print(query)

result = sqlContext.sql(query)

## extracting the page [[ ]] where it redirects to
## drop the revision-text (too much information)

df_final = result.withColumn('revision_redirect_page',regexp_extract(col('revision_text'), '\[\[(.*?)\]\]',1  ) )\
.drop('revision_text')\
.toPandas()
SELECT page_id, revision_id, page_title, revision_text FROM wmf.mediawiki_wikitext_history WHERE snapshot="2019-07" AND wiki_db="rowiki" AND page_namespace = 0 AND (LOWER(revision_text) LIKE "#redirect [[%]]%" OR LOWER(revision_text) LIKE "#redirecteaza [[%]]%") ORDER BY page_id, revision_id 
In [11]:
## save result to csv-dataframe
df_final.to_csv(df_redirect_revision_%s.csv'%wiki_name)
In [12]:
df_final
Out[12]:
page_id revision_id page_title revision_redirect_page
0 9 66798 Fizica Fizică
1 9 1303010 Fizica Fizică
2 9 1705699 Fizica Fizică
3 9 2126089 Fizica Fizică
4 9 5693014 Fizica Fizică
5 9 10723388 Fizica Fizică
6 13 1962 Limbi Listă de limbi
7 13 66801 Limbi Limbă
8 13 3020259 Limbi Limbă (dezambiguizare)
9 13 3914562 Limbi Limbă
10 13 8881133 Limbi Limbă (dezambiguizare)
11 14 66802 Lingvistica Lingvistică
12 15 66803 Limba romana Limba română
13 17 66805 Arte martiale Arte marţiale
14 17 232040 Arte martiale Artă marţială
15 17 4622678 Arte martiale Artă marțială
16 17 12196093 Arte martiale Artele marțiale
17 17 12206268 Arte martiale Arte marțiale
18 24 66811 Romania (dezambiguizare) România
19 24 747673 Romania (dezambiguizare) România (dezambiguizare)
20 24 748034 Romania (dezambiguizare) România
21 49 66833 Religii Religie
22 71 2461256 GPL (licență) GPL (licenţă, versiunea 2)
23 71 2896707 GPL (licență) GPL (licenţă, versiunea 2)
24 71 2896715 GPL (licență) GPL (licenţă, versiunea 2)
25 71 2986782 GPL (licență) Licenţa_Publică_Generală_GNU
26 71 4044515 GPL (licență) Licența Publică Generală GNU
27 71 4184309 GPL (licență) Licența Publică Generală GNU
28 76 66859 Limba valonă Limba văleană
29 80 66862 Nazismul Nazism
... ... ... ... ...
424323 2423632 12985859 Crinul tigru Lilium lancifolium
424324 2423754 12986164 Reclamă de Televiziune Reclamă de televiziune
424325 2423877 12986435 Nomenclatorul drumurilor naționale din România Lista drumurilor naționale din România
424326 2423919 12986606 NGC 242 NGC 241
424327 2423921 12986619 Iacob I de Aragon Iacob I al Aragonului
424328 2423972 12986802 DN 5 DN5
424329 2424061 12987400 After School (grupă) After School (grup muzical)
424330 2424071 12987453 Lactarius deterrimus Râșcov de molid
424331 2424153 12987875 Dumbo (povestiri) Dumbo (carte)
424332 2424173 12988014 Liudmila Saveleva Liudmila Savelieva
424333 2424181 12988040 Reeducarea în România Comunistă Reeducarea în România comunistă
424334 2424230 12988331 James B. Conant James Bryant Conant
424335 2424236 12988655 Dirijor Mircea Popa Mircea Popa (dirijor)
424336 2424257 12989799 Nürburg (Gemeinde) Nürburg (comună)
424337 2424323 12990052 Hachioji Hachiōji‎
424338 2424380 12992295 Procedeu Edeleanu Proces Edeleanu
424339 2424381 12992303 Procedeu Leblanc Proces Leblanc
424340 2424385 12992662 Vasile Șova Vasilii Șova
424341 2424387 12992922 Oxid feric Oxid de fier (III)
424342 2424388 12992942 Oxid feros Oxid de fier (II)
424343 2424418 12998633 Charles Frederic Gerhardt Charles Frédéric Gerhardt
424344 2424477 13004007 WP:PARITY Wikipedia:Opinii marginale#Paritatea surselor
424345 2424494 13008956 Mariquina, Chile Mariquina
424346 2424546 13012179 ARM Arm (dezambiguizare)
424347 2424581 13012369 Acid fosfonic Fosfonat
424348 2424595 13012445 Polimer de condensare Policondensare
424349 2424683 13013136 UEFA Champions League 2018-2019 Liga Campionilor 2018-2019
424350 2424717 13013430 Galla, soția lui Teodosiu I Galla (soția lui Teodosiu I)
424351 2424761 13013681 SSC Farul Constanța FC Farul Constanța
424352 2424870 13014422 Swaziland Eswatini

424353 rows × 4 columns