Skip to content

Instantly share code, notes, and snippets.

@sozysozbot
Last active December 20, 2017 20:54
Show Gist options
  • Save sozysozbot/ff7eba813726373ee202b2039cc1f9b9 to your computer and use it in GitHub Desktop.
Save sozysozbot/ff7eba813726373ee202b2039cc1f9b9 to your computer and use it in GitHub Desktop.
http://journals.sagepub.com/doi/pdf/10.1177/016555159402000208 が引用している http://aapt.scitation.org/doi/pdf/10.1119/1.16476
によると、中国語の字ごとの頻度は$P(n) = \frac{A \exp(-an)}{n^b}$で近似できるらしい。なお、Aが0.0158、aが0.00166、bが0.429である。それぞれのパラメータの意味を考えてみよう。
とりあえず、Aは登場頻度第一位の字の頻度を表すということでいいだろう。対数・対数グラフを見る限り、ある程度までは直線に伸びるものの、途中から一気に抑制されて下にガクンと落ちている。まあ要するに文字の種類に上限があるから発生しているわけだが。
log-logを取って、$\log n = x$とおけば、 $\log(P(n)) = \log A -bx -ae^x$。なるほど、途中までは直線だけど途中から一気に落ちる挙動に合致しているな。
基本多言語面には漢字が2万900字ぐらいあるらしい。広韻も2万5000字だし、そんなもんだろう。じゃあとりあえず$\log(P(20000)) = -41.59$…っと、これだと精度が出ないな。半減させるか。-24.7…あ、そうか、$\log(P(n))$はnが大きければnにだいたい線形か。ということは、基本多言語面ぐらいの網羅性のあるデータベースの文字種数を$N$とすれば、$\log(P(N))$が-35~50ぐらいになるようにすればよいかな。うーん
よく考えたら基本多言語面のサイズは二進数の制約によるものだった。考察し直そう
$a$で上から抑えられる様子を知りたいなら、$\log A -bx $と$-ae^x$のオーダーが同じぐらいになる$x$を求めればいいか。等しくなるのはなるほど、$n\approx 4700$のとき。Big5の「常用字」が$8800 \approx 2n$ぐらいあって、「次常用字」が$12437 \approx 2.5n$。漢辞海の登録字数が12500なので、まあそういう感じか。とりあえずこの時の$n$を「特性パラメータ$N_0$(てきとう)」とでも呼ぶことにしよう。字数の次元を持つので扱いやすい。
えっと、$n$が小さい時の挙動を管理するのが$b$で、大きい時の挙動を管理するのが$a$だよな。$a$については「特性パラメータ」から出せるとして、$b$について考えていこう。とりあえず、累積頻度が50%になるような$n$を求めよう。というか、これは$A$と$b$との間の束縛にもなるよな。最初の100字で100%取るわけにも行かないわけで。
中国語の例から察するに、$n$が小さい時は$a$の項はほぼ影響を与えないので、$\frac{0.5}{A} = \sum_{n=1}^{n_0} {n^{-b}}$ぐらいの$n_0$で、$\sqrt{N_0}$の数倍ぐらいに収まる感じ。$1 +\int_1^{n_0} x^{-b}dx > \sum_{n=1}^{n_0} {n^{-b}} > \int_1^{n_0+1} x^{-b}dx$なので$1+\frac{n_0^{1-b} - 1}{1-b} > \frac{0.5}{A} > \frac{(n_0+1)^{1-b} - 1}{1-b} $、つまり$ \frac{1-b}{2A}+1 > (n_0+1)^{1-b} $と${n_0^{1-b} } > \frac{1-b}{2A}+b $で、当てはめると$174.7 > n_0+1$かつ$165.6 < n_0$…あれ?209~210のはずでは?
あ、そうか、aの項が効いてくるのか。実際aの項を抜くとちゃんと169~170あたりになる。じゃあ$\left(\frac{1-b}{2A}+1\right)^{\frac{1}{1-b}}$を$n_0$と定義するか。
さて、一応英語に当てはめてみてsanity checkをするか。えっと$A=0.003672, a=0.26628, b=-0.914702$。えっ$b$が負?まあいいか。$n_0$は18。はい全く合わない。まあサンプル数小さいから近似だと合わないこともあるか。
と思ったらlogとlnを間違えてた。やり直し。
https://www.desmos.com/calculator/ruygjwva66
$n_0=3.64$か、ええやん。
とはいえ、logでregressionやってるから1位で差が出るな。実データでregressionやるか。
https://www.desmos.com/calculator/pax90wt2xm
$A=0.130112, a=0.104224, b=0.047574$。ちゃんと$b$が正になりますな。$n_0$は$5.032$。完璧では。$N_0$は$20.94$。よさそう。それをlogで載せたものがhttps://www.desmos.com/calculator/uoedhziuee
$N_0$、Excelで計算するの面倒なので$\log A =-ae^x$の解で近似しようかな。要するに$-\frac{\log A}{a}$。$N_0'$と呼ぼう。中国語の場合$2498.6$、英語の場合$19.57$。なるほど、それっぽい。
英「単語」、つまり元祖Zipfの場合はどうなんだろう。$b$は$1$とか$1.08$とか言われてて、$A$がtheの頻度だから$0.07$。$a$は$0$ですな。すると、$N_0' = \infty$。なるほど、英単語の数には上限がないもんな。$n_0$は$\left(\frac{1-b}{2A}+1\right)^{\frac{1}{1-b}}$なので、$b=1$なら$e^\frac{1}{2A} \approx 1265$、ふむふむ、$b=1.08$なら$39784$…んー待て待て
近似の精度が悪いので級数で出しましょう。$b=1$なら709~710、$b=1.08$なら10937~10938…あ、そんなもんか。
Top25が約1/3でTop100が約半分を占めるらしいし、200位とかの頻度を見ても$b=1$なら$A=0.089$ぐらいの方がいい値が出るっぽい。この時は$e^\frac{1}{2A} \approx 275.3$。うむうむ。
さて、パイグの場合に応用していきたいですね。
と、その前に、コーパスがそれなりにあるリパライン語でやってみた。https://www.desmos.com/calculator/amsfjc9vkv
$A=0.132395, a=0.126906, b=-0.0285322$とのこと。$n_0=4.674$、$N_0=15.93278017$、ふむふむ。
いせにほが2話足されたので再計算。
https://www.desmos.com/calculator/apeun1jm1d
https://www.desmos.com/calculator/l2erscchxl
$A=0.132402, a=0.126852, b=-0.028245$。まあそりゃ大きく変わるはずもなく。
ひらがなはどうだろう。https://www.desmos.com/calculator/fmvxrgyjqi
$A=0.0683862, a=0.0317206, b=0.244582$
$n_0=11.97172777, N_0'=84.56915156$。ふむ。
さて、なんだかんだパイグコーパスが500字弱溜まったので、解析していきましょう。1とか2ばっかりだけど、この尻尾の長さがきれいに曲線に載ってくれると信じて。
https://www.desmos.com/calculator/f7cftvmucw
$A=0.0576315, a=0.0298948, b=0.235507$
なるほど、きれいに載った。
lambert w
https://www.desmos.com/calculator/nzvvbs7to3
chinese
https://www.desmos.com/calculator/bgog5fehs9
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment