paper2skills Playbook

Review Dedup & Quality Filter — 多平台评论在线去重与质量排序

Skill-Review-Dedup-Quality-Filter · 22-数据采集工程

causalexperimentforecastingoptimizationdata_collection广告与投放客服与VOC数据采集与治理WF-B 广告优化WF-C 客服分诊WF-D 选品扫描WF-E Review监控
年化 ROI10-50 万元
实现难度⭐⭐☆☆☆
业务视角
适用角色数据工程师 / 技术负责人 · 运营负责人 · 选品负责人
适用平台Amazon SP API + Keepa · TikTok Shop API · 跨境多平台数据湖
什么情况下用想监控竞品价格/评论/排名但没有稳定采集能力,手动太慢;多平台数据分散整合成本极高;数据管道不稳定经常断
成功是什么样的竞品价格/评论数据每日自动更新,多平台数据统一入仓,数据管道稳定性 >99%,取数时间从小时降到分钟
业务痛点
竞品数据要手动收集太慢平台 API 限制抓不到数据多系统数据整合不起来报表用的数据是过期的

1. 解决的问题

从 Amazon、TikTok Shop、独立站同时采集的评论中,30-40% 是重复或低质量内容(同一用户多平台发布、机器生成水评、极短无意义评论)。直接用于 VOC 分析会严重扭曲洞察结论。

2. 核心算法逻辑

从 Amazon、TikTok Shop、独立站同时采集的评论中,3040% 是重复或低质量内容(同一用户多平台发布、机器生成水评、极短无意义评论)。直接用于 VOC 分析会严重扭曲洞察结论。

3. 业务应用场景

业务背景:每日从 Amazon US/UK、TikTok Shop、独立站采集约 500 条新评论,其中约 180 条(36%)是跨平台重复或水评。人工清洗需 30-45 分钟/天。

业务背景:季度复盘需要分析过去 3 个月全渠道 470 万条评论,识别"静音性能下降"等趋势。人工抽样误差大,全量处理成本高。

4. 输入数据要求

请查看原始代码模板获取输入规格。

5. 输出结果

请查看原始代码模板获取输出规格。

6. 业务价值 / ROI

10-50 万元

7. 代码模板

代码块数量:6 · 路径:未检测到

import hashlib
import heapq
import math
import re
from dataclasses import dataclass, field
from typing import Any, Dict, List, Optional, Set, Tuple


@dataclass
class Review:
    review_id: str
    text: str
    platform: str
    timestamp: float = 0.0
    rating: float = 3.0
    verified_purchase: bool = False
    helpful_votes: int = 0
    aspects: Dict[str, str] = field(default_factory=dict)
    quality_score: float = 0.0


PLATFORM_PRIORITY = {"amazon": 3, "independent": 2, "tiktok": 1, "other": 0}


class SimHashSignature:
    def __init__(self, n_bits: int = 64, n_shingles: int = 3):
        self.n_bits = n_bits
        self.n_shingles = n_shingles

    def _shingles(self, text: str) -> List[str]:
        tokens = re.sub(r'[^\w\s]', '', text.lower()).split()
        return [" ".join(tokens[i:i+self.n_shingles])
                for i in range(len(tokens) - self.n_shingles + 1)] or [text[:16]]

    def compute(self, text: str) -> int:
        shingles = self._shingles(text)
        v = [0] * self.n_bits
        for s in shingles:
            h = int(hashlib.md5(s.encode()).hexdigest(), 16)
            for i in range(self.n_bits):
                v[i] += 1 if (h >> i) & 1 else -1
        return sum(1 << i for i in range(self.n_bits) if v[i] > 0)

    def hamming_distance(self, sig_a: int, sig_b: int) -> int:
        xor = sig_a ^ sig_b
        return bin(xor).count('1')

    def similarity(self, sig_a: int, sig_b: int) -> float:
        return 1.0 - self.hamming_distance(sig_a, sig_b) / self.n_bits


class HNSWIndex:
    """轻量 HNSW 近似最近邻索引(FOLD 核心数据结构)"""

    def __init__(self, max_neighbors: int = 16, similarity_fn=None):
        self.max_neighbors = max_neighbors
        self.nodes: Dict[str, int] = {}
        self.signatures: List[Tuple[str, int]] = []
        self.graph: Dict[int, List[int]] = {}
        self.sim_fn = similarity_fn or (lambda a, b: 1.0 - bin(a ^ b).count('1') / 64)

8. 论文来源

  • 2601.07449
  • 2602.21082
  • 2606.03001