
2026/02/19 4:25
Semantle 用ソルバー
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
改善された要約
SemantleはWordleスタイルのパズルで、各推測に対して、推測した単語のGoogle News word2vec埋め込み(300次元)と見えないターゲット単語とのコサイン類似度をスコアとして与えます。返ってくるのは1つの実数値のみなので、人間は多くの推測を通じて三角測量的に解き明かさなければなりません。理論上、正確なターゲット埋め込みを求めるには約300個の独立した方程式が必要です。
Ethan Jantzと著者によって開発されたソルバーは、この課題に単純なフィルタリングアルゴリズムで対処します。GoogleNews‑vectors‑negative300語彙から約300万語を起点として、各ラウンドでランダムに候補語を選び、Semantleにその類似度を問い合わせます。そして計算されたコサイン類似度がスコアと0.0001以内で一致する候補だけを保持します。わずか1〜2回の推測後に候補集合は劇的に縮小し(例:~300万語 → ~300語 → 3語 → 1語)、平均して約3回の推測で勝利でき、人間が必要とするより遥かに少ない試行回数となります。
この成功はコサイン類似度の疎性に依存しています。ランダムな推測に対して、特定の類似度を持つ語はほんのわずかなものです。ランダム選択でも優れた結果が得られますが、より戦略的に候補を選ぶことで推測回数をさらに減らせる可能性があります。このアプローチは、意味検索ゲームを効率的に自動化できることを示しており、将来のワードゲーム設計や類似度フィードバックに依存するNLPツールへの応用が期待されます。
本文
Semantle は、語彙的な類似度ではなく意味的な類似度で推測を評価する Wordle スタイルのゲームです。
以下に、ゲームの仕組みと約3回の推測で確実に答えを見つけるシンプルな解法についてまとめます。
ゲームから得られる情報は何か?
- Semantle は単語埋め込み(Google News の word2vec、300 次元ベクトル)を使用しています。
- 各推測に対して、推測語の埋め込み g とターゲット語の埋め込み t とのコサイン類似度が返されます。
[ \text{similarity}=\cos(\theta)=\frac{\mathbf g !\cdot! \mathbf t}{\lVert \mathbf g\rVert,\lVert \mathbf t\rVert} ]
埋め込みを正規化していれば、これは単に内積です。
類似度スコアは「温かい」か「冷たい」かを示すだけで、どの方向へ進むべきかは教えてくれません。
ターゲット埋め込みを直接求めることが非現実的な理由
- 1 回の推測は 300 次元未知数(t の成分)に対する 1 本の線形方程式です。
- t を回復するには、少なくとも 300 個以上の独立した推測が必要であり、通常のゲームではそれより遥かに多くなります。
したがって、コサイン類似度の幾何学的性質を利用します。
幾何学的直感
返された類似度は単位球面上にリング(同じ角度になる点全体)を定義します。
つまり各推測は「非常に強力なフィルタ」であり、報告された値と一致する類似度しか持つことのできない語だけが残ります。
削除型ソルバー
- 候補語のリストを初期化(全語彙または制限セット)。
- 候補語が 1 つになるまで繰り返す:
- 現在の候補からランダムに単語を選び推測する。
- Semantle にその類似度を問い合わせる。
- 選択した推測語と残った全候補語との類似度を計算。
- 報告されたスコア(許容誤差 0.0001 等)と一致する語だけを残す。
アルゴリズムはシンプルですが、各フィルタが候補セットを劇的に縮小させるため効果的です。
while len(potential_words) > 1: # step 1: make a guess g = random.choice(potential_words) # step 2: ask Semantle for score s_target = get_similarity_from_game(g) # step 3: similarity from g to every remaining candidate distances = word_vectors.distances(g, other_words=potential_words) similarities = 1.0 - distances # cosine similarity # step 4: keep only words w such that sim(g,w) matches s_target temp_potential_words = [] for i, w in enumerate(potential_words): if abs(similarities[i] - s_target) < tolerance: temp_potential_words.append(w) potential_words = temp_potential_words # one word left answer = potential_words[0]
なぜ高速に機能するのか
埋め込み空間は 300 次元ですが、語彙はスパースです。
1 回のコサイン類似度制約で可能な語の大部分を除外できるため、実際には推測 1~2 回で候補数が数個にまで減少します。
サンプル実行(許容誤差 = 0.0001)
| 推測 | コサイン類似度 | 探索した語彙 → 残存 |
|---|---|---|
| countryside | 0.023168 | 3 000 000 → 3 296 |
| levelization | 0.097055 | 3 296 → 3 |
| Skrzynski | 0.005881 | 3 → 1 |
答え: medical
人間 vs ソルバー
人間は「勾配降下」のように類似度を少しずつ上げる方向へ推測を進めます。
一方ソルバーは制約を正確に満たす大きなジャンプで、各ステップごとに不可能な語を大量に除外します。
両者とも異なる手段で最終的に同じターゲットへ到達しますが、前者は意味の流れを辿り、後者は幾何学的空間を切り分けていきます。