star-code.net

漢字類似度計算機「漢数電卓」を作った

はじめに

次の表はある漢字との類似度が高い漢字を順に並べたものです(ある漢字そのものはランキングから当然除外しています). その漢字とは何でしょう?

クイズだけ出しておしまいにしたいのですが,開発した内容について書きたいので,さっさと答えを明かしてしまいたい.どうしよう.

考えたい人のために,答えが見えないように無駄話を書いてスペースを埋めます.

無駄話 1

このセクションは本当に読む必要がないです.答えと書かれたところまで飛ぶと良いですよ!

空間を開けるために改行で埋めておしまいにしようと思ったんですよ,おしまいにしようと思ったのですが上手くいかなかったのですね.

この記事は Markdown で書いています.Markdown 上でいくら改行を連打しても表示上では 1 行分しか開きません. 通常の Markdown なら <br /> をいっぱい書けば良いのですが,そういうわけにいかない事情がありまして.

この記事に少し詳細を書いていますが. Markdown を ReactMarkdown を用いて変換することで今みなさんが見ている記事が作られています. その時に HTML タグはエスケープされてただの文字列になってしまいます.<br /> と書いてみても,ほら改行されませんね.XSS(クロスサイトスクリプティング)を防いでくれています.とってもうれしい!

いや,自分しか記事書かないのですけどね.悪意のあるスクリプトが書かれた Markdown を変換する予定はないです.不特定多数からの Markdown の投稿を受け付けているわけじゃないし. 自分のサイトで XSS って別に XSS じゃないじゃん.ただの悪意を持ったサイトじゃないですか.悪意があるならそういう方法を取る必要は全く無く直接的にやりますよ.

悪意ねえ,何ができるのでしょう.DDoS 攻撃の踏み台とか.あとは仮想通貨掘ったりはできますよね(こっちは悪意かというとそうでもないかも).昔事件になっていましたね,結局無罪になっていたと記憶していますCoinhive事件 - Wikipedia

皆さんの PC を使ってマイニングをする気は現状ないです.このサイトを収益化する気も現状ないです. 当サイトのサーバー代やドメイン代は私のお財布から出ています.全てを私のお財布が支えているので.広告もありません.街の中もインターネットも広告まみれなので,こういう場所がたまにはあっても良いのではないでしょうか.広告というシステム自体は素晴らしいものだと思いつつも,注意や時間は奪われたくないものです.

支援は特に受け付けていないのですが,どうしても私の Web サイトに感動して支援がしたいのであれば何らかの方法で直接コンタクトを取ってきてください.連絡先は About に書いてあります. 書いてある連絡先でも見ていないことがあるので複数から連絡をいただけるとうれしいです.メールなら割といつも見ている,はず.

何の話だっけ.XSS が防がれているけど自分のサイトだから意味ないよねって話ね. 多分 XSS を防がない設定とかがある気がします.あんまり困っていないのでこのままでも別に良いかという気持ちでもあり.

そろそろいいかな.戻ろう.

ヒント

堺,旭,津,蕨,呉の共通点は?

そして,これらの共通点に当てはまらなさそうな漢字の共通点は?

無駄話 2

答えを書くつもりがヒントを出してしまった!ということは答えまでにまた何かを書く必要があるということか?

このセクションも無駄な話なので読まなくて良いです.

何の話を書こうかな,人生を豊かに生きる方法とか. 自己啓発的なやつですか?そうかも.自己啓発書は文字大きいし空白大きいのでそれだけですごく勿体無い感じがします. オライリーが自己啓発書出したりしませんかね?

なんと言うか,人生の攻略本って欲しいですよ.人間というものはどういう考えでどういう振る舞いをするので,それにどう合わせると良いか悪いかとか. どう生きると豊かであるとか,幸せであるとか.当然人それぞれではあるのですが,ある程度共通するところはあるのでは.

健常者エミュレータ事例集が求めているものに近いかな.でもこれは事例集なので体系化できないのでしょうか. このサイトの思想はわかるし共感する部分も多分にある.ただ,それでも,自分を曲げるのってあまりに苦しいよ,たとえエミュレーションであっても.迎合するよりハックしたい所存.

何の話だっけ,豊かさね.ここでひとつ,人生を豊かにする方法としていて私が実践している方法を紹介しておきます.

日記を書くと良いです.

私は最初の頃は Google ドキュメントに書いていたのですが,大学ノートに切り替えて今は手書きで毎日書いています.漢字の練習にもなって良いです.

後から見返したりはしないのですが,その日やったことの振り返りとして優秀です. 今日は何ができて,何ができなかったか.明日は何をしたいか. あった出来事に対して自分がどう思ったかを書いています.ただの出来事の羅列はなるべく避けています.あくまで自分がどう思ったか.

計るだけのダイエットというのが存在したはずで,これは毎日体重を記録することで意識が向くので自然と痩せるという話だったはずです. これと同じ効果を狙っています.

その日を振り返ると,一日充実していたかどうかがわかります. 今日,何もしなかったな,と思うと,明日はもっと充実させよう,とか.日記に書けるようなことをやろう,とかいう思いが湧いてきます.少なくとも自分の場合は.

加えて,明日何をしたいかを書いています.これはそれなりに大事なことだと思っています. それを達成するように動くようになるからです.自分をある程度縛って,先に進める力にもなります.

毎日書くといいですよ!振り返るって大事.

さて,そろそろ答えの発表に移ります.

答え

答え:

柏(かしわ)でした.

堺,旭,津,蕨,呉は後ろに「市」をつけると日本にある市の名前になります.柏市というのも千葉県の北西部に存在しています. 栄もおそらく地名つながりでしょう.

林,柳,槻,橘あたりは植物,樹木繋がりでしょう.

葛はどちらもありそう.植物繋がりとしても,地名の葛飾としても, 葛飾といえば東京都の葛飾区がイメージされがちですが,葛飾は広域地名でして,柏市もその範疇です.今でも東葛地域とか言われたり.その繋がりもあるかも.

葉は植物繋がりと思いつつ,柏って千県なのですよね.

地名要素と植物要素が混ざってしまっています.ここで,植物要素だけを抜き出したいです. ということで,以下のような計算をやってみます.

柏 - (堺 + 旭 + 津) / 3

この計算結果に対して類似度が高い方から並べると,以下のようになりました.

結構地名感が薄れて植物感が強まった感じがあります.計算式に入れていませんが,蕨も呉も栄も消えました.面白い.

こうした演算ができる Web アプリを作りました.名を「漢数電卓」としています.こちらから.

技術要素

fastText というものを使っています.前回の記事と中身は一緒です.

漢字をベクトル化して,計算しています.四則演算に対応しています.+-*/() に対応.あと小数も使えます. コサイン類似度を計算しているので,最後に全体に係数をかける必要はありません.

また,漢字のベクトルは正規化しているので大きさについて気にかける必要はあまりないはずです(データセットを読み込んだところで正規化しています.配布しているデータでは正規化されていないことにご注意ください).

データ

このリストは,こちらの記事にまとめられていた一覧を加工しました.

Grave, E., Bojanowski, P., Gupta, P., Joulin, A., & Mikolov, T. (2018). Learning Word Vectors for 157 Languages. Proceedings of the International Conference on Language Resources and Evaluation (LREC 2018)

この意味ベクトルは CC BY-SA 3.0 の下で公開しています.

あそびかた

いろんな遊び方が考えられると思います.漢字 1 文字を入れると先ほどのようにクイズにもできる.

答えは最後に載せておきます.

仏-(英+独)/2 でヨーロッパ成分を消して仏教っぽい漢字を取り出すとか.

燕-(秦+呉+漢)/3 で,歴史上の王朝名の成分を打ち消し,純粋な鳥としての燕を取り出すとか.

魚+強-弱 で強そうな魚を取り出すとか(これ微妙だったり).

色々遊べるはず.私も遊び方を考えます.

おわりに

語彙を絞らないとフロントエンドで動作する形にならないよなあと考えた結果,漢字 1 文字に絞ることでいい感じのおもちゃになりました.

漢字同士の類似度というとその漢字の持つ意味に引っ張られがちです.ですが,コンピュータは文章からベクトルを作っているので,その使われ方にフォーカスされています.ここが面白くて非直感的でもあるところ.

例えば「水」を入れた時の類似漢字は?とすると「川」「海」「雨」「滴」とかが思い浮かびますが,実際は曜日(土,火,木,日,金,月)がずらりと並びます.納得感はありますが人間はそうは並べないよね.

こちらから遊べます.単語のベクトル化って,面白い.

実はスカラーの計算もできます.ただの電卓として使えなくもない.

先ほどの答え:鷹