⚙️

教育・研究向けの架空検索ログを生成するPythonパッケージ

2025/02/24に公開

最近Devinがすごいので、前から作りたかったものを色々作っています。

今回は教育・研究用に、架空の検索ログ生成をするLogfakerというパッケージを公開したので紹介します。

https://github.com/rilmayer/logfaker

なぜLogfakerを作ったのか

検索システムの研究や教育において、自分の欲しい感じのテストデータ(特に日本語)が不足していることに不満を持っておりました。
プライバシーやビジネスの観点から実際の検索ログを使用することはなかなか難しく、かといって手動で作成するのは非常に手間がかかります。

Logfakerは、この課題を解決するために開発されました。OpenAI APIを活用することで、現実的なユーザープロファイル、検索クエリ、コンテンツを自動生成し、研究や教育に活用できる品質の高いテストデータを作成できます。

用途としては以下のようなところを想定しています。

  • 情報検索の教育
    • 検索システムの基礎概念の理解
    • 実践的な実装演習
    • データ分析手法の学習
  • 検索アルゴリズムの研究
    • 新しいランキング手法の評価
    • パーソナライゼーション手法の実験
  • UX研究
    • 検索インターフェースの改善実験
    • 検索結果の表示方法の最適化

近々このパッケージを利用して比較的規模の大きめなデータセットを作ろうと思うので、できたら公開します。

主な機能と特徴

1. コンテンツ生成

service_type に色々指定してください。例えば、以下のような感じ。

  • 大手のECサイト。何でも買える。
  • 趣味人の集まるコンテンツサイト。色々な記事が読める。
  • クリエイターが自作の製品を公開しているWebサイト
  • 研究者が集まる論文検索サイト
  • 最新のゲームレビューが集まるレビューサイト
  • etc...
from logfaker.core.config import GeneratorConfig
from logfaker.generators.users import UserGenerator
config = GeneratorConfig(
    api_key="your-openai-api-key",
    service_type="図書館の蔵書検索サービス",
    language="ja"
)

# 50件のコンテンツを作成
content_gen = ContentGenerator(config.generator)
contents = content_gen.generate_contents(count=50)
Generated Contents
Content ID,Title,Description,Category
1,幽霊屋敷の秘密,町外れの森の中に佇む古びた屋敷。その屋敷には、誰も近づこうとはしない恐ろしい噂があった。ある日、若い探検家のユウが友人たちと共に、真相を探るために屋敷に足を踏み入れる。彼らはそこに住む幽霊の正体と、屋敷に秘められた悲しい過去を解き明かすため、数々の謎を解決しなければならない。友情と勇気を試される冒険が始まる。,フィクション
2,星の彼方に - 宇宙探索の物語,人類の宇宙探査の歴史を辿るノンフィクション作品。初の月面着陸や火星探査機の発射、宇宙飛行士たちの壮絶な挑戦を詳細なデータとともに紹介し、宇宙に対する人類の夢と希望を描く。,ノンフィクション
3,戦国時代の真実,日本の戦国時代についての詳細な研究書。各地で繰り広げられた武士たちの戦い、策略、人間模様を描く。著者は歴史学者であり、当時の文献や遺跡を基にした現地調査の結果も紹介し、戦国時代の実態を明らかにする。,歴史
...

上記で確認できる通り、生成されるコンテンツはTitle,Description,Categoryで抽象化されています。

2. ユーザープロファイル生成

from logfaker.core.config import GeneratorConfig
from logfaker.generators.users import UserGenerator

# 10人分のユーザープロファイルを生成
user_gen = UserGenerator(config)
users = user_gen.generate_users(count=10)
Generated Contents
User ID,Brief Explanation,Profession,Preferences
1,このユーザーはアニメの歴史に強い興味を持ち、公共図書館の蔵書検索サービスを利用して関連書籍を探し、アニメの起源や発展に関する情報を収集しています。特に、アニメの文化的影響や重要な作品について深く理解するために、専門書や研究資料を多く検索しています。,研究者,"歴史,ノンフィクション,アート,コミック・漫画,アニメーション"
2,彼は政治に深い関心を持っており、公共図書館の蔵書検索サービスを利用して最新の政治関連書籍や研究資料を探し出すことで、自分の知識を広げています。また、著名な政治家や思想家の伝記も探求し、彼らの理念や政策について学ぶことを楽しんでいます。,学生,"ノンフィクション,政治,歴史,社会"
3,彼は公共政策に非常に熱心で、公共図書館の蔵書検索サービスを利用して関連書籍や資料を探し出すことが多い。彼は特に政策分析や政府の運営に関する資料を重視しているため、蔵書検索サービスは彼にとって貴重な情報源となっている。,学生,"ノンフィクション,政治,公共政策,社会"
...

生成されるユーザープロファイルには、職業や興味のある分野など、実際のユーザーを模した情報が含まれます。

3. コンテキストを考慮した検索結果ログの生成

各ユーザーの属性や興味に基づいて、自然な検索クエリが生成されます。
検索はElasticsearchと連携することを想定しており、実行環境で接続できるようにしていただければあとはよしなにやります。

from logfaker.core.config import SearchEngineConfig
from logfaker.generators.queries import QueryGenerator
from logfaker.search.elasticsearch import ElasticsearchEngine

es = ElasticsearchEngine(SearchEngineConfig())

# 生成したコンテンツをインデクシング
es.setup_index(force=True)
for content in contents:
    es.index_content(content.content_id, content.dict())

# ユーザーの興味に基づいた検索クエリを生成
query_gen = QueryGenerator(config)
queries = query_gen.generate_queries(users[0], count=5)

# 生成したクエリに基づいて検索を実行しログを生成・出力
search_logs = []
for query in user_queries:
    results = es.search(query.query_content, max_results=5)
    search_log = SearchLog(
        query_id=query.query_id,
        user_id=user.user_id,
        search_query=query.query_content,
        search_results=results
    )
    search_logs.append(search_log)

exporter = CsvExporter()
exporter.export_search_logs(search_logs, "search_logs.csv")
search_logs.csv
Query ID,User ID,Search Query,Search Results (JSON)
1,1,"ゲームデザイン, 技術, アート","[{""content_id"": 218, ""title"": ""ゲームデザインの基礎"", ""relevance_score"": 12.364336}, {""content_id"": 109, ""title"": ""ゲームデザイン入門"", ""relevance_score"": 11.891073}, {""content_id"": 436, ""title"": ""ゲームデザインの基礎"", ""relevance_score"": 11.600502}, {""content_id"": 327, ""title"": ""ゲームデザインの基礎"", ""relevance_score"": 11.473919}, {""content_id"": 118, ""title"": ""色彩の魔法: デザインにおける色の心理学"", ""relevance_score"": 8.501894}]"
1,2,ホラー小説 不気味な雰囲気 独創的なストーリー,"[{""content_id"": 367, ""title"": ""闇の中のささやき"", ""relevance_score"": 11.495287}, {""content_id"": 149, ""title"": ""夜の囁き"", ""relevance_score"": 8.901394}, {""content_id"": 258, ""title"": ""影の中で待つ者"", ""relevance_score"": 7.3506174}, {""content_id"": 489, ""title"": ""春の風に乗せて"", ""relevance_score"": 7.140806}, {""content_id"": 380, ""title"": ""春のささやき"", ""relevance_score"": 6.9673157}]"
1,3,コンピュータサイエンス 論文 最新技術,"[{""content_id"": 462, ""title"": ""アルゴリズムの魔法"", ""relevance_score"": 8.348194}, {""content_id"": 115, ""title"": ""未来の情報技術"", ""relevance_score"": 7.733531}, {""content_id"": 401, ""title"": ""未来予知の科学:SFと現実の交差点"", ""relevance_score"": 7.1475797}, {""content_id"": 281, ""title"": ""未来のテクノロジー : 2025年の革新の予測"", ""relevance_score"": 7.1298313}, {""content_id"": 74, ""title"": ""未来世界の解読 - サイエンスフィクションの深層分析"", ""relevance_score"": 6.2313676}]"

Elasticsearch以外も使える、もうちょい抽象化された検索インターフェースは後々・・・。

今後の展開:多様なログ生成

現在のLogfakerは検索時のログ生成を主なユースケースとしていますが、今後は以下のような多様なログ生成に対応していく予定です:

  1. クリックログ

    • 検索結果のクリック行動
    • CTRの予測実験用データ
    • ポジションバイアスの研究
  2. コンバージョンログ

    • 購買行動シミュレーション
    • 予約・貸出行動の記録
    • ユーザーエンゲージメントの分析
  3. 仮想ページの閲覧ログ

    • ブラウジング行動の記録
    • セッション分析用データ
    • ナビゲーション行動の研究

これらの機能追加により、より幅広い研究テーマや教育シーンでの活用が可能になります。

インストール方法

興味のある方はPyPIからインストール可能です:

pip install logfaker

要件:

  • Python 3.12以上
  • 実行にはOpenAI APIキーが必要
  • Elasticsearch(検索機能を使用する場合のみ)

おわりに

Logfakerは、検索システムの研究や教育をより身近なものにすることを目指しています。架空のデータとはいえ、現実的で意味のあるログを生成することで、様々な実験や学習が可能になります。

皆様からのフィードバックやコントリビューションをお待ちしています!

ソースコード:https://github.com/rilmayer/logfaker

Discussion