Aiuto:Analisi del database

Da Wikipedia, l'enciclopedia libera.

Questa pagina fornisce indicazioni utili per realizzare una copia di lavoro offline del database di Wikipedia in lingua italiana (it.wiki) allo scopo di effettuare analisi statistiche, estrarre elenchi di servizio, ecc. in forma semiautomatica. Per una guida alla consultazione offline di una copia di Wikipedia, vedere Aiuto:Download di Wikipedia.

La copia del database viene realizzata a partire dagli aggiornamenti periodici degli archivi (detti dump) messi a disposizione dalla Wikimedia Foundation sul server di download per tutti i progetti da essa gestiti. I dump più recenti relativi a it.wiki si trovano sempre nella cartella /itwiki/latest.

Prerequisiti[modifica | modifica wikitesto]

Il contenuto testuale delle pagine di Wikipedia (sia delle sole voci che di tutte le pagine di servizio quali template, categorie, ecc., con o senza le versioni precedenti) è disponibile sotto forma di file XML contenenti il sorgente di ciascuna versione della pagina in markup wiki e le indicazioni sull'autore; questi possono essere analizzati direttamente oppure importati all'interno di un database MySQL con struttura identica a quello di Wikipedia.

Sono inoltre disponibili sotto forma di script SQL una serie di metadati relativi alle singole pagine (link interni ed esterni, categorie, ecc.) o più in generale all'attività del sito (log delle azioni effettuate, protezione delle pagine, ecc.).

Non è disponibile alcun dato relativo agli utenti che non sia considerato pubblico (si veda la Privacy policy della Wikimedia Foundation).

MySQL[modifica | modifica wikitesto]

Per la gestione dei file è necessario installare almeno il programma di gestione di database MySQL, la cui versione open source (Community Server) è scaricabile da www.mysql.com per tutti i principali sistemi operativi. È richiesta una versione 4.0.x o successiva.

Dopo aver installato MySQL seguendo le istruzioni riportate sul sito, è necessario creare un database in cui importare i dati e ricostruire la struttura del database di Wikipedia: si noti che, se si desidera installare, oltre a MySQL, anche MediaWiki, queste operazioni saranno svolte automaticamente dallo script di configurazione di MediaWiki (in questo caso, procedere al paragrafo dedicato).

Se invece si desidera solo avere un database su cui effettuare analisi statistiche (e non si desidera installare anche MediaWiki), tali operazioni vanno eseguite "a mano" come di seguito descritto:

  • Creare un database in cui importare i dati, ad es. itwiki. Al prompt del proprio sistema operativo:


 mysql -u<utente> -p

 Enter password: <password>

 Welcome to the MySQL monitor. Commands end with ; or \g.
 Your MySQL connection id is x
 Server version: 5.0.xxx MySQL Community Edition (GPL)

 Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

 mysql> SET storage_engine=Innodb;
 Query OK, 0 rows affected (0.00 sec)

 mysql> CREATE DATABASE itwiki;
 Query OK, 1 row affected (0.01 sec)

Nota: Prima di procedere con la creazione del database e per eseguire correttamente la successiva importazione del dump nel database, bisogna accertarsi che MySQL operi usando come codifica di caratteri lo standard utf8 (anziché lo standard di default, latin1) affinché possando essere riconosciuti anche i caratteri accentati. Per ottenere ciò, è necessario modificare il file di configurazione my.cnf (solitamente presente in /etc/mysql in ambiente Linux) inserendo in esso le seguenti stringhe:

[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

(per MySQL 5.5 e versioni successive, rimuovere la stringa "default-character-set = utf8" sotto [mysqld])

Fatto questo, riavviate il server di MySQL (con sudo service mysql stop e sudo service mysql start) e create il database. Per accertarvi della corretta impostazione della codifica dei caratteri, eseguite nel prompt di MySQL i seguenti comandi:


 mysql> USE itwiki;
 Database changed

 mysql> show variables like 'char%';

(che dovrebbe dare in output:)

 +--------------------------+---------------------------------+
 | Variable_name            | Value                           |
 +--------------------------+---------------------------------+
 | character_set_client     | utf8                            |
 | character_set_connection | utf8                            |
 | character_set_database   | utf8                            |
 | character_set_filesystem | binary                          |
 | character_set_results    | utf8                            |
 | character_set_server     | utf8                            |
 | character_set_system     | utf8                            |
 | character_sets_dir       | /usr/local/mysql/share/charsets/|
 +--------------------------+---------------------------------+


 mysql> USE itwiki;
 Database changed

 mysql> show variables like 'collation%';

(che dovrebbe dare in output:)

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+


  • Ricostruire la struttura del database di Wikipedia:
    • Scaricare lo script di MediaWiki /maintenance/tables.sql che contiene la struttura del database (versione corrente[1])
    • Aprirlo con un editor di testo e sostituire tutte le occorrenze di /*_*/ con nulla
    • Caricarlo in MySQL nel database itwiki. Al prompt del proprio sistema operativo:


 mysql -u<utente> -p itwiki < tables.sql
oppure
 mysql> source tables.sql
 
 Enter password: <password>

  • Verificare che la creazione del database sia andata a buon fine. Al prompt di MySQL:


 mysql> USE itwiki;
 Database changed

 mysql> SHOW TABLES;
 +------------------+
 | Tables_in_itwiki |
 +------------------+
  ...
 +------------------+
 50 rows in set (0.03 sec)

Seguire quindi le istruzioni riportate di seguito per l'importazione con MWDumper del file XML e per l'importazione diretta dei file SQL relativi alle tabelle ausiliarie.

MediaWiki[modifica | modifica wikitesto]

Per una maggiore flessibilità è possibile installare lo stesso software usato da Wikipedia: MediaWiki, un prodotto open source disponibile gratuitamente sul sito www.mediawiki.org.

MediaWiki è un'applicazione PHP che richiede il seguente ambiente operativo:

  • Sistema operativo: qualunque (consigliato: GNU/Linux)
  • Server Web: qualunque (consigliato: apache2, scaricabile da www.apache.org)
  • Interprete PHP: ≥ 5.0 a partire da MediaWiki 1.7 (consigliato: PHP 5.1.2, scaricabile da www.php.net)
  • Server database: MySQL ≥ 4.0 (consigliato: MySQL 4.0.23 o superiore, scaricabile da www.mysql.com).

Nella pratica, la maggior parte delle distribuzioni GNU/Linux hanno già integrato un ambiente LAMP (Linux-Apache-MySQL-PHP); sui sistemi Windows esistono diversi pacchetti gratuiti per installare un ambiente WAMP (Windows-Apache-MySQL-PHP) in modo integrato, e così su altre piattaforme. Per una panoramica di tali soluzioni si veda la voce List of AMP Packages sulla Wikipedia in lingua inglese.

Per installare e configurare MediaWiki:

Nota: Se si possiede già una installazione di MediaWiki ma non se ne vuole intaccare il database, si può provare a copiare la struttura delle tabelle page, text e revision in un nuovo database e usare l'utility xml2sql per generare i file da importare.

Struttura dei file[modifica | modifica wikitesto]

La descrizione completa dei file è disponibile su Meta alla voce Data dumps (in inglese).

  • In funzione delle proprie esigenze, si può scegliere quale dei dump principali scaricare. Di seguito ne vengono descritti i contenuti a partire dal più compatto. Si noti che i file compressi possono risultare molto grandi una volta riportati alle dimensioni originali (anche più di 20 volte le dimensioni compresse); è quindi necessario disporre di ingenti quantità di spazio su disco per lavorare con essi.
pages-articles.xml 
Archivio XML delle pagine dell'enciclopedia ad eccezione del namespace Talk: (Discussione/i) e User: (Utente), con il testo della sola versione corrente. Utile (ma non sufficiente, da solo) per la generazione di copie locali di Wikipedia.
pages-meta-current.xml 
Archivio XML di tutte le pagine (voci e pagine di servizio), con il testo della sola versione corrente. Utile per l'analisi e la generazione di elenchi offline.
pages-meta-history.xml 
Archivio XML di tutte le pagine (voci e pagine di servizio), con il testo della versione corrente e di tutte le revisioni precedenti. Utile per le analisi più approfondite.
  • Oltre al dump vero e proprio, il server di download contiene anche altri file utili:
file *.sql 
Copie delle principali tabelle di appoggio del database usato da MediaWiki; non è necessario scaricare a parte le tabelle *link se si ricostruiscono i link secondo le istruzioni riportate a fondo pagina.
file all-titles-in-ns0.gz 
Elenco dei soli titoli delle voci in formato testo.
altri dump XML 
Dump di servizio per esigenze particolari.

Nota: La descrizione completa della struttura del database (schema) è contenuta nel file /maintenance/tables.sql (versione corrente[1])

Importazione dei file XML[modifica | modifica wikitesto]

Vi sono due modi per importare i dump XML nel database. Nel caso di installazione del solo MySQL è necessario ricorrere a un programma esterno quale MWDumper, mentre l'installazione di MediaWiki contiene un apposito script di importazione, maintenance/importDump.php.

I file XML sono compressi in formato bzip2[2]. Per un elenco abbastanza completo dei programmi di compressione in grado di leggere il formato bzip2 sui diversi sistemi operativi, si rimanda a questa pagina sulla Wikipedia in lingua inglese.

Per importazioni corpose si consiglia comunque l'uso di MWDumper, che dovrebbe risultare più veloce dello script PHP compreso in MediaWiki ed è in grado di gestire direttamente i file in formato compresso.

MySQL e MWDumper[modifica | modifica wikitesto]

Tra i programmi accessori di MediaWiki è presente l'applicazione Java MWDumper (descrizione e istruzioni, in inglese). Tale programma è in grado di effettuare operazioni di importazione ed esportazione dei dump, con la possibilità di limitare i contenuti elaborati a un sottoinsieme di quelli presenti.

MWDumper è un'aplicazione Java open source, il cui eseguibile è scaricabile qui (documentazione e sorgenti qui). Per l'uso di MWDumper è necessario disporre dell'ambiente Java, scaricabile da www.java.com.

Supponendo di aver scaricato l'ultima versione del database (latest) e di volerla importare nel database itwiki:

  • Se si sta importando su un database esistente, svuotare le tabelle in cui MWDumper inserirà i dati. Al prompt di MySQL:


 mysql> USE itwiki;
 Database changed

 mysql> TRUNCATE TABLE page;
 Database changed
 Query OK, x rows affected (x.xx sec)

 mysql> TRUNCATE TABLE text;
 Database changed
 Query OK, x rows affected (x.xx sec)

 mysql> TRUNCATE TABLE revision;
 Database changed
 Query OK, x rows affected (x.xx sec)

  • Importare il nuovo dump. Al prompt del proprio sistema operativo:


 java -jar mwdumper.jar --format=sql:1.5 itwiki-latest-pages-meta-current.xml.bz2 | mysql -u<utente> -p itwiki
 
 Enter password: <password>
 1.000 pages (x,x/sec), xxx revs (x,x/sec)
 2.000 pages (x,x/sec), xxx revs (x,x/sec)
 ...
 822.267 pages (x,x/sec), 822.267 revs (x,x/sec)

Nota: Verificare con attenzione l'output del comando, che non termina in caso di errori. Per questo può essere utile verificare che il numero di righe della tabella page sia coerente con quanto indicato alla fine del processo di importazione. Dal prompt di MySQL:


 mysql> USE itwiki;
 Database changed

 mysql> SELECT COUNT(*) FROM page;
 +----------+
 | count(*) |
 +----------+
 |   822267 |
 +----------+
 1 row in set (x.xx sec)

Nota: in caso di problemi nell'importazione dovuti a pacchetti troppo grandi (Got a packet bigger than 'max_allowed_packet' bytes), modificare il file di configurazione di MySQL (my.ini o my.cnf) inserendovi la riga: max_allowed_packet=32M nella sezione [mysqld].

Per migliorare le prestazioni si può anche provare ad aggiungere le righe init_connect='set autocommit=0' e innodb_flush_log_at_trx_commit=0, nonché a incrementare (anche di molto) i valori di innodb_log_file_size, innodb_buffer_pool_size e innodb_log_buffer_size.

MediaWiki e importDump.php[modifica | modifica wikitesto]

All'interno della cartella in cui è stato installato MediaWiki, nella sottocartella /maintenance è disponibile lo script di importazione importDump.php. L'esempio che segue è in ambiente Linux:[3][4]

 # Portarsi nella cartella /maintenance di MediaWiki
 cd /var/www/htdocs/mediawiki/maintenance/

 # Scaricare l'ultimo dump
 wget http://download.wikipedia.org/itwiki/latest/itwiki-latest-pages-meta-current.xml.bz2

 # Importare il dump nel DB
 bunzip2 -c itwiki-latest-pages-meta-current.xml.bz2 | php importDump.php

Si noti però che si tratta però di una procedura molto lenta (ad es. l'operazione sopra descritta è durata 51 ore su un Intel i5 con 4GB di RAM e un SSD come Hard Disk, utilizzando il dump senza la cronologia completa. maggio 2012).

Tabelle ausiliarie[modifica | modifica wikitesto]

Oltre alle tabelle che contengono il testo e i metadati direttamente legati alle pagine, MediaWiki si serve di un certo numero di tabelle ausiliarie per il suo funzionamento. Si tratta principalmente di tabelle dei collegamenti (verso altre pagine, immagini, template, categorie, ecc.) che consentono di evitare la dispendiosa analisi del testo delle pagine per tutte quelle richieste che devono essere evase in tempo reale, nonché di alcuni log e statistiche. Il contenuto di tutte queste tabelle (con l'esclusione dei dati relativi agli utenti, che sono riservati) è disponibile sul server di download in formato SQL, allineato al dump principale.

Dopo avere scaricato i file, per importarli il comando è simile al seguente:

gzip -dc itwiki-latest-site_stats.sql.gz | mysql -u<nomeutente> -p <nomeDB>

Ricostruzione dei link[modifica | modifica wikitesto]

In alternativa, si può far ricostruire le tabelle al software MediaWiki con lo script refreshLinks.php:[4]

php refreshLinks.php

Si può riavviare lo script dopo un'interruzione con:

php refreshLinks.php - - <numero>

dove <numero> è l'ultima ID segnalata dallo script prima dell'interruzione.

Nomi dei namespace[modifica | modifica wikitesto]

In MediaWiki, i nomi dei namespace non sono presenti nel database, che ne contiene solo il valore numerico (da 0 a 16 per quelli predefiniti, da 100 in su per quelli opzionali). I nomi per esteso, che sono differenti in ciascuna lingua, si trovano in un file di configurazione.

Per una realizzazione più comoda degli elenchi offline che riguardano pagine dei vari namespace è stata approntata una apposita tabella dei namespace, che riporta la corrispondenza tra il numero memorizzato nel DB e il nome italiano utilizzato su Wikipedia. Questa tabella può essere importata nel DB come descritto qui sopra per i file SQL.

Esempi[modifica | modifica wikitesto]

Nota: Alcune delle descrizioni riportate negli elenchi generati offline sono obsolete. A partire dalla versione 1.5 di MediaWiki la tabella cur non esiste più, i dati delle voci sono distribuiti nelle tre tabelle page, revision e text.

Ecco come ottenere, con una serie di query MySQL, il testo di una voce partendo dal titolo della stessa:

 SELECT page_id FROM page WHERE page_title='Zugzwang';    # Per trovare l'id della voce Zugzwang

 SELECT rev_text_id FROM revision WHERE rev_page='25966'; # Per trovare l'ultima revisione

 SELECT old_text FROM text WHERE old_id='4079266';        # Per ottenere il testo

Ecco invece come ottenere i nomi (già attivi come Wikilink) delle pagine il cui contenuto corrisponde a una espressione regolare:

SELECT CONCAT("# [[", page_title, "]]") FROM page
  JOIN revision ON page_id=rev_page
  JOIN text ON rev_text_id=old_id
  WHERE old_text REGEXP "^[Ee]spressione[_ ][Rr]egolare$"
  ORDER BY page_title;

L'esempio di prima genera dei link rossi quando le pagine non appartengono al namespace principale, invece questo evita l'errore:

SELECT CONCAT("# [[{{#if:{{ns:", page_namespace, "}}|{{ns:", page_namespace, "}}:}}", page_title, "]]") FROM page
  JOIN revision ON page_id=rev_page
  JOIN text ON rev_text_id=old_id
  WHERE old_text REGEXP "^[Ee]spressione[_ ][Rr]egolare$"
  ORDER BY page_title;

Note[modifica | modifica wikitesto]

  1. ^ a b versione precedente SVN
  2. ^ Di alcuni file, come ad esempio itwiki-latest-pages-meta-history.xml, esistono copie compresse con altri formati, in particolare 7zip, che dovrebbe fornire un maggior livello di compressione rispetto a bzip2.
  3. ^ Il percorso effettivo può variare a seconda della distribuzione utilizzata e della configurazione del server. Ad esempio se si sceglie l'installazione di default del server LAMP in Ubuntu Server 6.10, per default la sottodirectory htdocs non viene creata, e il percorso sarà /var/www/mediawiki/maintenance/
  4. ^ a b Se si riceve il messaggio d'errore bash: php: command not found, è probabile che l'installazione di default abbia installato PHP, ma non l'utilità a riga di comando, che va installata manualmente a parte. Fare riferimento alla documentazione per ulteriori dettagli. Nelle distribuzioni come Debian e Ubuntu, installare il pacchetto php5-cli.

Pagine correlate[modifica | modifica wikitesto]