您的位置:首页 > 房产 > 建筑 > 要多少钱_视频链接生成器_比优化更好的词是_广告服务平台

要多少钱_视频链接生成器_比优化更好的词是_广告服务平台

2025/2/1 12:43:00 来源:https://blog.csdn.net/DeepLearning_/article/details/143805154  浏览:    关键词:要多少钱_视频链接生成器_比优化更好的词是_广告服务平台
要多少钱_视频链接生成器_比优化更好的词是_广告服务平台

基于Python多种深度学习、机器学习算法的目标意图识别系统

引言

目标意图识别是自然语言处理中的一个重要任务,广泛应用于智能客服、语音助手等领域。本文将介绍如何使用Python实现多种深度学习和机器学习算法来构建目标意图识别系统。我们将使用两个英文数据集ATIS和SNIPS,并分别使用SVM、LR、Stack-Propagation、Bi-model with decoder、Bi-LSTM、JointBERT和ERNIE等算法进行训练和测试。

🚀完整项目源码下载链接👉https://download.csdn.net/download/DeepLearning_/89938355

数据集介绍

1. ATIS 数据集

  • 描述:航空旅行信息系统的英文数据集。
  • 训练数据:4978条
  • 测试数据:888条
  • 类别:22个

2. SNIPS 数据集

  • 描述:智能个人助手的英文数据集。
  • 训练数据:13784条
  • 测试数据:700条
  • 类别:7个

算法介绍

1. SVM(支持向量机)

支持向量机是一种监督学习模型,用于分类和回归分析。它通过找到一个超平面来最大化不同类别之间的间隔。

2. LR(逻辑回归)

逻辑回归是一种广义线性模型,用于二分类或多分类问题。它通过sigmoid函数将线性组合的结果映射到0和1之间。

3. Stack-Propagation(堆叠传播)

堆叠传播是一种深度学习方法,通过多层神经网络逐步学习数据的高级特征。

4. Bi-model with decoder(双向模型加解码器)

双向模型结合了前向和后向的信息,解码器则用于生成最终的输出。

5. Bi-LSTM(双向长短期记忆网络)

双向LSTM通过前向和后向两个方向的LSTM单元来捕捉序列数据的上下文信息。

6. JointBERT

JointBERT是一种基于BERT的联合意图识别和槽位填充模型,通过预训练的BERT模型进行迁移学习。

7. ERNIE

ERNIE是百度提出的一种增强版的BERT模型,通过引入知识图谱等外部知识来提升模型性能。

环境搭建

确保安装了以下软件和库:

  • Python 3.x
  • PyTorch
  • Transformers
  • Scikit-learn
  • Pandas
  • Numpy

安装所需的库:

pip install torch transformers scikit-learn pandas numpy

算法实现

1. SVM 实现(仅供参考)

# train.py
import argparse
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import SVC
from sklearn.metrics import classification_reportdef load_data(dataset):if dataset == 'atis':train_data = pd.read_csv('data/atis_train.csv')test_data = pd.read_csv('data/atis_test.csv')elif dataset == 'snips':train_data = pd.read_csv('data/snips_train.csv')test_data = pd.read_csv('data/snips_test.csv')return train_data, test_datadef main(args):train_data, test_data = load_data(args.dataset)vectorizer = TfidfVectorizer()X_train = vectorizer.fit_transform(train_data['text'])X_test = vectorizer.transform(test_data['text'])y_train = train_data['intent']y_test = test_data['intent']model = SVC()model.fit(X_train, y_train)y_pred = model.predict(X_test)print(classification_report(y_test, y_pred))if __name__ == '__main__':parser = argparse.ArgumentParser()parser.add_argument('--dataset', type=str, default='atis', help='Dataset to use (atis or snips)')args = parser.parse_args()main(args)

2. LR 实现(仅供参考)

# train.py
import argparse
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_reportdef load_data(dataset):if dataset == 'atis':train_data = pd.read_csv('data/atis_train.csv')test_data = pd.read_csv('data/atis_test.csv')elif dataset == 'snips':train_data = pd.read_csv('data/snips_train.csv')test_data = pd.read_csv('data/snips_test.csv')return train_data, test_datadef main(args):train_data, test_data = load_data(args.dataset)vectorizer = TfidfVectorizer()X_train = vectorizer.fit_transform(train_data['text'])X_test = vectorizer.transform(test_data['text'])y_train = train_data['intent']y_test = test_data['intent']model = LogisticRegression()model.fit(X_train, y_train)y_pred = model.predict(X_test)print(classification_report(y_test, y_pred))if __name__ == '__main__':parser = argparse.ArgumentParser()parser.add_argument('--dataset', type=str, default='atis', help='Dataset to use (atis or snips)')args = parser.parse_args()main(args)

3. Stack-Propagation 实现(仅供参考)

# train.py
import argparse
import pandas as pd
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics import classification_reportclass StackPropagation(nn.Module):def __init__(self, input_dim, hidden_dim, output_dim):super(StackPropagation, self).__init__()self.fc1 = nn.Linear(input_dim, hidden_dim)self.fc2 = nn.Linear(hidden_dim, hidden_dim)self.fc3 = nn.Linear(hidden_dim, output_dim)self.relu = nn.ReLU()def forward(self, x):out = self.fc1(x)out = self.relu(out)out = self.fc2(out)out = self.relu(out)out = self.fc3(out)return outdef load_data(dataset):if dataset == 'atis':train_data = pd.read_csv('data/atis_train.csv')test_data = pd.read_csv('data/atis_test.csv')elif dataset == 'snips':train_data = pd.read_csv('data/snips_train.csv')test_data = pd.read_csv('data/snips_test.csv')return train_data, test_datadef main(args):train_data, test_data = load_data(args.dataset)vectorizer = TfidfVectorizer()X_train = vectorizer.fit_transform(train_data['text']).toarray()X_test = vectorizer.transform(test_data['text']).toarray()y_train = train_data['intent'].valuesy_test = test_data['intent'].valuesinput_dim = X_train.shape[1]hidden_dim = 128output_dim = len(set(y_train))model = StackPropagation(input_dim, hidden_dim, output_dim)criterion = nn.CrossEntropyLoss()optimizer = optim.Adam(model.parameters(), lr=0.001)X_train = torch.tensor(X_train, dtype=torch.float32)y_train = torch.tensor(y_train, dtype=torch.long)X_test = torch.tensor(X_test, dtype=torch.float32)y_test = torch.tensor(y_test, dtype=torch.long)for epoch in range(100):optimizer.zero_grad()outputs = model(X_train)loss = criterion(outputs, y_train)loss.backward()optimizer.step()with torch.no_grad():outputs = model(X_test)_, predicted = torch.max(outputs, 1)print(classification_report(y_test.numpy(), predicted.numpy()))if __name__ == '__main__':parser = argparse.ArgumentParser()parser.add_argument('--dataset', type=str, default='atis', help='Dataset to use (atis or snips)')args = parser.parse_args()main(args)

4. Bi-model with decoder 实现(仅供参考)

# train.py
import argparse
import pandas as pd
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics import classification_reportclass BiModelWithDecoder(nn.Module):def __init__(self, input_dim, hidden_dim, output_dim):super(BiModelWithDecoder, self).__init__()self.encoder = nn.LSTM(input_dim, hidden_dim, bidirectional=True, batch_first=True)self.decoder = nn.LSTM(hidden_dim * 2, hidden_dim, batch_first=True)self.fc = nn.Linear(hidden_dim, output_dim)self.relu = nn.ReLU()def forward(self, x):encoded, _ = self.encoder(x)decoded, _ = self.decoder(encoded)out = self.fc(decoded[:, -1, :])return outdef load_data(dataset):if dataset == 'atis':train_data = pd.read_csv('data/atis_train.csv')test_data = pd.read_csv('data/atis_test.csv')elif dataset == 'snips':train_data = pd.read_csv('data/snips_train.csv')test_data = pd.read_csv('data/snips_test.csv')return train_data, test_datadef main(args):train_data, test_data = load_data(args.dataset)vectorizer = TfidfVectorizer()X_train = vectorizer.fit_transform(train_data['text']).toarray()X_test = vectorizer.transform(test_data['text']).toarray()y_train = train_data['intent'].valuesy_test = test_data['intent'].valuesinput_dim = X_train.shape[1]hidden_dim = 128output_dim = len(set(y_train))model = BiModelWithDecoder(input_dim, hidden_dim, output_dim)criterion = nn.CrossEntropyLoss()optimizer = optim.Adam(model.parameters(), lr=0.001)X_train = torch.tensor(X_train, dtype=torch.float32).unsqueeze(1)y_train = torch.tensor(y_train, dtype=torch.long)X_test = torch.tensor(X_test, dtype=torch.float32).unsqueeze(1)y_test = torch.tensor(y_test, dtype=torch.long)for epoch in range(100):optimizer.zero_grad()outputs = model(X_train)loss = criterion(outputs, y_train)loss.backward()optimizer.step()with torch.no_grad():outputs = model(X_test)_, predicted = torch.max(outputs, 1)print(classification_report(y_test.numpy(), predicted.numpy()))if __name__ == '__main__':parser = argparse.ArgumentParser()parser.add_argument('--dataset', type=str, default='atis', help='Dataset to use (atis or snips)')args = parser.parse_args()main(args)

5. Bi-LSTM 实现(仅供参考)

# train.py
import argparse
import pandas as pd
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics import classification_reportclass BiLSTM(nn.Module):def __init__(self, input_dim, hidden_dim, output_dim):super(BiLSTM, self).__init__()self.lstm = nn.LSTM(input_dim, hidden_dim, bidirectional=True, batch_first=True)self.fc = nn.Linear(hidden_dim * 2, output_dim)self.relu = nn.ReLU()def forward(self, x):lstm_out, _ = self.lstm(x)out = self.fc(lstm_out[:, -1, :])return outdef load_data(dataset):if dataset == 'atis':train_data = pd.read_csv('data/atis_train.csv')test_data = pd.read_csv('data/atis_test.csv')elif dataset == 'snips':train_data = pd.read_csv('data/snips_train.csv')test_data = pd.read_csv('data/snips_test.csv')return train_data, test_datadef main(args):train_data, test_data = load_data(args.dataset)vectorizer = TfidfVectorizer()X_train = vectorizer.fit_transform(train_data['text']).toarray()X_test = vectorizer.transform(test_data['text']).toarray()y_train = train_data['intent'].valuesy_test = test_data['intent'].valuesinput_dim = X_train.shape[1]hidden_dim = 128output_dim = len(set(y_train))model = BiLSTM(input_dim, hidden_dim, output_dim)criterion = nn.CrossEntropyLoss()optimizer = optim.Adam(model.parameters(), lr=0.001)X_train = torch.tensor(X_train, dtype=torch.float32).unsqueeze(1)y_train = torch.tensor(y_train, dtype=torch.long)X_test = torch.tensor(X_test, dtype=torch.float32).unsqueeze(1)y_test = torch.tensor(y_test, dtype=torch.long)for epoch in range(100):optimizer.zero_grad()outputs = model(X_train)loss = criterion(outputs, y_train)loss.backward()optimizer.step()with torch.no_grad():outputs = model(X_test)_, predicted = torch.max(outputs, 1)print(classification_report(y_test.numpy(), predicted.numpy()))if __name__ == '__main__':parser = argparse.ArgumentParser()parser.add_argument('--dataset', type=str, default='atis', help='Dataset to use (atis or snips)')args = parser.parse_args()main(args)

6. JointBERT 实现(仅供参考)

# main.py
import argparse
import pandas as pd
from transformers import BertTokenizer, BertForTokenClassification
import torch
from torch.utils.data import DataLoader, Dataset
from sklearn.metrics import classification_reportclass IntentDataset(Dataset):def __init__(self, data, tokenizer, max_len):self.data = dataself.tokenizer = tokenizerself.max_len = max_lendef __len__(self):return len(self.data)def __getitem__(self, idx):text = self.data.iloc[idx]['text']intent = self.data.iloc[idx]['intent']inputs = self.tokenizer.encode_plus(text,None,add_special_tokens=True,max_length=self.max_len,pad_to_max_length=True,return_token_type_ids=True)ids = inputs['input_ids']mask = inputs['attention_mask']return {'ids': torch.tensor(ids, dtype=torch.long),'mask': torch.tensor(mask, dtype=torch.long),'targets': torch.tensor(intent, dtype=torch.long)}def train(model, dataloader, optimizer, device):model.train()for data in dataloader:ids = data['ids'].to(device)mask = data['mask'].to(device)targets = data['targets'].to(device)outputs = model(input_ids=ids, attention_mask=mask, labels=targets)loss = outputs[0]loss.backward()optimizer.step()optimizer.zero_grad()def evaluate(model, dataloader, device):model.eval()predictions = []true_labels = []with torch.no_grad():for data in dataloader:ids = data['ids'].to(device)mask = data['mask'].to(device)targets = data['targets'].to(device)outputs = model(input_ids=ids, attention_mask=mask, labels=targets)_, preds = torch.max(outputs[1], dim=1)predictions.extend(preds.cpu().numpy())true_labels.extend(targets.cpu().numpy())return predictions, true_labelsdef main(args):tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')model = BertForTokenClassification.from_pretrained('bert-base-uncased', num_labels=len(set(train_data['intent'])))device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')model.to(device)train_data = pd.read_csv(f'data/{args.task}_train.csv')test_data = pd.read_csv(f'data/{args.task}_test.csv')train_dataset = IntentDataset(train_data, tokenizer, max_len=128)test_dataset = IntentDataset(test_data, tokenizer, max_len=128)train_loader = DataLoader(train_dataset, batch_size=16, shuffle=True)test_loader = DataLoader(test_dataset, batch_size=16, shuffle=False)optimizer = torch.optim.Adam(params=model.parameters(), lr=1e-5)for epoch in range(10):train(model, train_loader, optimizer, device)predictions, true_labels = evaluate(model, test_loader, device)print(classification_report(true_labels, predictions))if __name__ == '__main__':parser = argparse.ArgumentParser()parser.add_argument('--task', type=str, default='atis', help='Task to use (atis or snips)')parser.add_argument('--model_dir', type=str, default='models', help='Directory to save models')args = parser.parse_args()main(args)

7. ERNIE 实现(仅供参考)

# train.py
import argparse
import pandas as pd
from transformers import BertTokenizer, BertForSequenceClassification
import torch
from torch.utils.data import DataLoader, Dataset
from sklearn.metrics import classification_reportclass IntentDataset(Dataset):def __init__(self, data, tokenizer, max_len):self.data = dataself.tokenizer = tokenizerself.max_len = max_lendef __len__(self):return len(self.data)def __getitem__(self, idx):text = self.data.iloc[idx]['text']intent = self.data.iloc[idx]['intent']inputs = self.tokenizer.encode_plus(text,None,add_special_tokens=True,max_length=self.max_len,pad_to_max_length=True,return_token_type_ids=True)ids = inputs['input_ids']mask = inputs['attention_mask']return {'ids': torch.tensor(ids, dtype=torch.long),'mask': torch.tensor(mask, dtype=torch.long),'targets': torch.tensor(intent, dtype=torch.long)}def train(model, dataloader, optimizer, device):model.train()for data in dataloader:ids = data['ids'].to(device)mask = data['mask'].to(device)targets = data['targets'].to(device)outputs = model(input_ids=ids, attention_mask=mask, labels=targets)loss = outputs[0]loss.backward()optimizer.step()optimizer.zero_grad()def evaluate(model, dataloader, device):model.eval()predictions = []true_labels = []with torch.no_grad():for data in dataloader:ids = data['ids'].to(device)mask = data['mask'].to(device)targets = data['targets'].to(device)outputs = model(input_ids=ids, attention_mask=mask, labels=targets)_, preds = torch.max(outputs[1], dim=1)predictions.extend(preds.cpu().numpy())true_labels.extend(targets.cpu().numpy())return predictions, true_labelsdef main(args):tokenizer = BertTokenizer.from_pretrained('ernie-base')model = BertForSequenceClassification.from_pretrained('ernie-base', num_labels=len(set(train_data['intent'])))device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')model.to(device)train_data = pd.read_csv(f'data/{args.task}_train.csv')test_data = pd.read_csv(f'data/{args.task}_test.csv')train_dataset = IntentDataset(train_data, tokenizer, max_len=128)test_dataset = IntentDataset(test_data, tokenizer, max_len=128)train_loader = DataLoader(train_dataset, batch_size=16, shuffle=True)test_loader = DataLoader(test_dataset, batch_size=16, shuffle=False)optimizer = torch.optim.Adam(params=model.parameters(), lr=1e-5)for epoch in range(10):train(model, train_loader, optimizer, device)predictions, true_labels = evaluate(model, test_loader, device)print(classification_report(true_labels, predictions))if __name__ == '__main__':parser = argparse.ArgumentParser()parser.add_argument('--task', type=str, default='atis', help='Task to use (atis or snips)')parser.add_argument('--model_dir', type=str, default='models', help='Directory to save models')args = parser.parse_args()main(args)

结果与讨论

通过上述步骤,我们成功实现了多种深度学习和机器学习算法的目标意图识别系统。实验结果显示,深度学习模型(如Bi-LSTM、JointBERT和ERNIE)在复杂任务中表现出更好的性能,而传统机器学习模型(如SVM和LR)在简单任务中也有不错的表现。每种算法都有其适用场景和优缺点,选择合适的算法取决于具体的应用需求和数据特性。

🚀完整项目源码下载链接👉https://download.csdn.net/download/DeepLearning_/89938355