見出し画像

英語 Wikipedia と Simple English Wikipedia の対応関係を観る(1)

Simple English Wikipedia は名前の通り、Simple な英単語と文法を使って書かれた英語版 Wikipedia です。

This is the front page of the Simple English Wikipedia. Wikipedias are places where people work together to write encyclopedias in different languages. We use Simple English words and grammar here.

https://simple.wikipedia.org/wiki/Main_Page

The Simple English Wikipedia is a Simple English Language version of Wikipedia, an online encyclopedia, written in a language that is easy to understand but is still natural and grammatical.
The articles in the Simple English Wikipedia use shorter sentences and easier words and grammar than the regular English Wikipedia. The language used here is plain English, without idioms, slang and jargon (when possible). Some articles are written only in Basic English, which is even simpler. This makes articles easier to understand and edit. If someone cannot understand an idea in the regular English Wikipedia, they can read a Simple English article.

https://simple.wikipedia.org/wiki/Simple_English_Wikipedia

この Simple な英語で書かれた Wikipedia 記事と通常の英語版 Wikipedia 記事の間の差異や一致を見ていきます。

まずはデータの取得から。クロールせずとも dump が公開されているので、今回は両方 2023/07/01 の dump を使いました。

今回は記事テキストを見比べたいだけなので、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 タグが残っているので削除します。一部ですが例示しておきます。
&lt; は  < で、&gt; は > です。
正規表現を使って空文字に置き換えます。

&lt;templatestyles src="Template:TOC limit/styles.css" /&gt;
&lt;templatestyles src="Reflist/styles.css" /&gt;
&lt;templatestyles src="Refbegin/styles.css" /&gt;
&lt;templatestyles src="Div col/styles.css"/&gt;
&lt;templatestyles src="Template:Blockquote/styles.css" /&gt;
&lt;templatestyles src="US Census population/styles.css"/&gt;
&lt;templatestyles src="Fraction/styles.css" /&gt;
&lt;templatestyles src="Routemap/styles.css"/&gt;
&lt;templatestyles src="Crossreference/styles.css" /&gt;
&lt;poem&gt;
&lt;/poem&gt;
&lt;score sound="1"&gt;
&lt;templatestyles src="Legend/styles.css" /&gt;
&lt;templatestyles src="Col-float/styles.css" /&gt;
&lt;templatestyles src="Template:Largest_cities/styles.css" /&gt;
&lt;templatestyles src="Mono/styles.css" /&gt;
&lt;templatestyles src="Template:Visible anchor/styles.css" /&gt;
&lt;templatestyles src="Stack/styles.css"/&gt;
&lt;ref name="google/books=3cvYCwAAQBAJ"&gt;
&lt;/ref&gt;
&lt;&gt;
&lt;templatestyles src="Script/styles_hebrew.css" /&gt;
&lt;chem&gt;
&lt;/chem&gt;
&lt;br&gt;

以下のような曖昧性解消のページは、スタイルシートに「Dmbox/styles.css」を使っているので、記事内に残っている HTML タグを見て、「Dmbox/styles.css」を指定しているかどうかで判別できます。

https://en.wikipedia.org/wiki/Alien

以下は Simple Enlish Wikipedia 例ですが、人名の姓・名などは別のページを参照させます。こういった場合、
記事タイトル ~ refer/refers to: 
のパターンを含むので、このルールで除外判定を作れます。

https://simple.wikipedia.org/wiki?curid=511270
{"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)記事あるとわかりました。


この記事が気に入ったらサポートをしてみませんか?