Italian Wikipedia Heading Frequency

This notebook serves to sort Italian Wikipedia section headers by frequency as related to this research project.

Part 1

import pandas as pd
import numpy as np
# read in headers file by chunks of 100000 to conserve memory
# https://stackoverflow.com/questions/25962114/how-to-read-a-6-gb-csv-file-with-pandas
tp = pd.read_csv('itwiki_20161101_headings.tsv', sep='\t', header=0, dtype={'page_id': np.int32, 'page_title': object, 'page_ns': np.int16, 'heading_level': np.int8, 'heading_text': object}, iterator=True, chunksize=100000)
# concatenate all rows into a pandas dataframe 
df = pd.concat([chunk for chunk in tp])
df.head()
page_id page_title page_ns heading_level heading_text
0 2 Armonium 0 2 Armonium occidentale
1 442901 Engraulis 0 2 Tassonomia
2 442901 Engraulis 0 2 Note
3 2 Armonium 0 2 Armonium indiano
4 2 Armonium 0 2 Bibliografia
# remove leading and trailing whitespace from heading_text column
df['heading_text'] = pd.core.strings.str_strip(df['heading_text'])
# write this dataframe to a tsv and restart kernel to free up memory
df.to_csv('itwiki_20161101_headings_noWS.tsv', sep='\t')

Part 2

# read in headings w/o whitespace
tp2 = pd.read_csv('itwiki_20161101_headings_noWS.tsv', sep='\t', header=0, dtype={'page_id': np.int32, 'page_title': object, 'page_ns': np.int16, 'heading_level': np.int8, 'heading_text': object}, iterator=True, chunksize=100000)
df2 = pd.concat([chunk for chunk in tp2])
df2.head()
Unnamed: 0 page_id page_title page_ns heading_level heading_text
0 0 2 Armonium 0 2 Armonium occidentale
1 1 442901 Engraulis 0 2 Tassonomia
2 2 442901 Engraulis 0 2 Note
3 3 2 Armonium 0 2 Armonium indiano
4 4 2 Armonium 0 2 Bibliografia
# drop column 0 (index from previous df)
df2.drop('Unnamed: 0', axis=1, inplace=True)
df2.head()
page_id page_title page_ns heading_level heading_text
0 2 Armonium 0 2 Armonium occidentale
1 442901 Engraulis 0 2 Tassonomia
2 442901 Engraulis 0 2 Note
3 2 Armonium 0 2 Armonium indiano
4 2 Armonium 0 2 Bibliografia
# groupby heading_text and count the number of unique page_titles each heading appears in
# sort in descending order
# this returns a pandas series object
article_count = df2.groupby('heading_text')['page_title'].apply(lambda x: len(x.unique())).sort_values(ascending=False)
# turn pandas series into pandas dataframe
it_article_count_DF = pd.DataFrame({'section_title':article_count.index, 'number_of_articles':article_count.values})
# add a column for the percentage of articles that header appears in
it_article_count_DF['article_percentage'] = (it_article_count_DF['number_of_articles']/1309649)*100
# set pandas options to display 100 rows
# round percentage to 2 decimal places and show top 100 results
pd.options.display.max_rows = 100
it_article_count_DF.round({'article_percentage': 2}).head(100)
number_of_articles section_title article_percentage
0 686509 Collegamenti esterni 52.42
1 585769 Note 44.73
2 411609 Altri progetti 31.43
3 246274 Voci correlate 18.80
4 220758 Bibliografia 16.86
5 139173 Biografia 10.63
6 116651 Storia 8.91
7 77859 Trama 5.95
8 67758 Carriera 5.17
9 60746 Palmarès 4.64
10 57354 Società 4.38
11 55784 Evoluzione demografica 4.26
12 55750 Tracce 4.26
13 36585 Produzione 2.79
14 35365 Distribuzione 2.70
15 35188 Descrizione 2.69
16 32684 Club 2.50
17 30414 Formazione 2.32
18 28690 Statistiche 2.19
19 28591 Risultati 2.18
20 25504 Tabellone 1.95
21 24082 Filmografia 1.84
22 23701 Teste di serie 1.81
23 23278 Opere 1.78
24 22063 Discografia 1.68
25 21854 Geografia fisica 1.67
26 21555 Nazionale 1.65
27 20642 Onorificenze 1.58
28 18295 Cinema 1.40
29 17490 Competizioni nazionali 1.34
30 16350 Curiosità 1.25
31 15833 Finale 1.21
32 15829 Televisione 1.21
33 15491 Caratteristiche 1.18
34 15065 Rosa 1.15
35 13722 Fonti 1.05
36 13372 Amministrazione 1.02
37 13283 Galleria d'immagini 1.01
38 13180 Classifiche 1.01
39 12993 Codici 0.99
40 12438 Distribuzione e habitat 0.95
41 11440 Riconoscimenti 0.87
42 11225 Parte bassa 0.86
43 11224 Parte alta 0.86
44 11192 Doppio 0.85
45 10771 Singolare 0.82
46 10731 Tassonomia 0.82
47 10162 Persone 0.78
48 9854 Caratteristiche tecniche 0.75
49 9683 Monumenti e luoghi d'interesse 0.74
50 9681 Edizioni 0.74
51 9593 Musica 0.73
52 9589 Altro 0.73
53 9164 Cenni storici 0.70
54 8719 Classifica finale 0.67
55 8710 Biologia 0.67
56 8418 Squadre partecipanti 0.64
57 8311 Stagione 0.63
58 8292 Personaggi 0.63
59 8214 Il disco 0.63
60 7680 Filmografia parziale 0.59
61 7476 Pagine correlate 0.57
62 7460 Singoli 0.57
63 7457 Sport 0.57
64 7389 Territorio 0.56
65 7323 Economia 0.56
66 7161 Semifinali 0.55
67 6929 Gemellaggi 0.53
68 6799 Classifica 0.52
69 6752 Girone di ritorno 0.52
70 6685 Toponimi 0.51
71 6568 Etimologia 0.50
72 6543 Struttura 0.50
73 6351 Eventi 0.48
74 6327 Girone di andata 0.48
75 6320 Vita privata 0.48
76 6277 Albo d'oro 0.48
77 6277 Giocatore 0.48
78 6144 Episodi 0.47
79 6134 Album 0.47
80 6021 Presenze e reti nei club 0.46
81 5954 Infrastrutture e trasporti 0.45
82 5936 Premi e riconoscimenti 0.45
83 5727 Allenatore 0.44
84 5665 Geografia 0.43
85 5643 Critica 0.43
86 5579 Cultura 0.43
87 5529 Calendario 0.42
88 5489 Individuale 0.42
89 5468 Riproduzione 0.42
90 5414 Sigle 0.41
91 5352 Alimentazione 0.41
92 5228 Finali 0.40
93 5211 Verdetti 0.40
94 5145 Cronologia presenze e reti in Nazionale 0.39
95 5054 Musicisti 0.39
96 5034 Campioni 0.38
97 5003 Statistiche di squadra 0.38
98 4861 Composizione 0.37
99 4704 Sezione 2 0.36