Migdal

佐藤陽花 CL-KIITA: 人工言語知識情報・情報技術事業体 へ執筆

投稿 • に更新

TP に関する思案 (第二ラウンド)

昨年、 TP に関する思案をしていたが、本日 Ziphil(@ziphil) 氏のシャレイア語配信のさなか TP の話題が出たこともあり、改めて TP に関する思案をする流れとなった。

(昨年の思案については下記記事を参照。)

この思案のさなかで、Ziphil( @ziphil ) 氏やA.I.( @a_i )氏の助力のもと、CTWI(常用トキポナ語数計度)についてまとまった成果を得たので説明していく。

TP とは

そもそもTPとは何か、ということだが、昨年の記事でも説明しているので、ここではざっと概略を示すだけにとどめて、詳細は昨年の記事や「人工言語学Wiki」(「Migdal Conlang Wiki」に統合・移行予定)の記事を参照されたい。

TPとは、モヤ氏が提案した計算が容易かつ感覚的に測りやすい語彙数の尺度である。また、語彙数を議題とした話し合いでも用いられる。

(人工言語学Wiki/TP_(単位))

定義

名称:TWI トキポナ語数計度 Toki-Pona Word-Count Index
単位記号:tp
計算式: TWI=Word/120 \text{TWI} = \text{Word} / 120
解説:従来「TP値」と呼ばれていた、語数を(トキポナの語数である)120で割った指標である。計算式が単純な反面、関数が単調増加であって、小さい語数や大きい語数、すなわちトキポナの語数120から離れた語数だと数値が直感的でなくやや使いづらいという問題がある。

名称:CTWI 常用トキポナ語数計度 Common Toki-Pona Word-Count Index
単位記号:ctp
計算式: CTWI=120log120(TWI)+120=120log120(Word) \text{CTWI} = 120 \log_{120}{(\text{TWI})} + 120 = 120 \log_{120}{(\text{Word})}
解説:従来log TPと呼ばれていた(「PTP」とも呼ばれていた)常用対数値に改訂を加えたものである。ただ、今回の思案で対数の底を10から120に変えたので常用対数値ではなくなったが、変わらず常用トキポナ語数計度と呼ぶことにするので、注意されたい1

計算値

主要な語数で計算してみた結果が以下である。

言語 語数 TWI CTWI
基数 1[word] 0.008[tp] 0[ctp]
二進数 2[word] 0.017[tp] 17.374[ctp]
120[word] 1[tp] 120[ctp]
常用 250[word] 2.083[tp] 138.397[ctp]
トキポナ 750[word] 6.25[tp] 165.934[ctp]
オエル語 900[word] 7.5[tp] 170.504[ctp]
ロジバン 1200[word] 10[tp] 177.715[ctp]
実用可 2500[word] 20.833[tp] 196.112[ctp]
シャレイア語 2860[word] 23.833[tp] 199.484[ctp]
低学歴N 5000[word] 41.667[tp] 213.486[ctp]
高学歴N 10000[word] 83.333[tp] 230.86[ctp]
アルカ 12000[word] 100[tp] 235.43[ctp]
著名作品 20000[word] 166.667[tp] 248.234[ctp]
自然言語 120000[word] 1000[tp] 293.145[ctp]
英語 500000[word] 4166.667[tp] 328.916[ctp]

思案過程

CTWIの乗算・加算の定数が主要な思案内容であった。

Ziphil(@ziphil) 氏もこう述べるとおり、対数をとった結果の負の値の処理に悩んでおり、加算をしようということになった。

120語未満で負の数が出てくるのがちょっと気持ち悪いので、定数を加算して調整したい気持ちもある。

このとき乗算の定数が100で固まろうとしていたこともあり(経緯は前回記事の検討節を参照)、最小値である(単語数1のときの)-207.92を0以上にするキリの良い数ということで300加算にしようかなどと考えあぐねていた。

負の単語数はないと思うので、0の時に0になってくれるとうれしいかもですね

A.I.( @a_i )氏のこの提案により、思い切って底を10から120に変えることにした。こうすることで、乗算・加算したときに1語と120語のときにキリが良くなる(華氏温度のように)のである。

この後、A.I.( @a_i )氏のこの提案により、1語のとき0に、120語のとき120なるように乗算・加算定数を決めることになった。

120語の時に120にするとか?

これにより、結果として冒頭のこの計算式に至ることになった。

CTWI=120log120(TWI)+120=120log120(Word/120)+120 \text{CTWI} = 120 \log_{120}{(\text{TWI})} + 120 = 120 \log_{120}{(\text{Word}/120)} + 120

試算

この思案(ラウンド2)においても、例に漏れることなくDartプログラムによる試算のお世話になった。ここに用いたプログラムを掲げる。


import "dart:math";
import "package:intl/intl.dart";
void main(){
  NumberFormat f = NumberFormat("###0.###", "en_US");
  Map<String, int> tab = <String, int>{}
      .put("基数", 1)
      .put("二進数", 2)
      .put("核", 120)
      .put("常用", 250)
      .put("トキポナ", 750)
      .put("オエル語", 900)
      .put("ロジバン", 1200)
      .put("実用可", 2500)
      .put("シャレイア語", 2860)
      .put("低学歴N", 5000)
      .put("高学歴N", 10000)
      .put("アルカ", 12000)
      .put("著名作品", 20000)
      .put("自然言語", 120000)
      .put("英語", 500000);
 String res = pTestTWDsTable(tab,f,TableOutput.normal);
  print(res);
}
double flog(num x, [num? ladix]) {
  if (ladix == null) {
    return log(x);
  } else {
    return log(x) / log(ladix);
  }
}

//Common Log
double clog(num x) {
  return flog(x, 10);
}
String pTestTWDsTable(Map<String, int> tab, NumberFormat f, TableOutput to){
  String mdLab = "| 言語 | 語数 | TWI | CTWI |\n| --- | --- | --- | --- |\n";
  switch(to){
    case TableOutput.normal:
      return tab.map((String lab, int data)=>MapEntry(lab,pTestTWDs(lab,data, f,to))).values.join("\n");
    case TableOutput.md:
      return mdLab + tab.map((String lab, int data)=>MapEntry(lab,pTestTWDs(lab,data, f,to))).values.join("\n");
  }
}
String pTestTWDs(String label, int word, NumberFormat f, TableOutput to){
  switch(to){
    case TableOutput.normal:
      return "$label: $word[word], ${f.format(calcTWD(word))}[tp], ${f.format(calcCTWD(word))}[ctp]";
    case TableOutput.md:
      return "| $label | $word[word] | ${f.format(calcTWD(word))}[tp] | ${f.format(calcCTWD(word))}[ctp] |";
  }

}
double calcTWD(int word)=>word/120;
double calcCTWD(int word)=>flog(calcTWD(word),120)*120+120;
extension MapCtl<K, V> on Map<K, V> {
  Map<K, V> put(K key, V value) {
    this.putIfAbsent(key, () => value);
    return this;
  }
}
enum TableOutput{
  normal,
  md,
}
Enter fullscreen mode Exit fullscreen mode

log120x=log10xlog101200.48096log10x \log_{120}{x} = \frac{\log_{10}{x}}{\log_{10}{120}} ≒ 0.48096 \log_{10} {x}

  1. これについてであるが、対数の底の変換を上のように行うことにより引き続き常用対数であるものと考えることができる。 

人気順のコメント(14)

Collapse
 
ziphil profile image
Ziphineko / Ziphil 🐱🐰

次の ZpDIC アップデートで試験的に ctp 値を表示するようにしてみます。
120log120W120+120120 \log_{120} \dfrac{W}{120} + 120 って 120log120W120 \log_{120} W に等しいので、定義式はこっちの方が良いかも。

( log120x=log10xlog101200.48096log10x\log_{120} x = \dfrac{\log_{10} x}{\log_{10} 120} \fallingdotseq 0.48096 \log_{10} x を利用して「常用」だと言い張る)

Collapse
 
halka_ffez profile image
佐藤陽花

おお。ブラッシュアップありがとうございます!反映しておきます

Collapse
 
xirdim profile image
Xirdim

CTWI、序盤で急激にゆっくりになるのはちょっと悲しい (?)
(1 語 → 2 語では 17.37 も上がるのに、語数が 2 桁台に入る頃には上がり幅が 3 にも満たなくなるので)

単語数 (語) CTWI (CTP)
+0 -∞
1 0.00
2 17.37
3 27.54
4 34.75
5 40.34
6 44.91
7 48.77
8 52.12
9 55.07
10 57.72
Collapse
 
halka_ffez profile image
佐藤陽花

@ziphil @a_i どう思います?

Collapse
 
ziphil profile image
Ziphineko / Ziphil 🐱🐰 • Edited

おかゆさんが √(eγ W) log(eγ W) を提案してて、初期に伸びすぎる点と後で全然伸びない点を結構直感に沿う形で改善してるので、結構良いんじゃないかなと思ってます。
zenn.dev/pokapoka_jigoku/scraps/f0...

Collapse
 
a_i profile image
A.I.

対数と人生はそういうもの(いいえ)

Collapse
 
xirdim profile image
Xirdim

性質としては望ましいように見えますね(たんに造語序盤でちょっと悲しいねって言いたかっただけ)

Thread Thread
 
halka_ffez profile image
佐藤陽花

それならもうちょい後ろに押してskewさせた版(仮称STWI; Skewed-Common TWI)作る?

Collapse
 
halka_ffez profile image
佐藤陽花

グラフ描いてみたけど、挙動的にも満たしたい性質からして妥当だと思うのだが。

全体:0-300
拡大:0-20

Collapse
 
halka_ffez profile image
佐藤陽花

うーむ、どうだろう?

Collapse
 
xirdim profile image
Xirdim

そういえば、「常用トキポナ語数計度」、名前は変えたほうが良いかと思はれ

時期によって数値の意味が変わるとあまり良くないと思うので

Collapse
 
halka_ffez profile image
佐藤陽花

旧定義時代に常用のを使っている人は殆ど皆無だったしそんなに影響ないと思われ

Collapse
 
xirdim profile image
Xirdim

←人工言語学 Wiki で存在は知ってたんだけどね

Collapse
 
a_i profile image
A.I.

シャレイア語、2620語強でしたね
一桁しか合ってなくてすみません/(^o^)\