プログラム 技術

Pythonであいまい検索を実装する<TF-IDF + コサイン類似度 ver. >

以前、C#であいまい検索について記事を書きましたが、今回はPythonでTF-IDF + コサイン類似度の方法であいまい検索を実装してみようと思います

関連記事
C#のあいまい検索について<N-gram + ひらがな正規化ver.> - ナストンのまとめ
C#のあいまい検索について<N-gram + ひらがな正規化ver.> - ナストンのまとめ

今回はシステムを作るうえで時々ある『あいまい検索』についてです。あいまい検索の中でも日本語に焦点を当てていますそのため、 ...

関連記事へ

名称バージョン
Python3.12
scikit-learn1.8.0

あいまい検索の準備する

あいまい検索を実施するためにあらかじめ文章を学習を実施しておく

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

# 検索対象となる文書のリスト(コーパス)を定義
corpus = ["Python プログラミング 入門", "Python 機械学習", "Java 入門"]

# TF-IDFベクトライザーを初期化
# TF(単語の出現頻度) × IDF(単語の希少性) で各単語の重要度を数値化する
vectorizer = TfidfVectorizer()

# コーパス内の全文書をTF-IDFベクトルに変換(語彙の学習と変換を同時に行う)
# 結果は文書数×語彙数の疎行列(sparse matrix)になる
tfidf_matrix = vectorizer.fit_transform(corpus)

実際に検索してみる

準備したものに対して実際に文言を検索してみます

# 検索クエリを、学習済みの語彙に基づいてTF-IDFベクトルに変換
# ※ fit_transform ではなく transform を使うことで、コーパスと同じ語彙空間に射影する
query = vectorizer.transform(["Python 入門"])

# クエリベクトルと各文書ベクトルのコサイン類似度を計算
# コサイン類似度: ベクトル間の角度の近さを0〜1で表す(1に近いほど類似)
scores = cosine_similarity(query, tfidf_matrix)

# 各文書との類似度スコアを順に表示(対象文書の内容も併せて出力)
for i, score in enumerate(scores[0]):
    print(f"文書 {i}: 「{corpus[i]}」 類似度 {score:.4f}")

# 実行結果 : Pythonと入門どちらも含まれる文章が高い値を示している
# 文書 0: 「Python プログラミング 入門」 類似度 0.7324
# 文書 1: 「Python 機械学習」 類似度 0.4280
# 文書 2: 「Java 入門」 類似度 0.4280

今回はPythonでTF-IDF + コサイン類似度を用いた方法でのあいまい検索について紹介しました。今後も他の方法などについても記事にしていきたいと思います

会社紹介

私が所属しているアドバンスド・ソリューション株式会社(以下、ADS)は一緒に働く仲間を募集しています

会社概要
「技術」×「知恵」=顧客課題の解決・新しい価値の創造

この方程式の実現はADSが大切にしている考えで、技術を磨き続けるgeekさと、顧客を思うloveがあってこそ実現できる世界観だと思っています
この『love & geek』の精神さえあれば、得意不得意はno problem!
技術はピカイチだけど顧客折衝はちょっと苦手。OKです。技術はまだ未熟だけど顧客と知恵を出し合って要件定義するのは大好き。OKです
凸凹な社員の集まり、色んなカラーや柄の個性が集まっているからこそ、常に新しいソリューションが生まれています

ミッション
私たちは、テクノロジーを活用し、業務や事業の生産性向上と企業進化を支援します

ホームページ
アドバンスド・ソリューション株式会社|ADS Co., Ltd.
アドバンスド・ソリューション株式会社|ADS Co., Ltd.

Microsoft 365/SharePoint/Power Platform/Azure による DX コンサル・シス ...

サイトへ移動

PR

-プログラム, 技術
-