Wiktionaryの言語コードを取得


Wiktionary のページのソースでは言語名がコードで記述されます。データの定義方法を確認します。

シリーズの記事です。

  1. Wiktionaryの効率的な処理方法を探る
  2. Wiktionaryの処理速度をF#とPythonで比較
  3. Wiktionaryの言語コードを取得 ← この記事
  4. Wiktionaryから特定の言語を抽出
  5. Wiktionaryで英語の不規則動詞を調査
  6. Wiktionaryのスクリプトをローカルで動かす

一覧表

英語は en、日本語は ja のようにコード化されます。2文字のコードは ISO-639-1、3文字のコードは ISO-639-2 と 3 に準拠しますが、それ以外の祖語や人工言語などは独自に定義されます。

ソースを見ても表は記述されていません。

==Two-letter codes==
These codes are taken from [[w:ISO 639-1|ISO 639-1]].
{{#invoke:list of languages|show|ids=1|two-letter code}}

==Three-letter codes==
These codes are taken from [[w:ISO 639-3|ISO 639-3]], a few from [[w:ISO 639-2|ISO 639-2]].

===a===
{{#invoke:list of languages|show|ids=1|three-letter code|a}}

Scribunto

#invoke は MediaWiki の Scribunto という拡張機能で、Lua で記述されたモジュールを呼び出します。

先ほどの {{#invoke:list of languages|show|ids=1|two-letter code}} は関数の呼び出しを表します。

  • モジュール: list of languages
  • 関数: show
  • 引数: ids=1, two-letter code

モジュールは Module:モジュール名 というページに記述されます。

リンク先にプログラムがあって挙動が調べられるのは面白い仕組みだと思いました。

データ

コードを見ると、次のような記述があります。

function export.count(frame)
    return require("Module:table").size(require("Module:languages/alldata"))
end

require の引数はリンクされているので確認すると、言語コードを定義しているモジュールが列挙されます。

local modules = {
    ["Module:languages/data2"] = true,
    ["Module:languages/data3/a"] = true,
    ["Module:languages/data3/b"] = true,
    (略)
    ["Module:languages/data3/z"] = true,
    ["Module:languages/datax"] = true,
}

Module:languages/data2 は2文字の言語コードを定義します。

local m = {}

m["aa"] = {
    "Afar",
    "Q27811",
    "cus",
    aliases = {"Qafar"},
    scripts = Latn,
}
(略)
return m

連想配列にデータを詰めて返します。

JSON

この手のデータは今なら JSON で定義されることが多いと思うので、試しに変換してみます。

Module:languages/data2 のコードを data2.lua として保存します。コピペでも構いませんが、以前の記事で作ったスクリプトを使えば次の通りです。

$ python mediawiki.py -o data2.lua enwiktionary.db "Module:languages/data2"

これを Lua で読み込んで JSON に変換して出力します。

conv.lua
local pretty = require "resty.prettycjson"
mw = { ustring = { char = utf8.char } }
print(pretty(require "data2"))
実行結果
$ lua conv.lua > data2.json
$ head -n 10 data2.json
{
        "oc": {
                "1": "Occitan",
                "2": "Q14185",
                "3": "roa",
                "scripts": [
                        "Latn",
                        "Hebr"
                ],
                "ancestors": [

連想配列に格納される順番は毎回変わるようで、実行するたびに data2.json の並びは変わります。

参考

luarocks --local でインストールしたライブラリへのパスは環境変数で設定しました。

export LUA_PATH="$HOME/.luarocks/share/lua/5.3/?.lua;;"
export LUA_CPATH="$HOME/.luarocks/lib/lua/5.3/?.so;;"

;; はデフォルトの検索パスです。

Lua での JSON は以下の記事を参考にしました。

JSON の整形には以下を使用しました。

日本語版

MediaWiki にはテンプレートという機能があります。{{名前}} という文字列を テンプレート:名前 というページで指示した内容に置き換えます。(タグなどを組み合わせて指示されます)

日本語版では表記揺れ対策やカテゴリー分類のために言語名はテンプレートを使う方針のようです。(方針は各言語版で異なります)

【例】 {{jpn}} → 日本語

<onlyinclude>日本語</onlyinclude>[[Category:言語表記テンプレート|{{PAGENAME}}]][[Category:ISO 639-3|{{PAGENAME}}]]

{{jpn}}<onlyinclude> タグで囲まれた「日本語」で置き換えられます。

言語名のテンプレートはカテゴリーとしてまとめられています。一覧表もあります。

Lua で処理されるモジュールのデータと連動しているわけではなく、別々に管理されているようです。

他言語版

他の言語版でも言語名にテンプレートは使われているようですが、運用方法は各言語版の裁量に任されているらしく、テンプレート名などは統一されていないようです。

それらのデータを使いたい場合は、個別に実態を調査する必要があります。