UbuntuでMediaWikiをインストールしてWikipedaの記事を取り込んでみる

0.最初に

Wikipediaの下記ページを元に作業を進めていきます。

Wikipedia:データベースダウンロード

1.Apache,MySQL,PHPをインストール

sudo apt-get install apache2
sudo apt-get install mysql-server
sudo apt-get install php5
sudo apt-get install libapache2-mod-auth-mysql
sudo apt-get install php5-mysql
sudo /etc/init.d/apache2 restart

MediaWikiMySQL以外のDBにも対応している

2.MediaWikiをダウンロードして配置

wget http://releases.wikimedia.org/mediawiki/1.22/mediawiki-1.22.6.tar.gz
tar zxvf mediawiki-1.22.6.tar.gz
sudo mv mediawiki-1.22.6 /var/www/html/mediawiki

3.MediaWikiの初期設定

  1. ブラウザからhttp://localhost/mediawiki/へアクセス。
  2. 画面の説明に沿って設定値を入力。
  3. ブラウザからダウンローできるLocalSettings.phpを/var/www/html/mediawikiへ配置。

4.Wikipediaのデータをダウンロード

http://dumps.wikimedia.org/jawikiにある最新の日付のxmlを取得

wget http://dumps.wikimedia.org/jawiki/20140503/jawiki-20140503-pages-meta-current.xml.bz2
mv jawiki-20140503-pages-meta-current.xml.bz2 /var/www/html/mediawiki

5.WikipediaのデータをPHPMediaWikiに投入

cd /var/www/html/mediawiki
bunzip2 -c jawiki-20140503-pages-meta-current.xml.bz2 | php maintenance/importDump.php

xmlは2.2Gあります。Wikipedaのトップページによると今時点で90万件を突破とあるのでおそらくxmlの中に全データが入っていると思われます。上記のPHPのプログラムで投入すると非常に時間がかかり、手元の環境だと3日ぐらいかかりそうです。

6.WikipediaのデータをJavaMediaWikiに投入

PHPだと時間がかかりすぎます。上記ダウンロードの説明ページにはMWDumperというJavaの投入プログラムも紹介されているのでそちらを試してみます。

wget http://csomalin.csoma.elte.hu/~tgergo/wiki/mwdumper.jar

そのままだとMySQLでエラーになるので設定を変更。

ERROR 1153 (08S01) at line 35: Got a packet bigger than 'max_allowed_packet' bytes
vi /etc/my.cnf
max_allowed_packet=128M
sudo service mysqld restart

これを使って投入すると数時間で終わるペースで投入されますが、、途中でエラーになります。

nohup java -jar mwdumper.jar --format=sql:1.5 jawiki-20140503-pages-meta-current.xml.bz2 2> current4.xml.log | mysql -u root my_wiki &
94,000 pages (1,334.412/sec), 94,000 revs (1,334.412/sec)
Exception in thread "main" java.lang.IllegalArgumentException: Invalid contributor
    at org.mediawiki.importer.XmlDumpReader.closeContributor(Unknown Source)
    at org.mediawiki.importer.XmlDumpReader.endElement(Unknown Source)
    at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
    at org.apache.xerces.parsers.AbstractXMLDocumentParser.emptyElement(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanStartElement(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentConten
以下略

ソースが見たいのですが、見つからないので今日はここまで。