Wikipedia:短いページ/SQL
Wikipedia:短いページを作るための手順を紹介します。
動作環境
[編集]- MySQL4.0.2以降が動くOS(Linux, FreeBSD, MacOSX, Windows2000以降)
- MySQL
- MediaWikiのうちmaintenance/tables.sql
- m:xml2sql
手順
[編集]事前準備
[編集]- データベースとテーブルの作成
MySQLのサービスが立ち上がったら、jaのデータ読み込み用のデータベースとテーブルを作成しておきます。
mysql> create database wikipedia; Query OK, 1 row affected (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | wikipedia | +--------------------+ 3 rows in set (0.00 sec) mysql> use wikipedia; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> source /home/John_Doe/tables.sql
- xml2sqlのインストール
m:xml2sql#installを参考にインストールを行います。gcc, libc6-dev, expat, libexpat, make が必要です。
ダンプデータのインポート
[編集]- Wikimedia dump serviceのlatestよりjaのダンプを取得。
- xml2sqlでダンプをXMLテキストに変換。
- mysqlimport でデータベースにインポート。
wget http://download.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2 bunzip2 -c jawiki-latest-pages-articles.xml.bz2 | xml2sql mysqlimport -u root wikipedia `pwd`/{page,revision,text}.txt
ダンプデータにBMP外の記事名があると、インポートエラーが発生するかもしれません。
mysqlimport: Error: Duplicate entry '0-' for key 2, when using table: page
この場合は、pageテーブルの取り込み済件数をチェックして、テキストエディタで page.txt から指定した記事を取り除いてください (select count(*) from page; また select max(page_id) from page; として page_idで検出することもできます)。その後、page テーブルを切り捨てて (truncate table page;)、再度 mysqlimportを実行します。
検出したBMP外の記事は、記事の場合は改名、リダイレクト(及び記事移動後の跡地のリダイレクト)は即時削除の依頼を行います。
ダンプデータを取り込むことができたら、jaのダンプを読み込んだデータベースを指定して、以下のSQLを順次実行していきます。
28 - 256
[編集]SET @min_value=28,@max_value=256; SELECT CONCAT('* [[',page_title,']]') FROM page,revision,text WHERE ( page.page_namespace=0 AND page.page_is_redirect=0 AND page.page_len > @min_value AND page.page_len < @max_value AND page.page_latest = revision.rev_id AND revision.rev_id = text.old_id AND page.page_title NOT LIKE "%/履歴" AND text.old_text NOT LIKE "%imai%" AND text.old_text NOT LIKE "%akujo%" AND text.old_text NOT LIKE "%曖昧さ回避%" AND text.old_text NOT LIKE "%保護性急%" ) OR ( page.page_namespace=0 AND page.page_is_redirect=0 AND page.page_len < @min_value AND page.page_latest = revision.rev_id AND revision.rev_id = text.old_id AND page.page_title NOT LIKE "%/履歴" AND text.old_text NOT LIKE "%imai%" AND text.old_text NOT LIKE "%akujo%" AND text.old_text NOT LIKE "%eletedpage%" AND text.old_text NOT LIKE "%isambig%" AND text.old_text NOT LIKE "%dab%" AND text.old_text NOT LIKE "%Dab%" AND text.old_text NOT LIKE "%曖昧さ回避%" AND text.old_text NOT LIKE "%保護性急%" ) ORDER BY page.page_title INTO OUTFILE './under256bytes.txt';
それ以降
[編集]SET @min_value=(下限値),@max_value=(上限値); SELECT CONCAT('* [[',page_title,']]') FROM page,revision,text WHERE page.page_namespace=0 AND page.page_is_redirect=0 AND page.page_len >= @min_value AND page.page_len < @max_value AND page.page_latest = revision.rev_id AND page.page_title NOT LIKE "%/履歴" AND revision.rev_id = text.old_id AND text.old_text NOT LIKE "%imai%" AND text.old_text NOT LIKE "%akujo%" AND text.old_text NOT LIKE "%isambig%" AND text.old_text NOT LIKE "%dab%" AND text.old_text NOT LIKE "%Dab%" AND text.old_text NOT LIKE "%曖昧さ回避%" ORDER BY page.page_title INTO OUTFILE './under(上限値)bytes.txt';
できたファイルから邪魔っぽいページをいくつか除外。プレビューして削除されたものやREDIRECTを除去。この辺は手動なので適当です。
改善案などはWikipedia‐ノート:短いページまで。質問等はUser talk:Suisuiまで。手順のうち mysqlimportでimport、までの質問は事情により受け付けません。MySQLのマニュアルやFAQなどよりふさわしいところで全て公開されています。
2012年以降の使用クエリ
[編集]2012年6月ごろからの更新(1000件)では以下のクエリを使用しています。
SELECT CONCAT('# [[',page_title,']]') FROM page LEFT JOIN categorylinks ON page_id = cl_from AND (cl_to LIKE '%曖昧さ回避%' OR cl_to LIKE '%ソフトリダイレクト%' OR cl_to LIKE '即時削除対象のページ' OR cl_to LIKE '削除依頼中の記事') WHERE page_is_redirect = 0 AND page_namespace = 0 AND page_title NOT LIKE '%/履歴' AND page_title NOT LIKE '%/log%' GROUP BY page_id HAVING COUNT(cl_to) = 0 ORDER BY page_len LIMIT 1000;
関連項目
[編集]- mw:Manual:Database_layout - sqlの中身はこちらを参照(英語)