# 数据清洗、证据切分与编码流程

本页说明 PsyLens 如何将多平台公开讨论整理成可分析的数据。

## 1. 数据处理目标

数据处理同时满足四个要求：

- 文本保留足够上下文，能够理解玩家在讨论什么；
- 每条证据可以回到对应样本，避免孤立摘句；
- 不同平台使用统一字段与稳定编号；
- 公开数据不包含来源链接和账号定位信息。

## 2. 处理流程

```text
候选讨论发现
→ 页面与回复采集
→ 原始缓存
→ 规则预清洗
→ 内容筛选与字段规整
→ 平台等额抽样
→ 公开脱敏
→ 证据单元切分
→ 话题与机制编码
→ 完整性与分布审计
→ 页面与报告数据
```

## 3. 候选发现与采集登记

采集阶段先形成候选帖子登记表，记录平台、检索主题、时间窗和讨论入口。真实抓取结果保存在本地缓存中，缓存与登录信息等不录入公开仓库。分析样本保留平台和时间窗等研究字段，公开副本移除可直接定位原帖或账号的字段。

当前案例使用三个平台，每个平台选取 120 条样本。等额抽样用于保证跨平台观察时各平台都有足够材料，因此平台样本数相同属于研究设计，更具体的分析还需考虑平台的真实讨论规模等因素。

## 4. 规则预清洗

规则预清洗处理可确定的格式噪声：

- 删除论坛回复头、引用残留和重复标记；
- 删除图片本地路径、占位符和无意义标签；
- 合并连续空白，清理首尾空格；
- 移除清洗后为空的记录；
- 保留原句语序和核心含义，不进行观点改写。

随后对文本进行可用性筛选，排除纯标记、空引用、极短噪声、无分析信息的纯攻击表达和明显离题内容。文本包含体验、归因、问题描述或具体诉求时，进入候选样本层。

## 5. 字段统一与稳定编号

样本层使用统一字段：

| 字段 | 含义 |
| --- | --- |
| `sample_id` | 平台前缀与平台内序号组成的稳定编号 |
| `platform_source` | 平台类别 |
| `platform_sequence` | 平台内部顺序 |
| `window_tag` | 采集或分析时间窗 |
| `theme_bucket` | 平衡抽样阶段的粗粒度分层 |
| `reply_type` | 主帖上下文或近期回复 |
| `date` | 可获得时记录的日期；缺失时留空 |
| `public_text` | 公开脱敏后的完整样本文本 |
| `migration_status` | 数据迁移或生成状态 |

粗粒度 `theme_bucket` 用于采样与覆盖控制，不能替代证据层的正式表层话题编码。

## 6. 公开脱敏与最小化

公开数据遵循字段最小化原则：

- 删除原始来源链接、帖子标题、账号、UID 和平台内部定位字段；
- 屏蔽文本中的 URL、邮箱、手机号、@用户名、QQ 与微信号；
- 只保留分析、复现与字段解释需要的文本和结构字段；
- 公开样本只保存 `public_text`，不再重复保存内容相同的 `raw_text`。

当前公开样本有 240 条日期为空（受平台规则影响），不过日期不是证据回溯和编码的必需字段，因此保留为空；只是涉及时间趋势分析时，这部分样本不能进入日期比较。

## 7. 证据单元切分

证据单元是可以独立判断主要话题与体验机制的最小文本片段。一条完整反馈可以切出零条、一条或多条证据。

当前确定性切分规则包括：

- 按中文和半角句号、问号、感叹号、分号及换行切分；
- 每段去除首尾空白；
- 默认长度少于 6 个字符的片段不单独进入候选证据；
- 证据文本必须能够在父样本 `public_text` 中逐字定位；
- 严禁跨样本拼接、补写省略信息、修改原文立场。

候选片段随后记录纳入状态：

- `included`：片段具有独立含义，可以进入后续编码；
- `included_flagged_uncertain`：片段保留，但纳入时需提醒上下文或解释风险。

该字段描述证据是否适合进入分析，与机制标签 `uncertain` 含义不同。

## 8. 双层编码

每条证据分别记录：

- `surface_topic`：表达讨论的具体问题；
- `mechanism_label`：表达呈现的体验机制；
- `label_source`：标签来源；
- `review_status`：标签流程状态。

表层话题和机制使用固定词表。信息不足时，分别使用 `other_uncertain` 和 `uncertain`。公开数据中有 47 条表层话题为空，规范化过程已统一为 `other_uncertain`，避免同一含义同时使用空值和暂时保留为不确定值。

## 9. 质量检查

每次公开数据更新执行以下检查：

### 结构检查

- 样本编号唯一；
- 证据编号唯一；
- 证据的父样本存在；
- 证据与父样本平台一致；
- 证据文本可在父样本中定位；
- 必填字段非空；
- 标签值属于编码手册。

### 文本与隐私检查

- 规范化文本重复组扫描；
- URL 扫描；
- 身份定位字段扫描；
- 公开字段白名单检查；
- 文件校验记录的行数、字段和文件哈希检查。

### 分布检查

- 每平台样本量；
- 每样本证据密度；
- 话题、机制和交叉组合分布；
- 不确定类别比例；
- 平台间编码来源差异。

分布检查用于发现采样偏差、切分偏差、规则过宽或标签塌缩。它不直接判断产品问题是否严重。

## 10. 当前公开数据的结构结果

- 360 条样本，三个平台各 120 条；
- 927 条证据，平均每条样本 2.575 条；
- 2 条样本未切出证据；
- 样本和证据编号均无重复；
- 孤立证据为 0，平台错配为 0；
- 927 条证据均能在对应公开样本中定位；
- 规范化后样本与证据文本均未发现重复组；
- 公开文件未检出 URL。

## 11. 复现命令

```bash
# 规范化公开数据到独立目录
python tools/normalize_public_dataset.py \
  --source-dir data/public \
  --output-dir artifacts/normalized_public

# 生成分析汇总
python tools/summarize_public_analysis.py \
  --public-dir data/public \
  --output artifacts/public_analysis_summary.json

# 运行离线示例流程
python tools/run_demo.py --provider mock --output artifacts/demo/run
```
