【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

Wiktionary処理中のエラーを調査

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 FrameworkUnicode 正規化に関連して、一部結果が異なることに気付きました。

言語名に余計な文字が入っているのが原因でした。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日に修正していました。