nymwa.net

トキポナで固有名詞を用いて複数の指示対象を区別する方法

自然言語では、「1, 2, 3, …」や「A, B, C, …」、「甲、乙、…」などの語を使い、複数の対象に名前を付けて区別することができます。 一方、トキポナには対象の指示に使用できる語は ona と ni しかなく、固有名詞・数詞を使用しない限り、単一の対象しか参照できません。 そのため、トキポナにはテキストに複雑な文脈・談話構造を構築するための仕組みがないということになります。

トキポナにおいて、複雑な談話構造を表現するための方法として、数詞を使うことが考えられます。 しかし、トキポナの数の表現は位取り記数法ではなく、数を並べて足し合わせることにより実現されています。 そのため、toki nanpa luka tu wan (8番目の文)などと表現することになります。 指示対象の数が増えた場合に指示のための表現が長くなるし、luka、tu、wan の組み合わせからそれがどの数か判断する必要が出てくるし、不便なように思われます。

すでに名前が付けられている対象は、固有名詞を使って指示するのが便利かなと思います。 例えば、英語と日本語を話題にする場合、toki Inli li ... . toki Nijon li ... . などと固有名詞を使えば適切に対象を区別できます。 しかし、名前が付けられていない対象は、話者が名前を付ける必要がでてきます。

自然言語においては、甲乙丙丁のような語を使い、適切に指示対象にラベル付けをして区別することができます。 トキポナにおいてもあらかじめ固有名詞を用意しておけば、このような仕組みが可能なのか考えていきたいです。

指示語として用いる固有名詞の形

甲乙丙丁のような役割を担う語は、どのような形が望ましいのでしょうか。 kijetesantakalu のように長い語や、Sanwelepusukuwinkisikokelekuwelentolopusulantasilijokokokoko のように発音しづらい語は不便かなと考えられます。 逆に、短い語でも他の語と聞き間違えやすい形は望ましくないように思います。 そこで、子音と母音からなる音節(CV)を2つ並べた、CVCV の形の4文字の語として考えることにします。

トキポナで使える子音は j k l m n p s t w の9種類、母音は a e i o u の5種類です。 ただし、ji、ti、wo、wu は音節として認められないため、CV の音節は 9×5−4=41 種類になります。 さらに、jo、ko、la、li のように、固有名詞で使用すると既存の1音節の語と紛らわしくなる音節もあります。 このような音節を含む名前は、既存の語と区別がつきにくくなる可能性があるため、使用しないことにします。 以上のものを除くと 29 種類の音節が残ります。 CVCV の名前は 292=841 通りになります。

この 841 通りの名前から、さらに以下の条件を満たすものを候補としたいと思います。

以上の操作により、候補は 266 個になります。

候補から名前を選ぶ

実際に必要となる名前は高々 10〜30 語程度かなと思います。 というのも、十干・ラテン文字程度の数があれば十分だということがあるためです。 そのため、266 個の候補から固有名詞としてふさわしいものを選別することになります。 あまり候補が多すぎたり、似た名前が多すぎたりすると、指示対象を区別するのにふさわしくなくなってしまいます。 名前が似すぎないように適切な数の名前を選択する必要があります。

条件

選別される名前は、次の2つの条件を満たすものとします。 この条件は、いろいろ試して「なんとなくこれを満たしていると全体的に整っている感じがあるな」となったものです。

1つ目は、どの2つの名前も、2か所以上の位置で同じ文字を持たないというものです。 例えば Pale と Pole は1、3、4文字目が共通するため、同時に選ぶことはできないものとします。 この条件により、選ばれた名前はどの2つも4文字中3文字以上が異なることになります。 こうすることで、1文字を聞き間違えてしまった場合でも、ほかの名前と聞き分けることができます。

2つ目は、各音節の子音について、同じ子音を持つ名前を最大3つとするというものです。 例えば、Lope、Lisa、Leno まではいいですが、Lulo は同時に選ばれません。 こうすることで、特定の音のパターンに偏っているという印象を与えない、さまざまな音の名前が選ばれるようになります。

最適化したいもの

上の条件を満たす名前の組は複数あります。 そのなかで、最も性質の良いものを選びたいと思います。 今回は、なるべくトキポナの語(nimi pu、nimi ku suli の 138 語)からなるべく名前が遠くなるような語を選ぶものとします。 というのも、実在するトキポナの語とあまり近すぎると、聞き間違えも起きやすくなるし、名前の印象が似ている語に引きずられてしまう可能性があるためです。 そこで、名前 n の既存の語からの遠さを、すべての語 w∈V との編集距離 d(n,w) の合計

f(n)=∑w∈Vd(n,w)

で測ります。

定式化

候補の集合を N とし、名前 n∈N を選ぶとき 1、選ばないとき 0 をとる変数 xn を用意します。 名前 n の i 文字目を ni と書くと、問題は次の 0-1 整数計画問題として表すことができます。

maximize∑n∈Nf(n)xnsubject to∑n∈N:ni=a,nj=bxn≤1(1≤i<j≤4, 各文字 a,b)∑n∈N:np=cxn≤3(p∈{1,3}, 各子音 c)xn∈{0,1}(n∈N)

1つ目の制約が「2か所以上で文字が共通する名前は1つまで」、2つ目の制約が「同じ子音を持つ名前は3つまで」を表しています。 最終的に残る名前の数は制約として入ってはいません。 制約を満たすように目的関数を最大化するような個数だけ残ります。

この問題を、Google OR-Tools の CP-SAT ソルバーを用いて実行します。

結果

最適解として、次の 21 個の名前が残りました。 なお、解となった名前の順番は、Wikipedia のトキポナ版記事のタイトルに出てくる名前との編集距離を元に決定しています。 その名前と距離 1 となる語が少ないものを先に、距離 1 の語の数が同じ名前の場合は、距離 2 の語の数が少ないものを先にしています。 上に来る名前ほど、既存の固有名詞らしくないと言えるはずです。 上に来る名前ほど使用される頻度が高くなるだろうということで、既存の名前を避けるように並べられる形になっています。

名前 距離 1 の語の数 距離 2 の語の数 距離 3 の語の数
1 Noso 1 65 270
2 Mewe 2 52 258
3 Juje 3 29 216
4 Lulo 3 50 242
5 Kime 4 61 279
6 Jenu 5 49 279
7 Neki 5 58 301
8 Weto 6 54 269
9 Nuwa 6 54 299
10 Lowi 6 61 282
11 Waju 6 62 258
12 Tolu 7 53 275
13 Pamo 7 70 333
14 Japa 7 94 368
15 Susu 8 61 293
16 Pope 8 65 280
17 Sipo 8 70 333
18 Teja 9 72 329
19 Mota 9 87 311
20 Tate 10 79 333
21 Wisi 11 87 312

使用例

以下のように使うことを想定しています。

jan Noso li pana e mani tawa jan Mewe. taso, jan Mewe li pana ala e ijo tawa jan Noso.

(甲は乙に金を渡した。しかし、乙は甲に何も渡さなかった。)

ona だけでは甲と乙のどちらを指示しているのか紛らわしくなってしまいます。

おわりに

本記事では、トキポナで複数の指示対象を区別するための固有名詞のリストを、整数計画問題を解くことで作成しました。 選ばれた 21 個の名前は、CVCV の形となり、互いに3文字以上が異なり、既存の語や固有名詞からも離れた形をしています。

これらの名前は実際に使用されて、ある程度話者に共有されていなければ価値が生まれません。 そうでなければ、普通の固有名詞と変わらないものになってしまいます。 実際にこのようなものがトキポナのコミュニティーに受け入れられるとはあまり思っていないのですが、「甲乙」などを使用した複雑なトキポナの文章を作成したいときに活用したいと思っています。

使用したソースコード: github.com/nymwa-works/tp-indexing