43
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

お題は不問!Qiita Engineer Festa 2023で記事投稿!

レコメンドアルゴリズムを応用して作った「存在しそうで存在しない漢字ランキング」TOP5

Posted at

↓こちらの記事でも似たようなことをやっているようなので併せて読むと面白いかもしれません

存在していそうで存在していない漢字について

漢字にはヘンとツクリで構築されているものがあります
例えば「渚」という漢字はヘンである「氵」と, ツクリである「者」の二種類で構築されています

ヘンとツクリをランダムに選んだらどうなるでしょうか

image.png

なんか......右の文字は存在していなそうな気がしますが, 左の文字は存在していそうな気がしますね
(主観的な意見ですみません)
ヘンとツクリをテキトーに選んだとき, 「この漢字は実在していそう」と思える字とそうじゃない字があります
この「存在していそう度」を数値化しランキングを作成しました

レコメンドについて

漢字について語る前に, レコメンドについて説明します.
多くの人は「何だそれ」となると思いますが, 黙ってきいてください.

レコメンド(推薦)というのはAmazonなどででてくる「あなたへのおすすめ」のことを言います.
ユーザーの過去の履歴をもとにオススメすべきアイテムについて算出する技術となっています.

image.png

レコメンドの基本的な考え方に評価値行列というアイデアがあります.
まず初めに, 全ユーザー×全アイテムの行列を用意します.
そこから実際に閲覧されたユーザーとアイテムのペアに「1」をそれ以外に「0」をつけます.
(ちなみにこの行列はたまにしか1があらわれないスパースな行列になることが知られています)
さいごに, 機械学習などの手法を使って「0」のマスから「次に閲覧されそうなマス」を求めていきます.

BPR modelについて

「0」のマスから「次に閲覧されそうなマス」を求める手法について説明していきます.
一般には機械学習モデルをつかい, レコメンドモデルなどと呼ばれます.
今回は, このレコメンドモデルの中で一番基本的なBPR modelについて説明していきます

image.png

モデル自体は深層学習としてみるとすごく簡単です.
まず初めにユーザーとアイテムをそれぞれエンべディングして, それを内積させたのをスコアとします.

image.png

ただ, 損失関数が少し変わっており, まず初めに同一ユーザーから正例と負例それぞれの一つずつ引っ張ってきて, そのスコアを求めます.
次に
$$
\mathrm{sigmoid}(score(正例)-score(負例))
$$
を最大化させます.
感覚としては$score(正例)>score(負例)$となる確率の最大化をしているイメージです.

漢字について

image.png

評価値行列というアイデアを漢字にも適用させましょう.
漢字はヘンとツクリからなっているためヘンツクリ行列が構築できます.

まず初めに, 全ヘン×全ツクリの行列を用意します.
そこから実際に存在している漢字=(ヘンとツクリのペア)に「1」をそれ以外に「0」をつけます.

レコメンドと漢字の比較

レコメンド 漢字
評価値行列 アイテム×ユーザー ヘン×ツクリ
行列の要素 1 or 0(閲覧or未閲覧) 1or0 (実在or非実在)
行列の特徴 スパース スパース
目的 閲覧されそうなアイテム×ユーザーのペアを探す 実在しそうなヘン×ツクリのペアを探す
ターゲット ユーザーごとのランキングほしい 全体でのランキングほしい

レコメンドと存在している漢字に付いて比較してみました.
こうやって考えると, レコメンドのアルゴリズムがそのまま「存在しそうで存在しない漢字」の判別に使えそうです.
そのため, ヘン×ツクリ行列でBPRを行えば, 「存在しそうで存在しない漢字ランキング」が作れる算段です.

一点だけターゲットのところが異なっています.
これは損失関数を変えることで対応しました.
BPRでは同一ユーザーから正例負例を取り出していたのですが, 漢字の場合は全ヘン×ツクリ行列の中から正例負例を取り出します.
それにより, 全体での順位付けが可能になると期待できます.

モデル構築について

web漢和辞典からスクレイピングし, ヘンとツクリに分割でき, その両方が常用漢字に使われたことのあるものをターゲットにしました
常用漢字とはメディアなどが漢字を使うガイドラインで, 異自体/旧字体を除外するために用いました.

結果

実際の「存在しそうな漢字ランキング」はこんな感じになりました.
いえーい

image.png

なんか, ありそうな字が並んでいます.
それっぽいものができたので, ちゃんと問題ないアルゴリズムになっているんじゃないかなと思いました.

逆にスコアから「なさそうだけど, 実は存在している漢字」ランキングも作れます.
それがこちら
image.png
全体的にヘンもツクリもこってりしたものが多く漢字っぽくないのではないでしょうか.

43
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
43
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?