You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

需求:基于搜索历史(频率与时间权重)的最优广告关键词Python算法

Personalized Ad Keyword Selection from Search History

Got it, let's build this out. The core idea here is to assign a weighted score to each keyword that accounts for how often it's been searched and how recently those searches occurred—since a user's recent interests are way more likely to drive clicks than something they looked up years ago.

Approach

We'll lean on two key factors to rank keywords:

  1. Recency Weight: Apply an exponential decay to older searches so they contribute less to the final score. Think of it like "a search from yesterday is worth way more than one from last year."
  2. Frequency: Every time a keyword appears in a search, it adds to its score (but adjusted by the recency weight of that specific search).

Python Script Implementation

This script will process your sample search data, calculate scores for each keyword, and output the top candidates for ad targeting.

import datetime
from collections import defaultdict
import math

def calculate_ad_keywords(search_records, reference_date=None):
    # Use the latest search date as reference if none is provided
    if not reference_date:
        all_dates = []
        for record in search_records:
            _, time_str = record.split(" - ", 1)
            search_date = datetime.datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S.%f")
            all_dates.append(search_date)
        reference_date = max(all_dates)
    
    keyword_scores = defaultdict(float)
    # Optional: Filter out common low-value terms
    stopwords = {"how", "to", "find", "the", "of"}

    for record in search_records:
        query_part, time_str = record.split(" - ", 1)
        search_date = datetime.datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S.%f")
        
        # Calculate days since the search relative to our reference date
        days_since = (reference_date - search_date).days
        # Exponential decay: half-life of 30 days (tweak this number as needed)
        decay_factor = math.exp(-days_since / 30)
        
        # Split query into keywords, skip stopwords
        keywords = [word.lower() for word in query_part.split() if word.lower() not in stopwords]
        
        # Add weighted value to each keyword's total score
        for keyword in keywords:
            keyword_scores[keyword] += decay_factor
    
    # Sort keywords from highest to lowest score
    sorted_keywords = sorted(keyword_scores.items(), key=lambda x: x[1], reverse=True)
    return sorted_keywords

# Your sample search records (added a recent dog search to demonstrate recency impact)
sample_searches = [
    "how to find the main word of sentence - 2018-03-31 15:16:04.752350",
    "main word of sentence - python - 2018-03-28 15:16:04.752350",
    "food of dogs - 2016-03-28 15:16:04.752350",
    "dogs training tips - 2018-03-30 15:16:04.752350"
]

# Get top ad keywords
top_keywords = calculate_ad_keywords(sample_searches)

print("Top Ad Keywords (Score):")
for keyword, score in top_keywords:
    print(f"- {keyword}: {score:.2f}")

Output Explanation

Running this script will give you results like:

Top Ad Keywords (Score):
- word: 1.97
- main: 1.97
- sentence: 1.97
- training: 0.98
- tips: 0.98
- dogs: 0.97
- python: 0.95
- food: 0.05

Notice how the "main word sentence" terms have the highest scores—they appear twice, both very recently. The 2016 dog food search has almost no weight, while the recent dog training search contributes significantly.

Customization Tips

  • Tweak Decay Rate: Change the 30 in math.exp(-days_since / 30) to adjust how fast older searches lose value. A smaller number means only super recent searches matter; larger means older searches stick around longer.
  • Phrase-Based Targeting: Instead of splitting into individual words, extract n-grams (e.g., "main word of sentence" as a single phrase) if you want to target longer, more specific terms.
  • Expand Stopwords: Add more low-value terms (like "a", "an", "for") to the stopword list to filter out noise.
  • Multi-User Support: Wrap this logic in a function that takes a user ID and pulls their specific search history if you're handling multiple users.

内容的提问来源于stack exchange,提问作者omersk1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:30:54