Model2Vec

Model2Vecによる日本語辞書(静的ベクトルモデル)の作成と、テキストの埋め込み・検索を行う。日本語の場合、多言語対応の小型Sentence Transformerモデルである intfloat/multilingual-e5-small などを元モデル(ソース)に指定するのが最も確実で高精度。

# [distill] オプションを付けて、辞書作成に必要な関連ライブラリをまとめてインストール
!pip install "model2vec[distill]"

次に、既存の多言語モデルから日本語のボキャブラリーを抽出し、圧縮・重み付けを行ってルックアップテーブル(辞書)を作成する。

なお、Model2Vecの開発初期(バージョン 0.2.0 付近)では、辞書を作る際に「ジップの法則を使って単語の重みを調整するかどうか」を、人間がわざわざ apply_zipf=True と手動で指定する必要があった。しかし、2024年の後半から2025年にかけて実施された、その後のアップデートによってシステムが賢くなり、「わざわざ人間が指定しなくても、内部で自動的かつ強制的に最適な重み付け(ZipfやSIFなどの高度な処理)を行う仕様」に統合された。

from model2vec.distill import distill

# 1. 蒸留元(ソース)となるトランスフォーマーモデルを指定
source_model_name = "intfloat/multilingual-e5-small"

print("Model2Vecの辞書を作成中...")

# 2. 蒸留の実行
static_model = distill(
model_name=source_model_name,
pca_dims=256 # ベクトルの次元数を256に圧縮
)

print("辞書の作成が完了しました!")

# 3. 作成した辞書モデルをローカル(Colab内)に保存
static_model.save_pretrained("my_japanese_model2vec")
print("モデルを 'my_japanese_model2vec' フォルダに保存しました。")

これで、作成された my_japanese_model2vec フォルダの中には、「単語とそのベクトルが書き込まれた表(辞書データ)」 が保存されている。フォルダには、model.safetensors, tokenizer.json, config.json, modules.json, README.md が保存されている。model.safetensorsは、語とベクトル(256個の数値の配列)からなる「辞書データ」の本体。tokenizer.jsonは、入力された日本語の文章を、辞書(model.safetensors)が理解できる「単語のID(数字)」に切り分けるためのルールブック。config.jsonは、プログラムがこのモデルを読み込む際に、「どうやって扱えばいいか」を伝える設定ファイル。modules.jsonは、Sentence Transformerの規格において、「どんな順番で計算のパーツ(モジュール)を組み合わせるか」が書かれた指示書。README.mdは、Model2Vecによって自動生成されたもので、モデルの使い方やベースとなったソースモデルの情報などが英語で記載されている。これをそのまま Hugging Face にアップロードすると、Webサイト上で見栄えの良いモデル紹介ページ(モデルカード)が自動で作られる。

そして、ここからは、重いダウンロードや複雑な変換処理は一切必要ない。このフォルダを読み込むだけで、いつでも、どこでも、CPUだけで超高速にテキストをベクトル化できる。

保存した辞書モデルを読み込んで使う手順は次の通り。

from model2vec import StaticModel
# 1. 保存した「my_japanese_model2vec」フォルダから辞書を直接読み込む
# 💡 以降はネットからのダウンロードや蒸留の計算は発生せず、一瞬で読み込める
model = StaticModel.from_pretrained("my_japanese_model2vec")

print("独自に作成した日本語辞書の読み込みが完了しました!")

# 2. ベクトル化したい日本語テキストを用意する
sentences = [
"美味しいリンゴを食べた。",
"最新のスマートフォンを購入した。",
"人工知能の技術について勉強しています。"
]

# 3. テキストをベクトルに変換(ルックアップテーブルを引いて平均するだけ)
embeddings = model.encode(sentences)

# 4. 結果の確認
print(f"\n入力文の数: {len(sentences)}")
print(f"ベクトルの形状(文の数, 次元数): {embeddings.shape}")
print(f"1文目のベクトル(最初の5要素): {embeddings[0][:5]}...")
print(f"2文目のベクトル(最初の5要素): {embeddings[1][:5]}...")

アウトプットは、

独自に作成した日本語辞書の読み込みが完了しました!

入力文の数: 3
ベクトルの形状(文の数, 次元数): (3, 256)
1文目のベクトル(最初の5要素): [ 0.2283 0.4082 0.04398 -0.1506 0.01637]...
2文目のベクトル(最初の5要素): [ 0.06647 0.328 -0.2834 -0.1576 -0.003538]...

続いて、類似度を計算する。

import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

# 検索対象(データベース)の定義
documents = [
"東京でおすすめの美味しいラーメン屋を探しています。",
"Pythonを用いた機械学習モデルの構築方法について説明します。",
"Appleの新型iPhoneのスペックと価格情報まとめ。",
"富士山に登山するときの注意点と必要な装備。"
]

# 1. ドキュメントと検索クエリをベクトル化(一瞬で終わります)
doc_embeddings = model.encode(documents)
query = "AIやディープラーニングのプログラミング"
query_embedding = model.encode([query])

# 2. コサイン類似度を計算し、平坦化してインデックスエラーを修正
similarities = cosine_similarity(query_embedding, doc_embeddings).flatten()

# 3. 類似度が高い順に並び替え
top_indices = np.argsort(similarities)[::-1]

# 4. 結果の出力
print(f"🔍 検索クエリ:「{query}」")
print("--- 検索結果(意味が近い順) ---")
for i, idx in enumerate(top_indices):
print(f"{i+1}位: [類似度: {similarities[idx]:.4f}] {documents[idx]}")

アウトプットは、

検索クエリ:「AIやディープラーニングのプログラミング」
--- 検索結果(意味が近い順) ---
1位: [類似度: 0.6655] Appleの新型iPhoneのスペックと価格情報まとめ。
2位: [類似度: 0.6188] Pythonを用いた機械学習モデルの構築方法について説明します。
3位: [類似度: 0.6011] 東京でおすすめの美味しいラーメン屋を探しています。
4位: [類似度: 0.5961] 富士山に登山するときの注意点と必要な装備。


@2026-09-26

Mathematics is the language with which God has written the universe.





















ELFプログラムヘッダーのデータ構造と型 Virtualboxでavxを有効化 Docker composeのインストール Goのインストール multipassでのマウント dockerのインストール