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,
# ... 其他特征
}
```
|