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 が必要です。

ダンプデータのインポート[編集]

  1. Wikimedia dump serviceのlatestよりjaのダンプを取得。
  2. xml2sqlでダンプをXMLテキストに変換。
  3. 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;

関連項目[編集]