↓こちらの記事でも似たようなことをやっているようなので併せて読むと面白いかもしれません
存在していそうで存在していない漢字について
漢字にはヘンとツクリで構築されているものがあります
例えば「渚」という漢字はヘンである「氵」と, ツクリである「者」の二種類で構築されています
ヘンとツクリをランダムに選んだらどうなるでしょうか
なんか......右の文字は存在していなそうな気がしますが, 左の文字は存在していそうな気がしますね
(主観的な意見ですみません)
ヘンとツクリをテキトーに選んだとき, 「この漢字は実在していそう」と思える字とそうじゃない字があります
この「存在していそう度」を数値化しランキングを作成しました
レコメンドについて
漢字について語る前に, レコメンドについて説明します.
多くの人は「何だそれ」となると思いますが, 黙ってきいてください.
レコメンド(推薦)というのはAmazonなどででてくる「あなたへのおすすめ」のことを言います.
ユーザーの過去の履歴をもとにオススメすべきアイテムについて算出する技術となっています.
レコメンドの基本的な考え方に評価値行列というアイデアがあります.
まず初めに, 全ユーザー×全アイテムの行列を用意します.
そこから実際に閲覧されたユーザーとアイテムのペアに「1」をそれ以外に「0」をつけます.
(ちなみにこの行列はたまにしか1があらわれないスパースな行列になることが知られています)
さいごに, 機械学習などの手法を使って「0」のマスから「次に閲覧されそうなマス」を求めていきます.
BPR modelについて
「0」のマスから「次に閲覧されそうなマス」を求める手法について説明していきます.
一般には機械学習モデルをつかい, レコメンドモデルなどと呼ばれます.
今回は, このレコメンドモデルの中で一番基本的なBPR modelについて説明していきます
モデル自体は深層学習としてみるとすごく簡単です.
まず初めにユーザーとアイテムをそれぞれエンべディングして, それを内積させたのをスコアとします.
ただ, 損失関数が少し変わっており, まず初めに同一ユーザーから正例と負例それぞれの一つずつ引っ張ってきて, そのスコアを求めます.
次に
$$
\mathrm{sigmoid}(score(正例)-score(負例))
$$
を最大化させます.
感覚としては$score(正例)>score(負例)$となる確率の最大化をしているイメージです.
漢字について
評価値行列というアイデアを漢字にも適用させましょう.
漢字はヘンとツクリからなっているためヘンツクリ行列が構築できます.
まず初めに, 全ヘン×全ツクリの行列を用意します.
そこから実際に存在している漢字=(ヘンとツクリのペア)に「1」をそれ以外に「0」をつけます.
レコメンドと漢字の比較
レコメンド | 漢字 | |
---|---|---|
評価値行列 | アイテム×ユーザー | ヘン×ツクリ |
行列の要素 | 1 or 0(閲覧or未閲覧) | 1or0 (実在or非実在) |
行列の特徴 | スパース | スパース |
目的 | 閲覧されそうなアイテム×ユーザーのペアを探す | 実在しそうなヘン×ツクリのペアを探す |
ターゲット | ユーザーごとのランキングほしい | 全体でのランキングほしい |
レコメンドと存在している漢字に付いて比較してみました.
こうやって考えると, レコメンドのアルゴリズムがそのまま「存在しそうで存在しない漢字」の判別に使えそうです.
そのため, ヘン×ツクリ行列でBPRを行えば, 「存在しそうで存在しない漢字ランキング」が作れる算段です.
一点だけターゲットのところが異なっています.
これは損失関数を変えることで対応しました.
BPRでは同一ユーザーから正例負例を取り出していたのですが, 漢字の場合は全ヘン×ツクリ行列の中から正例負例を取り出します.
それにより, 全体での順位付けが可能になると期待できます.
モデル構築について
web漢和辞典からスクレイピングし, ヘンとツクリに分割でき, その両方が常用漢字に使われたことのあるものをターゲットにしました
常用漢字とはメディアなどが漢字を使うガイドラインで, 異自体/旧字体を除外するために用いました.
結果
実際の「存在しそうな漢字ランキング」はこんな感じになりました.
いえーい
なんか, ありそうな字が並んでいます.
それっぽいものができたので, ちゃんと問題ないアルゴリズムになっているんじゃないかなと思いました.
逆にスコアから「なさそうだけど, 実は存在している漢字」ランキングも作れます.
それがこちら
全体的にヘンもツクリもこってりしたものが多く漢字っぽくないのではないでしょうか.