P with Spacy:自定义文本分类管道

news2024/7/6 18:47:12

一、说明

        Spacy 是一个功能强大的 NLP 库,其中许多 NLP 任务(如标记化、词干提取、词性标记和命名实体解析)均通过预训练模型提供开箱即用的功能。所有这些任务都由管道对象以及逐步应用于给定文本的不同函数的内部抽象来包装。该管道可以通过自编写的函数进行定制和扩展。

        在本文中,您将了解如何将文本分类添加到 Spacy 管道。给定带有文档和标签的训练数据,额外的分类任务可以学习预测其他文档的标签。您将了解如何构建训练数据、如何使用分类步骤扩展默认管道,以及如何添加您自己的分类实现。

        本文的技术背景是Python v3.11 和spacy v3.7.2。所有示例也应该适用于较新的库版本。

        本文最初出现在我的博客admantium.com。

二、自定义 Spacy 管道示例

注意:以下所有解释和代码片段均来自三个来源:官方 Rasa API 文档、关于 使用 Spacy 3.0 进行文本分类的博客文章,以及一篇关于构建生产级 Spacy 文本分类的博客文章。

添加文本分类任务可归结为以下步骤:

  1. 准备训练数据
  2. 将训练数据转换为 Spacy DocBin 对象
  3. 创建默认文本分类配置
  4. 训练模型
  5. 使用模型

以下部分详细介绍了这些步骤。

三、步骤一:准备训练数据

        训练数据需要是原始文本及其单标签或多标签类别。让我们通过使用 NLTK 库中包含的路透社新闻数据集来实现这一点。

以下代码片段显示了如何加载数据集,然后打印文本及其类别。


from nltk.corpus import reuters

print(len(reuters.fileids()))
# 10788

print(reuters.raw(reuters.fileids()[42]))
# JAPAN GIVEN LITTLE HOPE OF AVOIDING U.S. SANCTIONS
#  A top U.S. Official said Japan has little
#  chance of persuading the U.S. to drop threatened trade
#  sanctions, despite the efforts of a Japanese team that left for
#  Washington today.

print(reuters.categories(reuters.fileids()[42]))
# ['trade']

该数据集共有 90 个类别。此外,有些文章有多个标签。

print(len(reuters.categories()))
# 90

print(reuters.categories())
# ['acq', 'alum', 'barley', 'bop', 'carcass', 'castor-oil', 'cocoa', 'coconut', 'coconut-oil', 'coffee', 'copper', 'copra-cake', 'corn', 'cotton', 'cotton-oil', 'cpi', 'cpu', 'crude', 'dfl', 'dlr', 'dmk', 'earn', 'fuel', 'gas', 'gnp', 'gold', 'grain', 'groundnut', 'groundnut-oil', 'heat', 'hog', 'housing', 'income', 'instal-debt', 'interest', 'ipi', 'iron-steel', 'jet', 'jobs', 'l-cattle', 'lead', 'lei', 'lin-oil', 'livestock', 'lumber', 'meal-feed', 'money-fx', 'money-supply', 'naphtha', 'nat-gas', 'nickel', 'nkr', 'nzdlr', 'oat', 'oilseed', 'orange', 'palladium', 'palm-oil', 'palmkernel', 'pet-chem', 'platinum', 'potato', 'propane', 'rand', 'rape-oil', 'rapeseed', 'reserves', 'retail', 'rice', 'rubber', 'rye', 'ship', 'silver', 'sorghum', 'soy-meal', 'soy-oil', 'soybean', 'strategic-metal', 'sugar', 'sun-meal', 'sun-oil', 'sunseed', 'tea', 'tin', 'trade', 'veg-oil', 'wheat', 'wpi', 'yen', 'zinc']

四、步骤 2:将训练数据转换为 Spacy DocBin 对象

        Spacy 要求其输入数据集使用附加的 属性来预处理 Doc 对象。类别应该是一个 对象,其中键是类别,值反映该类别是否适用于文章。这是一个整数值。catsdict

以下是如何转换路透社新闻数据集第一篇文章的示例:

nlp = spacy.load('en_core_web_lg')

fileid = reuters.fileids()[42]
cat_dict = {cat: 0 for cat in reuters.categories()}

doc1 = nlp.make_doc(reuters.raw(fileid))
for cat in reuters.categories(fileid):
  cat_dict[cat] = 1

doc1.cats = cat_dict

print(doc1.cats)
# {'acq': 0, 'alum': 0, 'barley': 0, 'bop': 0, ..., 'trade': 1, ...}

此外,数据需要转换为Spacy自定义数据对象DocBin。预计数据需要分为训练和测试,以下方法创建多标签分类,其中 doc 对象处理每篇文章的原始文本,并包含 dict 所有适用类别的对象。

    
def convert_multi_label(dataset, filename):
    db = DocBin()
    nlp = spacy.load('en_core_web_lg')
    total = len(dataset)
    print(f'{time()}: start processing {filename} with {total} files')

for index, fileid in enumerate(dataset):
        print(f'Processing {index+1}/{total}')
        cat_dict = {cat: 0 for cat in reuters.categories()}
        for cat in reuters.categories(fileid):
            cat_dict[cat] = 1
        doc = nlp(get_text(fileid))
        doc.cats = cat_dict
        db.add(doc)
    print(f'{time()}: finish processing {filename}')
    db.to_disk(filename)

#convert(training, 'reuters_training.spacy')

convert_multi_label(training, 'reuters_training_multi_label.spacy')
# 1688400699.331844: start processing reuters_training_single_label.spacy with 7769 files
# Processing 1/7769
# Processing 2/7769
# ...

二进制文件的预览:

五、步骤 3:创建默认文本分类配置

Spacy 提供了一个方便的命令行界面来创建用于多种目的的默认配置文件。从 spacy init config 开始,可以添加额外的 pipeline 步骤。对于分类,两个可能的值是 textcat(针对单标签)和 textcat_multilabel(针对多标签分类)。此外,通过包含选项 --optimize accuracy,训练过程将使用预训练模型中的词向量来表示文本。

这些考虑因素导致以下命令:

> python -m spacy init config --pipeline textcat_multilabel --optimize accuracy spacy_categorization_pipeline.cfg

2023-07-02 13:26:37.103543: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.
To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.
ℹ Generated config template specific for your use case
- Language: en
- Pipeline: textcat
- Optimize for: efficiency
- Hardware: CPU
- Transformer: None
✔ Auto-filled config with all values
✔ Saved config
spacy_categorization_pipeline.cfg
You can now add your data and train your pipeline:
python -m spacy train spacy_categorization_pipeline.cfg --paths.train ./train.spacy --paths.dev ./dev.spacy

让我们看一下这个文件的某些部分:

[paths]
train = null
dev = null
vectors = "en_core_web_lg"
init_tok2vec = null

#...
[nlp]
lang = "en"
pipeline = ["tok2vec","textcat_multilabel"]
batch_size = 1000
disabled = []
before_creation = null
after_creation = null
after_pipeline_creation = null
tokenizer = {"@tokenizers":"spacy.Tokenizer.v1"}

[components]
[components.textcat_multilabel]
factory = "textcat_multilabel"
scorer = {"@scorers":"spacy.textcat_multilabel_scorer.v2"}
threshold = 0.5
[components.textcat_multilabel.model]
@architectures = "spacy.TextCatEnsemble.v2"
nO = null
[components.textcat_multilabel.model.tok2vec]
@architectures = "spacy.Tok2VecListener.v1"
width = ${components.tok2vec.model.encode.width}
upstream = "*"
[components.tok2vec]
factory = "tok2vec"
[components.tok2vec.model]
@architectures = "spacy.Tok2Vec.v2"
#...

[training]
dev_corpus = "corpora.dev"
train_corpus = "corpora.train"
seed = ${system.seed}
gpu_allocator = ${system.gpu_allocator}
dropout = 0.1
accumulate_gradient = 1
patience = 1600
max_epochs = 0
max_steps = 20000
eval_frequency = 200
frozen_components = []
annotating_components = []
before_to_disk = null
before_update = null
#...

[training.logger]
@loggers = "spacy.ConsoleLogger.v1"
progress_bar = false
[training.optimizer]
@optimizers = "Adam.v1"
beta1 = 0.9
beta2 = 0.999
L2_is_weight_decay = true
L2 = 0.01
grad_clip = 1.0
use_averages = false
eps = 0.00000001
learn_rate = 0.001

此配置公开了所有与训练相关的参数,从包含训练和测试数据的输入文件、使用的语料库、数据的记录和批量分离以及具有优化器和学习率的训练算法开始。对所有选项的详细讨论超出了本文的范围 - 目前,所有默认值均保持原样。

六、第 4 步:训练模型

首先,需要将数据分为训练数据集和测试数据集。方便的是,路透社的文章已经预先分割。以下代码片段划分数据并显示训练数据中的示例文章及其类别。

training = [doc for doc in reuters.fileids() if doc.find('training') == 0]
testing = [doc for doc in reuters.fileids() if doc.find('test') == 0]

print(len(training))
# 7769

print(len(testing))
# 3019

训练过程再次通过命令行启动。需要传递配置文件的名称、训练和测试数据集文件名以及输出目录。这是一个例子:

run python -m spacy train spacy_multi_label_categorization_pipeline.cfg \
--paths.train reuters_training_multi_label.spacy \
--paths.dev reuters_testing_multi_label.spacy \
--output textcat_multilabel_model

输出日志显示进度...

=========================== Initializing pipeline ===========================
[2023-07-03 18:24:10,639] [INFO] Set up nlp object from config
[2023-07-03 18:24:10,656] [INFO] Pipeline: ['tok2vec', 'textcat_multilabel']
[2023-07-03 18:24:10,660] [INFO] Created vocabulary
[2023-07-03 18:24:12,365] [INFO] Added vectors: en_core_web_lg
[2023-07-03 18:24:12,365] [INFO] Finished initializing nlp object
[2023-07-03 18:24:31,806] [INFO] Initialized pipeline components: ['tok2vec', 'textcat_multilabel']
✔ Initialized pipeline

============================= Training pipeline =============================
ℹ Pipeline: ['tok2vec', 'textcat_multilabel']
ℹ Initial learn rate: 0.001
# ...
✔ Saved pipeline to output directory
textcat_multilabel_model/model-last

…以及一个显示训练过程和几个指标的表格。

E    #       LOSS TOK2VEC  LOSS TEXTC...  CATS_SCORE  SCORE
---  ------  ------------  -------------  ----------  ------
  0       0          2.51           0.39       48.98    0.49
  0     200         24.56           5.04       39.44    0.39
  0     400          0.00           2.86       39.94    0.40
  0     600          0.01           3.87       40.27    0.40
  0     800          1.02           3.39       46.44    0.46
  0    1000          0.00           3.60       46.68    0.47
  0    1200          0.00           3.69       45.55    0.46
  0    1400          0.00           3.79       45.18    0.45
  0    1600          0.00           3.80       45.04    0.45

该表包含以下信息:

  • E:训练运行的纪元数
  • #:训练步数
  • LOSS TOK2VEC:用于向量化输入数据的松散函数
  • LOSS TEXTCAT 和 SCORE:分类的损失函数及其归一化值。

七、第 5 步:使用模型

        在训练过程中,创建的模型存储在给定的文件夹名称中。 Spacy 保留了最新且最好的模型,即 F1 分数最高的模型。要使用这些模型,您可以直接使用 Spacy 加载它们,然后处理任何文本并导出计算的类别。

以下是与上面使用的同一文章的示例:

import spacy

nlp = spacy.load('textcat_multilabel_model/model-best')
fileid = reuters.fileids()[1024]
text = reuters.raw(fileid)
doc = nlp(text)

print(doc.cats)
# {'acq': 0.9506559371948242, 'alum': 0.3440687954425812, 'barley': 0.044086653739213943, #...

doc.cats 属性是一个 Dictionary 对象,其中包含概率的键值映射,其中最可能的类别是估计的标签。

让我们比较一下使用单标签模型的一些文章的预期标签和估计标签:

import spacy

nlp = spacy.load('textcat_singlelabel_model/model-best')

def compare_labels(fileid):
  text = reuters.raw(fileid)
  expected_cat =  reuters.categories(fileid)
  doc = nlp(text)
  estimated_cats = sorted(doc.cats.items(), key=lambda i:float(i[1]), reverse=True)
  estimated_cat = estimated_cats[0]
  print(f'fileid {fileid} :: expected = {expected_cat} // estimated = {estimated_cat}')

compare_labels(training[1024])
# fileid training/1158 :: expected = ['ipi'] // estimated = ('cpi', 0.39067542552948)

compare_labels(training[2678])
# fileid training/2080 :: expected = ['acq'] // estimated = ('acq', 0.9778384566307068)

compare_labels(testing[1024])
# fileid test/16630 :: expected = ['orange'] // estimated = ('orange', 0.40097832679748535)

compare_labels(testing[2678])
# fileid test/20972 :: expected = ['earn'] // estimated = ('earn', 0.9994577765464783)

正如您所看到的,在三种情况下,估计的类别是匹配的。

八、比较多标签和单标签分类训练

为了让您对训练过程有一个印象,让我们比较一下多标签和单标签分类过程。

8.1 多标签分类

对 7769 个条目的完整训练集进行基线多标签分类大约需要 30 分钟。

这是日志输出:

=========================== Initializing pipeline ===========================
[2023-07-03 18:24:10,639] [INFO] Set up nlp object from config
[2023-07-03 18:24:10,656] [INFO] Pipeline: ['tok2vec', 'textcat_multilabel']
[2023-07-03 18:24:10,660] [INFO] Created vocabulary
[2023-07-03 18:24:12,365] [INFO] Added vectors: en_core_web_lg
[2023-07-03 18:24:12,365] [INFO] Finished initializing nlp object
[2023-07-03 18:24:31,806] [INFO] Initialized pipeline components: ['tok2vec', 'textcat_multilabel']
✔ Initialized pipeline

============================= Training pipeline =============================
ℹ Pipeline: ['tok2vec', 'textcat_multilabel']
ℹ Initial learn rate: 0.001
E    #       LOSS TOK2VEC  LOSS TEXTC...  CATS_SCORE  SCORE
---  ------  ------------  -------------  ----------  ------
  0       0          2.51           0.39       48.98    0.49
  0     200         24.56           5.04       39.44    0.39
  0     400          0.00           2.86       39.94    0.40
  0     600          0.01           3.87       40.27    0.40
  0     800          1.02           3.39       46.44    0.46
  0    1000          0.00           3.60       46.68    0.47
  0    1200          0.00           3.69       45.55    0.46
  0    1400          0.00           3.79       45.18    0.45
  0    1600          0.00           3.80       45.04    0.45
✔ Saved pipeline to output directory
textcat_multilabel_model/model-last

8.2 单标签分类

7769 个条目的完整训练集的基线单标签分类需要超过 3 小时 30 分钟。两个训练步骤本身都比较慢,并且训练会持续几个 epoch,因为 F1 分数增加非常缓慢。

要使用单一类别标签,我们首先需要更改提供训练和测试数据的方法。在与文章相关的所有类别中,仅使用第一个:

def convert_single_label(dataset, filename):
    db = DocBin()
    # ...
    for index, fileid in enumerate(dataset):
        cat_dict = {cat: 0 for cat in reuters.categories()}
        cat_dict[reuters.categories(fileid).pop()] = 1
        # ...

对于训练运行,使用特殊的单标签配置文件。

python -m spacy train spacy_single_label_categorization_pipeline.cfg \
   --paths.train reuters_training_single_label.spacy \
   --paths.dev reuters_testing_single_label.spacy \
   --output textcat_singlelabel_model

以下是训练结果:

To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.
✔ Created output directory: textcat_singlelabel_model
ℹ Saving to output directory: textcat_singlelabel_model
ℹ Using CPU

=========================== Initializing pipeline ===========================
[2023-07-04 16:38:34,515] [INFO] Set up nlp object from config
[2023-07-04 16:38:34,529] [INFO] Pipeline: ['tok2vec', 'textcat']
[2023-07-04 16:38:34,532] [INFO] Created vocabulary
[2023-07-04 16:38:37,277] [INFO] Added vectors: en_core_web_lg
[2023-07-04 16:38:37,278] [INFO] Finished initializing nlp object
[2023-07-04 16:39:02,505] [INFO] Initialized pipeline components: ['tok2vec', 'textcat']
✔ Initialized pipeline
============================= Training pipeline =============================
ℹ Pipeline: ['tok2vec', 'textcat']
ℹ Initial learn rate: 0.001
E    #       LOSS TOK2VEC  LOSS TEXTCAT  CATS_SCORE  SCORE
---  ------  ------------  ------------  ----------  ------
  0       0          0.00          0.01        0.09    0.00
  0     200         31.16          2.00        1.29    0.01
  0     400         34.35          1.92        1.51    0.02
  0     600         41.41          1.76        2.27    0.02
  0     800         56.29          1.76        2.12    0.02
  0    1000        124.84          1.73        2.07    0.02
  0    1200         45.42          1.75        2.42    0.02
  0    1400         58.10          1.51        3.93    0.04
  0    1600         90.27          1.51        2.10    0.02
  0    1800         93.87          1.57        3.22    0.03
  0    2000        172.70          1.48        3.64    0.04
  0    2200        215.72          1.42        4.30    0.04
  0    2400        177.34          1.30        4.72    0.05
  0    2600        866.50          1.22        5.47    0.05
  0    2800       1877.17          1.16        5.09    0.05
  0    3000       4186.50          1.02        6.94    0.07
  1    3200       4118.06          1.05        5.33    0.05
  1    3400       6050.67          0.96        8.27    0.08
  1    3600       7368.26          0.82        6.07    0.06
  1    3800       9302.68          1.03        8.25    0.08
  1    4000      12089.54          0.98        7.82    0.08
  1    4200      10829.92          0.99        6.49    0.06
  1    4400      10462.12          0.91        7.15    0.07
  2    4600      13104.09          0.96        9.11    0.09
  2    4800      14439.08          0.87       10.31    0.10
  2    5000      12240.43          0.86        9.27    0.09

        尽管训练需要更长的时间,但估计的类别与预期的类别更加匹配。

九、结论

        本文介绍了如何向 Spacy 项目添加文本分类任务。使用默认模型,Spacy 可以执行多项基本和高级 NLP 任务,例如标记化、词形还原、词性标记和命名实体解析。要添加文本分类,需要执行以下步骤:a) 准备训练数据,b) 将训练数据转换为 DocBin 格式,以便预处理 Doc 对象提供带有字典属性 cats c) 生成和自定义 Spacy 训练配置,d) 使用 cli 命令训练模型。因此,特别是训练配置是高度可定制的,暴露了学习率和损失函数等细节。训练完成后,可以通过 Spacy 加载生成的模型,并且所有解析的文档现在都将具有估计的类别。

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

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

相关文章

STM32_HAL库—IWDG看门狗

一、CubeMX设置 1、晶振配置(72M) 2、数据配置 超时时间 Tout prv / LSI * rlv (s) 其中prv是预分频器寄存器的值,rlv是重装载寄存器的值,而LSI值默认是40kHz,如下所示。 3、代码实现 int main(){while(1){HAL_IW…

C++ 学习系列 -- 模板 template

一 C 模板介绍? C 为什么引入模板? 我的理解是: C 引入模板的概念,是为了复用重复的代码,当某些代码除了操作的数据类型不同以外,其他逻辑全都相同,此时就适合采用模板的方式。 定义模板类或者…

Linux的文件系统 内核结构

Linux的文件系统 Q1:什么是文件系统? A:在学术的角度下,文件系统指“操作系统用于明确存储设备组织文件的方法”,是“文件管理系统”的简称,本质也是代码,一段程序 Q2:文件系统&…

使用opencv的Canny算子实现图像边缘检测

1 边缘检测介绍 图像边缘检测技术是图像处理和计算机视觉等领域最基本的问题,也是经典的技术难题之一。如何快速、精确地提取图像边缘信息,一直是国内外的研究热点,同时边缘的检测也是图像处理中的一个难题。早期的经典算法包括边缘算子方法…

代码随想录-刷题第二十八天

93. 复原 IP 地址 题目链接:93. 复原 IP 地址 思路:切割问题,原理上还是抽象成树形结构,然后使用回溯法。 131 题的要求是:让你把字符串 s 切分成若干个合法的回文串,返回所有的切分方法。 本题的要求是…

知识|基于混合模式的多余度飞控全数字仿真系统研究

*余度(Redundancy):一种确保安全的设计手段,使得出现两个及以上故障时,才会引起既定不希望发生的工作状态。 飞行控制软件主要完成飞行传感器数据处理、飞行姿态控制和余度管理任务,对保证飞机安全性和可靠…

GroupMixFormer:基于Group-Mix注意力的视觉Transformer

文章目录 摘要1、简介2、相关工作2.1、视觉转换器2.2、全面的自注意力建模 3、组混合注意力和GroupMixFormer3.1. 动机:从个体到群体3.2. GMA: 混合组以获得更好的注意力3.3. 架构配置 4、实验4.1、实现细节4.2. 与最先进模型的比较4.3. 消融实验 5、结论 摘要 htt…

[论文笔记] chatgpt系列 SparseMOE—GPT4的MOE结构

SparseMOE: 稀疏激活的MOE Swtich MOE,所有token要在K个专家网络中,选择一个专家网络。 显存增加。 Experts Choice:路由MOE:​​​​​​​ 由专家选择token。这样不同的专家都选择到某个token,也可以不选择该token。 由于FFN层的时间复杂度和attention层不同,FFN层的时…

[Vulnhub靶机] DC-1

[Vulnhub靶机] DC-1靶机渗透思路及方法(个人分享) 靶机下载地址: https://download.vulnhub.com/dc/DC-1.zip 靶机地址:192.168.67.25 攻击机地址:192.168.67.3 一、信息收集 1.使用 arp-scan 命令扫描网段内存活的…

代码随想录刷题题Day14

刷题的第十四天,希望自己能够不断坚持下去,迎来蜕变。😀😀😀 刷题语言:C Day14 任务 ● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和 1 平衡二叉树 二叉树节点的深度:指从根节…

数据库系列之简要对比下GaussDB和OpenGauss数据库

GaussDB作为一款企业级的数据库产品,和开源数据库OpenGauss之间又是什么样的关系,刚开始接触的时候是一头雾水,因此本文简要对比下二者的区别,以加深了解。 1、GaussDB和OpenGauss数据库简要对比 GaussDB是华为基于PostgreSQL数据…

用Python快速从深层嵌套 JSON 中找到特定的 Value

有时候,我们拿到一个JSON数据的时候,会难以看出其逻辑层次结构。 这时候就需要我们进行代码解析了。 代码: import jsondef find_json_value(data_json, value, path""):if isinstance(data_json, dict):for k, v in data_json.…

学生用的台灯选什么比较好?热门考研护眼台灯推荐

是不是在台灯下用眼时间长了就觉得眼睛干涩难受,这说明是时候该换掉你的普通台灯换一盏护眼台灯了,用了才知道有多香。小台灯也有大学问,如果还不知道该怎么挑台灯的话也没关系,我已经总结了一份护眼台灯的科普和攻略,…

vmware安装Linux虚拟机设置固定IP地址

Linux虚拟机设置固定IP 近期工作需要,本地用VMware安装了三台Linux-centos虚拟机,来搭建rocketmq集群。但是IP地址每天关机重启之后就会比变化,很是恼火。找到了一个修改的教程,亲测有效!!!&am…

MySQL数据存储、索引记录

行格式(每行记录) 行格式(每行记录): 以记录为单位来向表中插入数据的,这些记录在磁盘上的存放方式也被称为 行格式 或者 记录格式。 InnoDB 存储引擎4种不同类型的 行格式 ,分别是 Compact 、 Redundant 、Dynamic 和 Compressed 行格式。组…

电机的开环控制和闭环控制

目录 开环电机控制 闭环电机控制 开环到闭环转换 开环电机控制 开环控制(也称为标量控制或伏特/赫兹控制)是一种常见的电机控制方法,可用于运行任何交流电机。这是一种简单的方法,不需要来自电机的任何反馈。为了保持定子磁通恒…

软考、PMP 区别

软考 考试时间:一年两次,报名3月,8月;对应考试:5月最后一个周末,11月第一个周末 报名费:50-200元,每个城市不同北京57每科 报名网站:中国计算机技术职业资格网 考试等…

LangChain学习三:链-实战

文章目录 上一节内容:LangChain学习二:提示-实战(下半部分)学习目标:明白链是什么?有哪些?怎么用?学习内容一:介绍学习内容二:有那些学习内容三:实…

【Flink-cdc-Mysql-To-Kafka】使用 Flinksql 利用集成的 connector 实现 Mysql 数据写入 Kafka

【Flink-cdc-Mysql-To-Kafka】使用 Flinksql 利用集成的 connector 实现 Mysql 数据写入 Kafka 1)环境准备2)准备相关 jar 包3)实现场景4)准备工作4.1.Mysql4.2.Kafka 5)Flink-Sql6)验证 1)环境…

EAM系统在地铁设备管理中的应用

在现代城市的交通系统中,地铁作为一种高效、快速、可靠的公共交通工具,扮演着至关重要的角色。为了确保地铁系统的正常运行和可靠性,地铁管理部门需要有效地管理大量的设备和设施。在这个过程中,企业资产管理(EAM&…