采用多种深度学习、机器学习算法实现目标意图识别系统——含完整项目源码

news2024/11/16 6:05:15

基于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_report

def 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_data

def 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_report

def 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_data

def 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_report

class 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 out

def 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_data

def 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'].values
    y_test = test_data['intent'].values
    
    input_dim = X_train.shape[1]
    hidden_dim = 128
    output_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_report

class 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 out

def 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_data

def 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'].values
    y_test = test_data['intent'].values
    
    input_dim = X_train.shape[1]
    hidden_dim = 128
    output_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_report

class 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 out

def 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_data

def 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'].values
    y_test = test_data['intent'].values
    
    input_dim = X_train.shape[1]
    hidden_dim = 128
    output_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_report

class IntentDataset(Dataset):
    def __init__(self, data, tokenizer, max_len):
        self.data = data
        self.tokenizer = tokenizer
        self.max_len = max_len

    def __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_labels

def 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_report

class IntentDataset(Dataset):
    def __init__(self, data, tokenizer, max_len):
        self.data = data
        self.tokenizer = tokenizer
        self.max_len = max_len

    def __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_labels

def 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2241310.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript 中的 undefined 、null 与 NaN :概念解析与对比

文章目录 💯前言💯undefined1. 什么是 undefined2. undefined 的使用场景3. undefined 的特性 💯null1. 什么是 null2. null 的使用场景3. null 的特性 💯NaN1. 什么是 NaN2. NaN 的使用场景3. NaN 的特性 💯三者的区别…

计算机网络学习笔记-3.3以太网和局域网

以太网 以太网(Ethernet)是一种用于计算机网络的技术规范,广泛应用于局域网(LAN)的构建。它定义了如何在网络设备之间传输数据,并确保这些数据能够被可靠传送。以太网是目前最常见和最广泛使用的局域网技术…

Linux篇(用户管理命令)

目录 一、用户与用户组 1. 为什么要做用户与用户组管理 2. Linux的用户及用户组 2.1. Linux的多用户多任务 2.2. 什么是用户 2.3. 什么是用户组 2.4. 用户和用户组的关系 二、用户和用户组管理 1. 用户组管理 1.1. 用户组添加 /etc/group文件结构 1.2. 用户组修改 …

2024-11-15 Element-ui的tab切换中table自适应宽度无法立即100%的问题

前言 今天在写一个统计图表的时候,将所有的table表格和echarts图表放到一个页面中,这样会在纵向上出现滚动条,上下滑动对用户体验不好,于是改成tab切换的形式 遇到的问题 正如标题所述,elementui在tab中使用table时&…

使用Git工具在GitHub的仓库中上传文件夹(超详细)

如何使用Git工具在GitHub的仓库中上传文件夹? 如果觉得博主写的还可以,点赞收藏关注噢~ 第一步:拥有一个本地的仓库 可以fork别人的仓库或者自己新创建 fork别人的仓库 或者自己创建一个仓库 按照要求填写完成后,点击按钮创建…

设计模式-Facade(门面模式)GO语言版本

前言 个人理解Facade模式其实日常生活中已经不知不觉就在使用了,基本核心内容就是暴露一些简单操作的接口,实现上将一些内容封装起来。 如上图,外界使用内部子系统时,只需要通过调用facade接口层面的功能,不需要了解子…

【隐私计算】隐私计算的应用场景探索(大模型隐私计算、隐私数据存储计算、Web3、隐私物联网等)

1. 背景分析 隐私计算作为一种实现“原始数据不出域,可用不可见”的数据流通价值的关键技术,经历了2020-2023年的高光时刻,却在2024年骤然走向低谷。从各种渠道了解到一些业内曾经风光无两的隐私计算公司都有不同程度的裁员。几乎一夜之间&am…

【提高篇】3.4 GPIO(四,工作模式详解 下)

四,模拟输入输出 上下拉电阻断开,施密特触发器关闭,双 MOS 管也关闭。该模式用于 ADC 采集或者 DAC 输出,或者低功耗下省电。但要注意的是 GPIO本身并不具备模拟输出输入的功能。 4.1 模拟输入 STM32内置ADC(模数转换器),可以将模拟信号转换为数字信号。GPIO引脚可以…

【青牛科技】D4147漏电保护电路介绍及应用

1、标题: D4147漏电保护电路 2、简介: 我司代理电源管理芯片,产品具有失效率低、可靠性高等特点。 3、具体应用: 相关产品介绍: 4、D4147 应用框图: D4147 方案介绍: 接地零线故障引起的接地…

【C++】深入理解自定义 list 容器中的 list_iterator:迭代器实现详解

个人主页: 起名字真南的CSDN博客 个人专栏: 【数据结构初阶】 📘 基础数据结构【C语言】 💻 C语言编程技巧【C】 🚀 进阶C【OJ题解】 📝 题解精讲 目录 📌 引言📌 1. 为什么 list 容器需要 list_iterator…

MuMu模拟器安卓12安装Xposed 框架

MuMu模拟器安卓12安装Xposed 框架 当开启代理后,客户端会对代理服务器证书与自身内置证书展开检测,只要检测出两者存在不一致的情况,客户端就会拒绝连接。正是这个原因,才致使我们既没有网络,又抓不到数据包。 解决方式: 通过xposed框架和trustmealready禁掉app里面校验…

MongoDB分布式集群搭建----副本集----PSS/PSA

MongoDB分布式集群 Replication 复制、Replica Set 复制集/副本集 概念 一、 副本集的相关概念 1.概念 “ A replica set is a group of mongod instances that maintain the same data set. ” 一组MongoDB服务器(多个mongod实例)(有不…

Java篇String类的常见方法

目录 一. String类的概念 1.1 String类的特性 二. 字符串的构造方式 三. 常用方法 3.1 字符串查找 3.2 字符串转换 3.3 字符串比较 3.3.1 equals( )方法 3.3.2 compare To( )方法 3.3.3 compare ToIgnoreCase( )方法 3.4 字符串替换 3.4.1 replace( )方法 3.4.2 r…

「QT」文件类 之 QDataStream 数据流类

✨博客主页何曾参静谧的博客📌文章专栏「QT」QT5程序设计📚全部专栏「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合「C/C」C/C程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定制…

MySQL45讲 第二十三讲 是怎么保证数据不丢的?

文章目录 MySQL45讲 第二十三讲 是怎么保证数据不丢的?一、binlog 写入机制(一)事务执行与 binlog cache(二)事务提交与 binlog 文件写入 二、redo log 写入机制(一)事务执行与 redo log buffer…

pgaudit插件-pgslq

使用pgaudit插件 一.介绍 postgresql可以通过log_statementall 提供日志审计,但是无法详细的提供日志信息,使用ogaudit能够提供详细的会话和对象审计日志,是PG的一个扩展插件 注意:pgAudit可能会生成大量日志。请谨慎确定要在您…

系统掌握大语言模型提示词 - 从理论到实践

以下是我目前的一些主要个人标签: 6 年多头部大厂软件开发经验;1 年多 AI 业务应用经验,拥有丰富的业务提示词调优经验和模型微调经验。信仰 AGI,已经将 AI 通过自定义 Chatbot /搭建 Agent 融合到我的工作流中。头部大厂技术大学…

Vue 项目打包后环境变量丢失问题(清除缓存),区分.env和.env.*文件

Vue 项目打包后环境变量丢失问题(清除缓存),区分.env和.env.*文件 问题背景 今天在导报项目的时候遇到一个问题问题:在开发环境中一切正常,但在打包后的生产环境中,某些环境变量(如 VUE_APP_B…

群控系统服务端开发模式-应用开发-前端菜单功能开发

今天优先开发菜单及角色,明天将开发岗位配置、级别配置等功能。具体看下图 而前端的路由不需要手动添加,是依据数据库里面存储的路径。 一、添加视图 在根目录下src文件夹下views文件夹下permission文件夹下menu文件夹下,新建index.vue&…

数据结构Python版

2.3.3 双链表 双链表和链表一样,只不过每个节点有两个链接——一个指向后一个节点,一个指向前一个节点。此外,除了第一个节点,双链表还需要记录最后一个节点。 每个结点为DLinkNode类对象,包括存储元素的列表data、…