去重与去噪:过滤水军 / 刷屏 / 模板评论
Deduplication: Remove Spam and Templates
电商评论里 30% 是模板刷屏 — 好评返现 5 星、物流很快包装完整 这种。词频统计前必须清掉,否则分析结论全被带偏。
1. 完全重复
df_clean = df.drop_duplicates(subset=['clean'], keep='first')
print(f'完全去重: {len(df) - len(df_clean)} 条')
2. 近似重复(85% 相似度)
from difflib import SequenceMatcher
def is_similar(a, b, threshold=0.85):
return SequenceMatcher(None, a, b).ratio() > threshold
seen = set()
unique = []
for text in df_clean['clean']:
is_dup = False
for kept in seen:
if is_similar(text, kept):
is_dup = True
break
if not is_dup:
seen.add(text)
unique.append(text)
print(f'近似去重后剩 {len(unique)} 条')
3. 短句模板刷屏(关键句列表)
SPAM_TEMPLATES = [
'好评返现',
'五星好评',
'物流很快包装完整',
'物超所值',
'客服态度很好',
'非常满意的一次购物',
'会回购的',
'必须好评',
]
def is_spam(text, templates):
for t in templates:
if t in text and len(text) < 30:
return True
return False
df_clean['is_spam'] = df_clean['clean'].apply(lambda t: is_spam(t, SPAM_TEMPLATES))
df_quality = df_clean[~df_clean['is_spam']]
print(f'过滤水军后剩 {len(df_quality)} 条')
实际项目里:SPAM_TEMPLATES 要从数据里挖掘 — 先跑一次词频,找那些高频但又短得可疑的句子,人工判定后再加进黑名单。
去重 + 去水军,是文本分析质量门。这一节跑完,数据从 10 万 → 7 万干净语料,可以进下一步分析。