コンテンツベースフィルタリング
TF-IDFによるアイテム表現、コサイン類似度、メタデータから映画レコメンダーを構築する方法について学習します。
「コンテンツベースフィルタリング」はCoddyKit上の無料Learn AI with Pythonレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn AI with Python学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn AI with Pythonコースには全4レッスンが含まれています。
コンテンツベースフィルタリングとは
コンテンツベースフィルタリングは、ユーザーがすでに好んだアイテムと似たアイテムを、そのアイテム自体の特徴量(テキスト、ジャンル、タグ)に基づいて推薦します。協調フィルタリングとは異なり、他のユーザーのデータを必要としないため、アイテムのコールドスタート問題を回避できます。
アイテムを特徴ベクトルとして表す
基本的な考え方は、各アイテムをその内容を表す数値ベクトルに変換し、ベクトル間の類似度を測定することです。テキストによる説明には、TF-IDFがこれらのベクトルを作る古典的な方法です。
TF-IDFとは
TF-IDF(単語頻度-逆文書頻度)は、アイテム内に単語が現れる頻度に基づいて重みを付けます。ただし、すべてのアイテムに共通する単語の重みは下げます。出現頻度が低く特徴的な単語ほど高い重みが与えられ、アイテム固有の特徴を捉えられます。
TfidfVectorizer
scikit-learnを使うと、2行のコードでアイテム説明のリストをTF-IDF行列に変換できます。
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(stop_words="english")
tfidf_matrix = vectorizer.fit_transform(df["description"])行列の形状を理解する
tfidf_matrixの形状は(n_items, n_terms)です。各行が1つのアイテム、各列が語彙に含まれる固有の単語を表します。ほとんどのアイテムは全単語の一部しか使わないため、スパース行列になります。
print(tfidf_matrix.shape) # (n_items, vocabulary_size)ベクトライザーのチューニング
便利なパラメーターには、一般的な単語を除外するstop_words、語彙のサイズに上限を設定するmax_features、そして2語のフレーズを含めてより豊かな特徴量を作るngram_range=(1,2)があります。
vectorizer = TfidfVectorizer(
stop_words="english",
max_features=5000,
ngram_range=(1, 2)
)アイテム間のコサイン類似度
すべてのアイテム間でペアごとの類似度を計算します。結果はn_items x n_itemsの行列になり、各セルには2つのアイテムの説明がどの程度似ているかが入ります。
from sklearn.metrics.pairwise import cosine_similarity
cosine_sim = cosine_similarity(tfidf_matrix)
print(cosine_sim.shape) # (n_items, n_items)Linear Kernelによるショートカット
TF-IDFベクトルはデフォルトでL2正規化されるため、linear_kernelはコサイン類似度と同じ結果をより高速に返します。これは大規模なカタログでよく使われる最適化です。
from sklearn.metrics.pairwise import linear_kernel
cosine_sim = linear_kernel(tfidf_matrix, tfidf_matrix)タイトルとインデックスの対応付け
名前からアイテムを検索するには、タイトルから行位置を引くための逆インデックスを作成します。
indices = pd.Series(df.index, index=df["title"]).drop_duplicates()get_recommendations関数
タイトルを受け取ったら、そのアイテムの類似度の行を取得し、降順に並べ替え、自分自身のアイテムを除外して、上位の一致項目を返します。
def get_recommendations(title, n=10):
idx = indices[title]
scores = list(enumerate(cosine_sim[idx]))
scores = sorted(scores, key=lambda x: x[1], reverse=True)
top = scores[1:n+1] # skip itself at position 0
item_idxs = [i for i, _ in top]
return df["title"].iloc[item_idxs]長所と限界
長所: 完全に新しいアイテムにも対応でき、推薦理由を説明できます(「これらの単語を共有しているため」)。
限界: ユーザーの既知の好みの範囲にとどまるため、好みが特化しすぎることがあります。また、協調フィルタリングのように、意外なジャンル横断のヒットを見つけることもできません。
確認テスト
コンテンツベースフィルタリングの知識を確認しましょう。
まとめ
コンテンツベースフィルタリングを構築しました。TfidfVectorizerで説明文を(n_items, n_terms)行列に変換し、cosine_similarityでアイテムを比較し、get_recommendationsで類似度が高い上位のアイテムを返しました(対象アイテム自体は除外します)。コールドスタートには対応できますが、好みが特化しすぎるリスクがあります。次は、ハイブリッドシステムと評価指標です。
よくある質問
「コンテンツベースフィルタリング」レッスンは無料ですか?
はい。「コンテンツベースフィルタリング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn AI with Pythonコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn AI with Pythonコースには全4レッスンが含まれています。
「コンテンツベースフィルタリング」で何を学びますか?
TF-IDFによるアイテム表現、コサイン類似度、メタデータから映画レコメンダーを構築する方法について学習します。 ブラウザで直接実行するハンズオンコードでLearn AI with Pythonを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn AI with Pythonを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn AI with Pythonは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「コンテンツベースフィルタリング」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn AI with Pythonレッスンでコードを書いて実行できますか?
はい。すべてのLearn AI with Pythonレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 協調フィルタリング:ユーザーベースとアイテムベース
- SVDによる行列分解
- コンテンツベースフィルタリング
- ハイブリッドシステムと評価指標