File size: 5,415 Bytes
f43af3c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
# 评论罗伯特特征使用指南

## 概述

本指南说明如何在EasyTPP框架中使用RobotTHP模型,并加载语义特征、偏差特征等自定义特征。

## 文件说明

1. **robert_dataset.py**: 扩展的TPPDataset,支持加载语义特征、偏差特征等
2. **robert_tokenizer.py**: 扩展的EventTokenizer,支持自定义特征的padding和批处理
3. **train_robot_thp_with_features.py**: 完整的使用示例

## 数据格式

### 输入数据字典格式

```python
data_dict = {
    'time_seqs': [[0.0, 10.5, 25.3], ...],  # 时间序列列表
    'type_seqs': [[0, 1, 2], ...],          # 事件类型序列列表
    'time_delta_seqs': [[0.0, 10.5, 14.8], ...],  # 时间间隔序列列表
    'semantic_vectors': [[[0.1]*768, [0.2]*768], ...],  # 语义向量(可选)
    'deviation_features': [[[0.0, 0.0, 0.0], [0.7, 0.5, 0.3]], ...],  # 偏差特征(可选)
    'is_spontaneous': [[-1.0, 1.0, -1.0], ...]  # 自发/被@标记(可选)
}
```

### 特征说明

- **semantic_vectors**: `[num_seqs, seq_len, semantic_dim]`,BERT语义向量
- **deviation_features**: `[num_seqs, seq_len, 3]`,偏差特征 [语境偏差, 情感偏差, 困惑度]
- **is_spontaneous**: `[num_seqs, seq_len]`,标记值:
  - `-1.0`: 不适用(非罗伯特评论)
  - `0.0`: 被@(罗伯特被原帖作者@)
  - `1.0`: 自发(罗伯特自发评论)

## 使用方法

### 1. 准备数据

```python
from easy_tpp.preprocess.robert_dataset import RobertTPPDataset

# 准备数据字典
data_dict = {
    'time_seqs': [...],
    'type_seqs': [...],
    'time_delta_seqs': [...],
    'semantic_vectors': [...],  # 可选
    'deviation_features': [...],  # 可选
    'is_spontaneous': [...]  # 可选
}

# 创建数据集
dataset = RobertTPPDataset(data_dict)
```

### 2. 创建分词器

```python
from easy_tpp.preprocess.robert_tokenizer import RobertEventTokenizer
from easy_tpp.config_factory import DataSpecConfig

config = DataSpecConfig.parse_from_yaml_config({
    'num_event_types': 4,
    'batch_size': 32,
    'pad_token_id': 4
})

tokenizer = RobertEventTokenizer(
    config,
    use_semantic=True,      # 是否使用语义特征
    use_deviation=True,      # 是否使用偏差特征
    semantic_dim=768        # 语义向量维度
)
```

### 3. 创建数据加载器

```python
from easy_tpp.preprocess.data_collator import TPPDataCollator
from torch.utils.data import DataLoader

data_collator = TPPDataCollator(
    tokenizer=tokenizer,
    return_tensors='pt',
    max_length=tokenizer.model_max_length,
    padding=True,
    truncation=False
)

data_loader = DataLoader(
    dataset,
    collate_fn=data_collator,
    batch_size=32,
    shuffle=True
)
```

### 4. 在模型中使用

RobotTHP模型的`loglike_loss`方法会自动从batch中提取这些特征:

```python
from easy_tpp.model import TorchRobotTHP

model = TorchRobotTHP(model_config)

for batch in data_loader:
    batch_values = batch.values()  # 转换为tuple/list
    loss, num_events = model.loglike_loss(batch_values)
```

## 批次格式

批次数据格式(tuple/list):
```python
batch = (
    time_seqs,           # [0] [batch_size, seq_len]
    time_delta_seqs,     # [1] [batch_size, seq_len]
    type_seqs,           # [2] [batch_size, seq_len]
    batch_non_pad_mask,  # [3] [batch_size, seq_len]
    attention_mask,      # [4] [batch_size, seq_len, seq_len]
    semantic_vectors,    # [5] [batch_size, seq_len, semantic_dim] (可选)
    deviation_features,  # [6] [batch_size, seq_len, 3] (可选)
    is_spontaneous,      # [7] [batch_size, seq_len] (可选)
    structure_mask       # [8] [batch_size, seq_len, seq_len] (可选)
)
```

## 完整示例

参考 `examples/train_robot_thp_with_features.py` 获取完整的使用示例。

## 注意事项

1. **特征对齐**: 确保所有特征序列的长度与时间序列一致
2. **Padding值**: 
   - 语义向量和偏差特征:padding使用0.0
   - is_spontaneous:padding使用-1.0(不适用)
3. **可选特征**: 如果某个特征未提供,模型会自动跳过该特征的处理
4. **配置一致性**: 确保模型配置中的`use_semantic`和`use_deviation`与tokenizer设置一致

## 与标准EasyTPP的集成

要完全集成到EasyTPP框架中,需要:

1. **自定义数据加载器**: 继承`TPPDataLoader`并重写`_build_input_from_json`方法
2. **配置文件**: 在配置文件中指定使用自定义数据集和分词器
3. **模型配置**: 设置`use_semantic=True`和`use_deviation=True`

## 从JSON文件加载

如果你的数据是JSON格式,可以参考以下方式加载:

```python
import json
import numpy as np

# 加载JSON数据
with open('your_data.json', 'r') as f:
    json_data = json.load(f)

# 提取特征
time_seqs = [[event['time_since_start'] for event in seq] for seq in json_data]
type_seqs = [[event['type_event'] for event in seq] for seq in json_data]
time_delta_seqs = [[event['time_since_last_event'] for event in seq] for seq in json_data]

# 提取语义特征(如果存在)
semantic_vectors = None
if 'semantic_vectors' in json_data[0][0]:
    semantic_vectors = [[event['semantic_vectors'] for event in seq] for seq in json_data]

# 创建数据字典
data_dict = {
    'time_seqs': time_seqs,
    'type_seqs': type_seqs,
    'time_delta_seqs': time_delta_seqs,
    'semantic_vectors': semantic_vectors,
    # ... 其他特征
}
```