目标:提取相关实体,利用上述模型构建因果关系抽取模型,得到召回值,F1值,准确率。
已经有了LDA筛选后的文本数据,后续该怎么用这些数据给这个模型得到结果

目标:提取相关实体,利用上述模型构建因果关系抽取模型,得到召回值,F1值,准确率。
已经有了LDA筛选后的文本数据,后续该怎么用这些数据给这个模型得到结果

晚上好🌙🌙🌙
本答案参考通义千问
关于使用 BERT-BiLSTM-CRF 模型进行实体抽取,并进一步构建 因果关系抽取模型,最终获得 召回率(Recall)、F1值、准确率(Accuracy) 的目标,以下是详细的步骤说明和建议。
在你已经完成 LDA 筛选后的文本数据的基础上,可以按照以下步骤进行 BERT-BiLSTM-CRF 模型的训练与评估:
B-Causal、I-Causal、O 等)。例如,标注格式如下:
| 文本 | 标签 | |------|------| | 这个实验导致了结果的变化。 | B-Causal O O O O O O |
其中:
B-Causal 表示因果关系实体的开始。I-Causal 表示因果关系实体的中间或结尾。O 表示非实体。如果没有现成的标注数据,可以手动标注一部分,或者使用工具(如 Label Studio)辅助标注。
import torch
from transformers import BertModel, BertTokenizer
from torchcrf import CRF
class BERT_BiLSTM_CRF(torch.nn.Module):
def __init__(self, num_tags):
super(BERT_BiLSTM_CRF, self).__init__()
self.bert = BertModel.from_pretrained('bert-base-uncased')
self.lstm = torch.nn.LSTM(self.bert.config.hidden_size, 128, bidirectional=True)
self.fc = torch.nn.Linear(256, num_tags) # 256 是 BiLSTM 输出维度
self.crf = CRF(num_tags)
def forward(self, input_ids, attention_mask, labels=None):
outputs = self.bert(input_ids=input_ids, attention_mask=attention_mask)
sequence_output = outputs.last_hidden_state # [batch_size, seq_len, hidden_size]
# LSTM 处理
lstm_out, _ = self.lstm(sequence_output)
logits = self.fc(lstm_out) # [batch_size, seq_len, num_tags]
if labels is not None:
loss = -self.crf(logits, labels, mask=attention_mask.byte())
return loss
else:
preds = self.crf.decode(logits)
return preds
from torch.utils.data import Dataset, DataLoader
class TextDataset(Dataset):
def __init__(self, texts, labels, tokenizer, max_len=128):
self.texts = texts
self.labels = labels
self.tokenizer = tokenizer
self.max_len = max_len
def __len__(self):
return len(self.texts)
def __getitem__(self, idx):
text = self.texts[idx]
label = self.labels[idx]
encoding = self.tokenizer(
text,
truncation=True,
padding='max_length',
max_length=self.max_len,
return_tensors='pt'
)
return {
'input_ids': encoding['input_ids'].flatten(),
'attention_mask': encoding['attention_mask'].flatten(),
'labels': torch.tensor(label, dtype=torch.long)
}
# 示例
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
dataset = TextDataset(texts, labels, tokenizer)
dataloader = DataLoader(dataset, batch_size=8, shuffle=True)
model = BERT_BiLSTM_CRF(num_tags=3) # 假设有 3 种标签:B-Causal, I-Causal, O
optimizer = torch.optim.Adam(model.parameters(), lr=2e-5)
for epoch in range(3): # 3 个训练轮次
for batch in dataloader:
input_ids = batch['input_ids']
attention_mask = batch['attention_mask']
labels = batch['labels']
model.zero_grad()
loss = model(input_ids, attention_mask, labels)
loss.backward()
optimizer.step()
# 测试阶段
test_dataset = TextDataset(test_texts, test_labels, tokenizer)
test_dataloader = DataLoader(test_dataset, batch_size=1)
y_true = []
y_pred = []
with torch.no_grad():
for batch in test_dataloader:
input_ids = batch['input_ids']
attention_mask = batch['attention_mask']
labels = batch['labels']
predictions = model(input_ids, attention_mask)
y_true.extend(labels.numpy().tolist())
y_pred.extend(predictions[0].numpy().tolist())
# 计算评估指标
from sklearn.metrics import classification_report
print(classification_report(y_true, y_pred))
| 指标 | 含义 | |------------|----------------------------------| | 准确率 | 预测正确的样本数 / 总样本数 | | 精确率 | 正确预测为正类的样本数 / 所有预测为正类的样本数 | | 召回率 | 正确预测为正类的样本数 / 所有实际为正类的样本数 | | F1 值 | 精确率和召回率的调和平均值 |
一旦你能够从文本中成功识别出 因果关系实体(如“导致”、“引发”等),下一步可以构建 因果关系抽取模型,例如:
如果你有具体的代码实现问题或数据格式问题,欢迎继续提问!