英語 Wikipedia と Simple English Wikipedia の対応関係を観る(1)
Simple English Wikipedia は名前の通り、Simple な英単語と文法を使って書かれた英語版 Wikipedia です。
この Simple な英語で書かれた Wikipedia 記事と通常の英語版 Wikipedia 記事の間の差異や一致を見ていきます。
まずはデータの取得から。クロールせずとも dump が公開されているので、今回は両方 2023/07/01 の dump を使いました。
英語版 Wikipedia(enwiki-20230701-pages-articles-multistream.xml.bz2)
Simple English Wikipedia(simplewiki-20230701-pages-articles-multistream.xml.bz2)
今回は記事テキストを見比べたいだけなので、WikiExtractor を使って .bz ファイルから直接テキストを抽出します。
git clone だと動かないみたいな話を聞いたので、あえて git から clone してきました。
$ git clone https://github.com/attardi/wikiextractor
Cloning into 'wikiextractor'...
remote: Enumerating objects: 771, done.
remote: Counting objects: 100% (30/30), done.
remote: Compressing objects: 100% (16/16), done.
remote: Total 771 (delta 17), reused 21 (delta 14), pack-reused 741
Receiving objects: 100% (771/771), 1.31 MiB | 14.14 MiB/s, done.
Resolving deltas: 100% (450/450), done.
$ python wikiextractor/wikiextractor/WikiExtractor.py
Traceback (most recent call last):
File "wikiextractor/wikiextractor/WikiExtractor.py", line 66, in <module>
from .extract import Extractor, ignoreTag, define_template, acceptedNamespaces
ImportError: attempted relative import with no known parent package
なるほど。
$ vi wikiextractor/wikiextractor/WikiExtractor.py
from .extract import Extractor, ignoreTag, define_template, acceptedNamespaces
↓ extract の直前にあるドットを消します。
from extract import Extractor, ignoreTag, define_template, acceptedNamespaces
はい。
$ python wikiextractor/wikiextractor/WikiExtractor.py
usage: WikiExtractor.py [-h] [-o OUTPUT] [-b n[KMG]] [-c] [--json] [--html] [-l] [-ns ns1,ns2] [--templates TEMPLATES]
[--no-templates] [--html-safe HTML_SAFE] [--processes PROCESSES] [-q] [--debug] [-a] [-v]
input
WikiExtractor.py: error: the following arguments are required: input
10 並列、json 形式出力、ハードディスク容量は十分なので出力ファイルが分割されないよう、-b で大きな値(100G)を設定しておきます。
$ python wikiextractor/wikiextractor/WikiExtractor.py en_wiki/enwiki-20230701-pages-articles-multistream.xml.bz2 --processes 10 -o en_wiki/text/ --json -b 100G
$ python wikiextractor/wikiextractor/WikiExtractor.py simple_wiki/simplewiki-20230701-pages-articles-multistream.xml.bz2 --processes 10 -o simple_wiki/text/ --json -b 100G
実行にはそこそこ時間がかかります。
完了後、-o 指定したディレクトリ内に AA というディレクトリができて、その中に wiki_00 という 1行=1記事=1 json 形式のファイルが 1つずつできています。
英語版 Wikpedia が19GB(約 1,700 万 記事)、Simple English Wikipedia が 229MB(約 32 万記事)
$ ls -lh en_wiki/text/AA/wiki_00
19G en_wiki/text/AA/wiki_00
$ ls -lh simple_wiki/text/AA/wiki_00
229M simple_wiki/text/AA/wiki_00
$ wc -l */text/AA/wiki_00
17108808 en_wiki/text/AA/wiki_00
322822 simple_wiki/text/AA/wiki_00
今回はこの 2つのファイル間で対応をとっていきたいのですが、いくつか前処理が必要です。
本格的には行わないので列挙するとこんな感じです。
記事内に残ったタグを除外
曖昧性解消のページを除外
内容を別の記事にゆだねている記事を除外
id, title, text の3要素の揃っていない記事を除外
Wikipedia の dump ファイルの記事本文は各行の text 要素内に格納されています。
この text の中には HTML タグが残っているので削除します。一部ですが例示しておきます。
< は < で、> は > です。
正規表現を使って空文字に置き換えます。
<templatestyles src="Template:TOC limit/styles.css" />
<templatestyles src="Reflist/styles.css" />
<templatestyles src="Refbegin/styles.css" />
<templatestyles src="Div col/styles.css"/>
<templatestyles src="Template:Blockquote/styles.css" />
<templatestyles src="US Census population/styles.css"/>
<templatestyles src="Fraction/styles.css" />
<templatestyles src="Routemap/styles.css"/>
<templatestyles src="Crossreference/styles.css" />
<poem>
</poem>
<score sound="1">
<templatestyles src="Legend/styles.css" />
<templatestyles src="Col-float/styles.css" />
<templatestyles src="Template:Largest_cities/styles.css" />
<templatestyles src="Mono/styles.css" />
<templatestyles src="Template:Visible anchor/styles.css" />
<templatestyles src="Stack/styles.css"/>
<ref name="google/books=3cvYCwAAQBAJ">
</ref>
<>
<templatestyles src="Script/styles_hebrew.css" />
<chem>
</chem>
<br>
以下のような曖昧性解消のページは、スタイルシートに「Dmbox/styles.css」を使っているので、記事内に残っている HTML タグを見て、「Dmbox/styles.css」を指定しているかどうかで判別できます。
以下は Simple Enlish Wikipedia 例ですが、人名の姓・名などは別のページを参照させます。こういった場合、
記事タイトル ~ refer/refers to:
のパターンを含むので、このルールで除外判定を作れます。
{"id": "511270", "revid": "1011873", "url": "https://simple.wikipedia.org/wiki?curid=511270", "title": "Ag\u00fcero", "text": "Ag\u00fcero is a family name, it may refer to:"}
以上の処理を行なわなくても、記事 id, 記事 title, 本文 text が揃っていない記事が dump には含まれているので、その行も除外します。
以上、4つの除外規則を適用するスクリプトがこちら。
除外後の英語版 Wikpedia が17GB(約 619 万 記事)、Simple English Wikipedia が 194MB(約 23 万記事)
$ ls -lh */*_wiki.json_lines
17G en_wiki/en_wiki.json_lines
194M simple_wiki/simple_wiki.json_lines
$ wc -l */*_wiki.json_lines
6190939 en_wiki/en_wiki.json_lines
227206 simple_wiki/simple_wiki.json_lines
6418145 total
これで下準備は完了。
今の 1 行 1 json 形式だと使いづらいので、同一の title(記事名)で Simple English Wikipedia と English Wikipedia を対応付けつつ、1 つの json ファイルにまとめてみます。
スクリプトはこちら。
$ python scripts/ph_02_extract_same_title_article.py
same title seen: 195916
実行結果、約20万(195,916)記事あるとわかりました。
この記事が気に入ったらサポートをしてみませんか?