Wiktionary のダンプデータを処理しているときに出たエラーを調べます。
目次
概要
ページ内での同一言語の重複と、言語名の余分な文字を調べます。
これらはすべて2020年5月5日に同じ人が修正していました。どうやら定期的にチェックして修正しているようです。
言語の重複
Wiktionary のデータを活用するため、ダンプデータの全文を処理する方法を調べました。その際、一意性制約に反するデータが検出されました。
$ sqlite3 enwiktionary.db '.read idlang.sql' Importing 'output1.tsv'... output1.tsv:158105: INSERT failed: UNIQUE constraint failed: idlang.id, idlang.lid output1.tsv:1958539: INSERT failed: UNIQUE constraint failed: idlang.id, idlang.lid output1.tsv:6912349: INSERT failed: UNIQUE constraint failed: idlang.id, idlang.lid Importing 'output2.tsv'...
当該の行を調べます。このデータはWiktionary の ID と、独自に振った言語コードです。
$ for i in 158105 1958539 6912349; do (head -n $i output1.tsv | tail -n 1); done 64330 1 1898016 25 7597133 29
言語コードを調べます。一意性制約に反するということは、当該のページでこれらの言語が重複しているということです。
$ for i in 1 25 29; do grep ^$i$'\t' output2.tsv; done 1 English 25 Italian 29 Spanish
ページのタイトルを調べます。これは次の記事で作ったデータベースを利用します。
$ for i in 64330 1898016 7597133; do sqlite3 enwiktionary.db "select id, title from pages where id=$i"; done 64330|ordure 1898016|numerosamente 7597133|fringílido
Wiktionary のページを確認します。
これらはすべて2020年5月5日に同じ人が修正していました。
言語名の余計な文字
.NET Framework の Unicode 正規化に関連して、一部結果が異なることに気付きました。
言語名に余計な文字が入っているのが原因でした。3028 の方です。
$ grep "Gulf Arabic" output2.tsv 1216 Gulf Arabic 3028 ׂGulf Arabic
当該のページを調べます。
$ grep $'\t'3028$ output1.tsv 4841378 3028 $ sqlite3 enwiktionary.db "select id, title from pages where id=4841378" 4841378|جادة
こちらもまた、先ほどと同じ人が2020年5月5日に修正していました。