系统讲解企业如何使用Python对采集到的AI搜索回答进行批量分析,包括文本预处理、品牌提及检测、情感分析、主题聚类、竞品对比与可视化报告生成的完整数据分析流程。
批量分析的第一步是将采集到的AI搜索回答整理为结构化数据。每条记录应包含:平台名称、关键词、AI回答全文、采集时间、品牌提及状态。数据源可以是Profound API导出的JSON、Playwright脚本采集的JSONL文件或手动整理的Excel表格。
数据预处理包括:文本清洗(去除HTML标签、特殊字符、多余空白字符)、文本标准化(统一全半角字符、统一中英文标点)、数据去重(同一关键词同一平台同一日内可能多次采集,保留最新一条)、缺失值处理(标记AI回答为空的记录并排除出分析样本)。
预处理后的数据建议存储为pandas DataFrame,便于后续批量分析。对于大规模数据集(10000+条记录),可以使用Dask或分块处理避免内存溢出。
# 数据预处理流程
import pandas as pd
import re
import json
# 加载JSONL格式的检测结果
def load_results(filepath):
records = []
with open(filepath, 'r', encoding='utf-8') as f:
for line in f:
records.append(json.loads(line.strip()))
return pd.DataFrame(records)
# 文本清洗
def clean_text(text):
if not isinstance(text, str):
return ''
# 去除HTML标签
text = re.sub(r'<[^>]+>', '', text)
# 去除特殊字符
text = re.sub(r'[\x00-\x08\x0b\x0c\x0e-\x1f]', '', text)
# 统一空白字符
text = re.sub(r'\s+', ' ', text).strip()
return text
# 数据预处理管道
def preprocess_data(df):
# 文本清洗
df['response_clean'] = df['response'].apply(clean_text)
# 去除空回答
df = df[df['response_clean'].str.len() > 50].copy()
# 去重(同关键词同平台同日保留最新)
df['date'] = pd.to_datetime(df['timestamp'], unit='ms').dt.date
df = df.sort_values('timestamp').drop_duplicates(
subset=['keyword', 'platform', 'date'], keep='last'
)
# 重置索引
df = df.reset_index(drop=True)
print(f'预处理完成: {len(df)} 条有效记录')
return df
# 使用示例
# df = load_results('results/detection_20260811.jsonl')
# df = preprocess_data(df)
# print(df[['platform', 'keyword', 'brand_mentioned']].head(10))品牌提及检测不仅是判断品牌名是否出现在AI回答中,还需要分析提及的位置、频率和上下文。位置分析可以判断AI是否将品牌作为首选推荐——出现在回答开头通常意味着更高的推荐优先级。
检测策略:首先进行精确匹配(品牌全称完全匹配),然后进行模糊匹配(品牌简称、常见变体),最后进行语义匹配(使用LLM判断回答中是否隐含指代品牌)。三层匹配策略可以最大限度地减少漏检。
位置分析:将AI回答按字符长度分为前1/3、中1/3、后1/3三个区间,统计品牌提及在各区间的分布。如果品牌提及集中在前1/3,说明AI倾向于优先推荐该品牌;如果集中在后1/3,说明品牌仅在补充信息中被提及。
| 提及位置 | 推荐优先级 | 占比基准 | 优化目标 |
|---|---|---|---|
| 前1/3 | 高优先级 | >40%为优 | >60% |
| 中1/3 | 中等优先级 | 30-40%为正常 | 维持30-40% |
| 后1/3 | 低优先级 | <30%为差 | <20% |
| 未提及 | 无可见度 | 应<50% | <30% |
# 品牌提及检测与位置分析
def detect_mention(text, brand_names):
'''多层品牌提及检测'''
results = []
text_lower = text.lower()
for name in brand_names:
positions = []
start = 0
while True:
pos = text_lower.find(name.lower(), start)
if pos == -1:
break
positions.append(pos)
start = pos + len(name)
if positions:
results.append({
'brand': name,
'count': len(positions),
'first_position': positions[0],
'relative_position': positions[0] / len(text) if len(text) > 0 else 1.0,
'all_positions': positions
})
return results
def classify_position(relative_pos):
'''将相对位置分类'''
if relative_pos < 0.33:
return '前1/3 (高优先级)'
elif relative_pos < 0.66:
return '中1/3 (中等优先级)'
else:
return '后1/3 (低优先级)'
# 批量分析
brand_variants = ['你的品牌名', '品牌简称', 'BrandName']
# for idx, row in df.iterrows():
# mentions = detect_mention(row['response_clean'], brand_variants)
# if mentions:
# pos_label = classify_position(mentions[0]['relative_position'])
# print(f'{row["platform"]} | {row["keyword"]} | 提及{mentions[0]["count"]}次 | 位置: {pos_label}')情感分析是判断AI搜索回答对品牌声誉影响的关键环节。由于AI回答是自然语言文本,传统基于词典的情感分析方法效果有限,推荐使用LLM API进行深度情感分析。
分析维度包括:整体情感倾向(正面/中性/负面)、情感强度(强烈推荐/一般推荐/客观描述/一般批评/强烈批评)、具体评价内容(AI对品牌的具体评价语句提取)、与竞品的情感对比(同一回答中品牌与竞品的情感差异)。
LLM情感分析的实现方法:将AI回答文本和品牌名称一起发送给LLM(如GPT-4、文心一言API),使用结构化Prompt要求LLM返回JSON格式的分析结果。为了控制成本,建议对品牌被提及的回答进行全量分析,对未提及的回答抽样分析。
# 使用LLM API进行情感分析
import json
import requests
def analyze_sentiment(text, brand_name, api_key):
'''使用LLM分析AI回答中品牌的情感倾向'''
prompt = f'''请分析以下AI搜索回答中关于品牌"{brand_name}"的情感倾向。
AI回答内容:
{text}
请以JSON格式返回分析结果,包含以下字段:
- sentiment: 情感倾向 (positive/negative/neutral)
- intensity: 情感强度 (strong/medium/weak)
- key_phrases: 关键评价语句列表
- competitor_comparison: 与竞品的对比描述(如果有)
- overall_recommendation: AI是否推荐该品牌 (yes/no/partial)
'''
response = requests.post(
'https://api.openai.com/v1/chat/completions',
headers={'Authorization': f'Bearer {api_key}'},
json={
'model': 'gpt-4o-mini',
'messages': [{'role': 'user', 'content': prompt}],
'temperature': 0.3
}
)
result = response.json()['choices'][0]['message']['content']
try:
return json.loads(result)
except json.JSONDecodeError:
return {'sentiment': 'unknown', 'raw': result}
# 批量情感分析
def batch_sentiment_analysis(df, brand_name, api_key):
sentiments = []
for idx, row in df.iterrows():
if row.get('brand_mentioned'):
analysis = analyze_sentiment(row['response_clean'], brand_name, api_key)
sentiments.append(analysis)
print(f'{row["platform"]} | {row["keyword"]} | {analysis.get("sentiment", "?")}')
else:
sentiments.append({'sentiment': 'not_mentioned'})
df['sentiment'] = [s.get('sentiment', 'unknown') for s in sentiments]
return df通过对AI搜索回答进行主题聚类,可以发现AI引擎在什么话题场景下倾向于提及或不提及品牌。这对于制定GEO内容策略具有直接指导意义——找出品牌缺失的话题场景,有针对性地创建相关内容。
聚类方法:首先对AI回答文本进行向量化(使用sentence-transformers或OpenAI Embeddings API),然后使用K-Means或HDBSCAN算法进行聚类。每个聚类提取关键词作为主题标签,统计各聚类中品牌提及率。
分析价值:如果发现'产品对比'主题的AI回答中品牌提及率很低,说明需要在第三方平台发布更多产品对比内容;如果'技术原理'主题中品牌提及率较高,说明品牌的技术内容已经获得AI认可,可以继续加强该方向。
Cluster 0(产品功能对比): 50条,提及率8% → 需要加强产品对比内容
Cluster 1(行业趋势分析): 35条,提及率25% → 表现良好,继续保持
Cluster 2(价格方案咨询): 28条,提及率3% → 严重缺失,优先优化
Cluster 3(技术实现原理): 42条,提及率19% → 表现中等,可进一步提升
# 主题聚类分析
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
import numpy as np
def cluster_responses(texts, n_clusters=8):
'''对AI回答文本进行主题聚类'''
# TF-IDF向量化
vectorizer = TfidfVectorizer(max_features=1000, stop_words='english')
tfidf_matrix = vectorizer.fit_transform(texts)
# K-Means聚类
kmeans = KMeans(n_clusters=n_clusters, random_state=42, n_init=10)
clusters = kmeans.fit_predict(tfidf_matrix)
# 提取每个聚类的关键词
feature_names = vectorizer.get_feature_names_out()
cluster_keywords = {}
for i in range(n_clusters):
center = kmeans.cluster_centers_[i]
top_indices = center.argsort()[-10:][::-1]
keywords = [feature_names[idx] for idx in top_indices]
cluster_keywords[i] = keywords
print(f'Cluster {i}: {", ".join(keywords[:5])}')
return clusters, cluster_keywords
def analyze_cluster_mention_rate(df, clusters, brand_name):
'''分析各聚类的品牌提及率'''
df['cluster'] = clusters
for cluster_id in df['cluster'].unique():
subset = df[df['cluster'] == cluster_id]
mention_rate = subset['brand_mentioned'].mean()
count = len(subset)
print(f'Cluster {cluster_id}: {count}条 | 提及率 {mention_rate:.1%}')批量分析AI搜索回答的另一重要应用是竞品对比。通过在同一组关键词下检测品牌和竞品的提及情况,可以构建AI搜索中的竞争格局全景图。
竞品分析的核心指标:共存率(品牌和竞品同时出现在同一AI回答中的比例)、替代率(竞品被提及而品牌未被提及的比例)、胜出率(品牌被推荐而竞品未被推荐的比例)、推荐顺序(当品牌和竞品同时被提及时,谁排在前面)。
竞争格局评估方法:构建品牌×竞品的提及矩阵,使用热力图可视化展示各关键词下品牌与各竞品的提及对比。找出'竞品优势区'(竞品频繁被提及而品牌缺失的关键词集合)作为GEO优化的优先目标。
| 竞争指标 | 计算方式 | 理想值 | 行动建议 |
|---|---|---|---|
| 品牌胜出率 | 品牌被推荐/竞品被推荐 | >40% | 维持优势内容 |
| 竞品替代率 | 竞品提及品牌未提及/总检测 | <20% | 补充缺失内容 |
| 共存率 | 两者同时提及/总检测 | 30-50% | 强化差异化 |
| 推荐领先率 | 品牌排在竞品前面/共存次数 | >50% | 提升内容权威性 |
数据分析的最终产出是可执行的可视化报告。报告应包含:品牌提及率趋势图(折线图展示每日/每周变化)、平台对比柱状图(各AI平台的提及率对比)、情感分析饼图(正面/中性/负面占比)、主题聚类散点图(各主题的提及率分布)、竞品对比热力图。
报告生成工具推荐:使用matplotlib+seaborn生成静态图表(适合邮件报告),使用plotly生成交互式图表(适合Web仪表盘),使用jupyter notebook生成综合分析报告(适合内部分享)。
数据驱动决策流程:报告生成→GEO团队审阅→识别关键问题→制定优化方案→执行优化→下一轮检测验证效果。形成'检测-分析-优化-验证'的数据驱动闭环,持续提升AI搜索可见度。
# 可视化报告生成
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
def generate_report_charts(df, brand_name):
'''生成GEO效果分析图表'''
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# 1. 品牌提及率趋势
daily = df.groupby('date')['brand_mentioned'].mean()
axes[0][0].plot(daily.index, daily.values, marker='o')
axes[0][0].set_title('品牌提及率趋势')
axes[0][0].set_ylabel('提及率')
# 2. 平台对比
platform = df.groupby('platform')['brand_mentioned'].mean()
axes[0][1].bar(platform.index, platform.values)
axes[0][1].set_title('各平台提及率对比')
axes[0][1].set_ylabel('提及率')
# 3. 情感分布
sentiment = df[df['brand_mentioned']]['sentiment'].value_counts()
axes[1][0].pie(sentiment.values, labels=sentiment.index, autopct='%1.1f%%')
axes[1][0].set_title('品牌提及情感分布')
# 4. 提及位置分布
axes[1][1].set_title('分析报告完成')
axes[1][1].text(0.5, 0.5, f'品牌: {brand_name}\n检测: {len(df)}条\n提及: {df["brand_mentioned"].sum()}条',
ha='center', va='center', fontsize=14)
axes[1][1].axis('off')
plt.tight_layout()
plt.savefig('geo_report.png', dpi=150, bbox_inches='tight')
print('报告已保存: geo_report.png')
# generate_report_charts(df, '你的品牌名')