【NLP】词向量

news2024/12/29 10:32:12

 🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎

📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃

🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​

📣系列专栏 - 机器学习【ML】 自然语言处理【NLP】  深度学习【DL】

 🖍foreword

✔说明⇢本人讲解主要包括Python、机器学习(ML)、深度学习(DL)、自然语言处理(NLP)等内容。

如果你对这个系列感兴趣的话,可以关注订阅哟👋

文章目录

什么是词向量/词嵌入

词向量的理解 TODO

Word2Vec

基于层次 SoftMax 的 CBOW 模型

层次 SoftMax 的正向传播

层次 Softmax 的反向传播 TODO

基于层次 Softmax 的 Skip-gram 模型

---

基于负采样的 CBOW 和 Skip-gram

负采样算法

Word2Vec 中的做法

一些源码细节

σ(x) 的近似计算

低频词的处理

高频词的处理

自适应学习率

参数初始化

GloVe

共现矩阵

构架共现矩阵的细节

GloVe 的基本思想

GloVe 的目标函数

GloVe 目标函数的推导过程

GloVe 与 Word2Vec 的区别

FastText

gensim.models.FastText 使用示例

获取单个词的 ngrams 表示

计算一个未登录词的词向量

WordRank TODO

CharCNN 字向量

其他实践

一般 embedding 维度的选择


什么是词向量/词嵌入

  • 词向量(word embedding)是一个固定长度的实值向量
  • 词向量是神经语言模型的副产品
  • 词向量是针对“词”提出的。事实上,也可以针对更细或更粗的粒度来进行推广——比如字向量、句向量、文档向量等

词向量的理解 TODO

word2vec 中的数学原理详解(三)背景知识 - CSDN博客

  • 在 NLP 任务中,因为机器无法直接理解自然语言,所以首先要做的就是将语言数学化——词向量就是一种将自然语言数学化的方法。

One-hot 表示

  • TODO

分布式表示 (distributed representation)

  • 分布式假设
  • TODO
  • 常见的分布式表示方法
    • 潜在语义分析 (Latent Semantic Analysis, LSA)
      • SVD 分解
    • 隐含狄利克雷分布 (Latent Dirichlet Allocation, LDA),主题模型
    • 神经网络、深度学习

Word2Vec

  • Word2Vec 本质上也是一个神经语言模型,但是它的目标并不是语言模型本身,而是词向量;因此,其所作的一系列优化,都是为了更快更好的得到词向量

  • Word2Vec 提供了两套模型:CBOW 和 Skip-Gram(SG)

    • CBOW 在已知 context(w) 的情况下,预测 w
    • SG 在已知 w 的情况下预测 context(w)
  • 从训练集的构建方式可以更好的理解和区别 CBOW 和 SG 模型

    • 每个训练样本为一个二元组 (x, y),其中 x为特征,y为标签

      假设上下文窗口的大小 context_window =5,即

      或者说 skip_window = 2,有 context_window = skip_window*2 + 1

    • CBOW 的训练样本为:

    • SG 的训练样本为:

    • 一般来说,skip_window <= 10

  • 除了两套模型,Word2Vec 还提供了两套优化方案,分别基于 Hierarchical Softmax (层次SoftMax) 和 Negative Sampling (负采样)

基于层次 SoftMax 的 CBOW 模型

  • 输入层】将 context(w) 中的词映射为 m 维词向量,共 2c 个

  • 投影层】将输入层的 2c 个词向量累加求和,得到新的 m 维词向量

  • 输出层】输出层对应一棵哈夫曼树,以词表中词作为叶子节点,各词的出现频率作为权重——共 N 个叶子节点,N-1 个非叶子节点

  • 对比 N-gram 神经语言模型的网络结构

    • 【输入层】前者使用的是 w 的前 n-1 个词,后者使用 w 两边的词

      这是后者词向量的性能优于前者的主要原因

    • 【投影层】前者通过拼接,后者通过累加求和
    • 【隐藏层】后者无隐藏层
    • 【输出层】前者为线性结构,后者为树形结构
  • 模型改进

    • 从对比中可以看出,CBOW 模型的主要改进都是为了减少计算量——取消隐藏层、使用层Softmax代替基本Softmax

层次 SoftMax 的正向传播

  • 层 Softmax 实际上是把一个超大的多分类问题转化成一系列二分类问题

  • 示例:求 P("足球"|context("足球"))

    • 从根节点到“足球”所在的叶子节点,需要经过 4 个分支,每次分支相当于一次二分类(逻辑斯蒂回归,二元Softmax)

      这里遵从原文,将 0 作为正类,1 作为负类

    • 而 P("足球"|context("足球")) 就是每次分类正确的概率之积,即

      这里每个非叶子都对应一个参数 θ_i

为什么层次 SoftMax 能加速

  • Softmax 大部分的计算量在于分母部分,它需要求出所有分量的和
  • 而层次 SoftMax 每次只需要计算两个分量,因此极大的提升了速度

层次 Softmax 的反向传播 TODO

word2vec 中的数学原理详解(四)基于 Hierarchical Softmax 的模型 - CSDN博客

基于层次 Softmax 的 Skip-gram 模型

  • 这里保留了【投影层】,但实际上只是一个恒等变换

  • 从模型的角度看:CBOW 与 SG 模型的区别仅在于 x_w 的构造方式不同,前者是 context(w) 的词向量累加;后者就是 w 的词向量

  • 虽然 SG 模型用中心词做特征,上下文词做类标,但实际上两者的地位是等价的

---

基于负采样的 CBOW 和 Skip-gram

  • 层次 Softmax 还不够简单,于是提出了基于负采样的方法进一步提升性能
  • 负采样(Negative Sampling)是 NCE(Noise Contrastive Estimation) 的简化版本

    噪音对比估计(NCE) - CSDN博客

  • CBOW 的训练样本是一个 (context(w), w) 二元对;对于给定的 context(w)w 就是它的正样本,而其他所有词都是负样本。
  • 如果不使用负采样,即 N-gram 神经语言模型中的做法,就是对整个词表 Softmax 和交叉熵
  • 负采样相当于选取所有负例中的一部分作为负样本,从而减少计算量
  • Skip-gram 模型同理

负采样算法

  • 负采样算法,即对给定的 w ,生成相应负样本的方法
  • 最简单的方法是随机采样,但这会产生一点问题,词表中的词出现频率并不相同
    • 如果不是从词表中采样,而是从语料中采样;显然,那些高频词被选为负样本的概率要大于低频词
    • 在词表中采样时也应该遵循这个
  • 因此,负采样算法实际上就是一个带权采样过程

Word2Vec 中的做法

  • 以这 N+1 个点对区间 [0,1] 做非等距切分

  • 引入的一个在区间 [0,1] 上的 M 等距切分,其中 M >> N

    源码中取 M = 10^8

  • 然后对两个切分做投影,得到映射关系

  • 采样时,每次生成一个 [1, M-1] 之间的整数 i,则 Table(i) 就对应一个样本;当采样到正例时,跳过(拒绝采样)。

  • 特别的,Word2Vec 在计算 len(w) 时做了一些改动——为 count(·) 加了一个指数

一些源码细节

σ(x) 的近似计算

  • 类似带权采样的策略,用查表来代替计算

  • 具体计算公式如下

    因为 σ(x) 函数的饱和性,当 x < -6 || x > 6 时,函数值基本不变了

低频词的处理

  • 对于低频词,会设置阈值(默认 5),对于出现频次低于该阈值的词会直接舍弃,同时训练集中也会被删除

高频词的处理

  • 高频词提供的信息相对较少,为了提高低频词的词向量质量,有必要对高频词进行限制
  • 高频词对应的词向量在训练时,不会发生明显的变化,因此在训练是可以减少对这些词的训练,从而提升速度

Sub-sampling 技巧

  • 源码中使用 Sub-sampling 技巧来解决高频词的问题,能带来 2~10 倍的训练速度提升,同时提高低频词的词向量精度
  • 给定一个词频阈值 t,将 w 以 p(w) 的概率舍弃,p(w) 的计算如下

Word2Vec 中的Sub-sampling

  • 显然,Sub-Sampling 只会针对 出现频次大于 t 的词
  • 特别的,Word2Vec 使用如下公式计算 p(w),效果是类似的

自适应学习率

  • 预先设置一个初始的学习率 η_0(默认 0.025),每处理完 M(默认 10000)个词,就根据以下公式调整学习率

  • 随着训练的进行,学习率会主键减小,并趋向于 0

  • 为了方式学习率过小,Word2Vec 设置了一个阈值 η_min(默认 0.0001 * η_0);当学习率小于 η_min,则固定为 η_min

参数初始化

  • 词向量服从均匀分布 [-0.5/m, 0.5/m],其中 m 为词向量的维度
  • 所有网络参数初始化为 0

GloVe

CS224d - L2&3-词向量

共现矩阵

  • 共现矩阵的实现方式
    • 基于文档 - LSA 模型(SVD分解)

    • 基于窗口 - 类似 skip-gram 模型中的方法

      skip_window = 1 的共现矩阵

构架共现矩阵的细节

  • 功能词的处理
    • 功能词:如 "the", "he", "has", ...
    • 法1)直接忽略
      • 在一些分类问题上可以这么做;如果目标是词向量,则不建议使用这种方法
    • 法2)设置阈值 min(x, t)
      • 其中 x 为功能词语其他词的共现次数,t 为设置的阈值
  • 可以尝试使用一些方法代替单纯的计数,如皮尔逊相关系数,负数记为 0

    但是似乎没有人这么做

GloVe 的基本思想

  • GloVe 模型的是基于共现矩阵构建的

  • GloVe 认为共现矩阵可以通过一些统计信息得到词之间的关系,这些关系可以一定程度上表达词的含义

    • solid related to ice but not steam
    • gas related to stream but not ice
    • water related to both
    • fashion relate not to both

    说明 TODO

  • GloVe 的基本思想:

    • 假设词向量已知,如果这些词向量通过某个函数(目标函数)可以拟合共现矩阵中的统计信息,那么可以认为这些词向量也拥有了共现矩阵中蕴含的语义
    • 模型的训练过程就是拟合词向量的过程

GloVe 的目标函数

其中

  • w_i 和 w_j 为词向量

  • x_ij 为 w_i 和 w_j 的共现次数

  • f(x) 是一个权重函数,为了限制高频词和防止 x_ij = 0

    • 当 x_ij = 0 时,有

GloVe 目标函数的推导过程

以前整理在 OneNote 上的,有时间在整理

  • 目标函数

  • w_i 的权重函数

GloVe 与 Word2Vec 的区别

  • Word2Vec 本质上是一个神经网络;
    Glove 也利用了反向传播来更新词向量,但是结构要更简单,所以 GloVe 的速度更快
  • Glove 认为 Word2Vec 对高频词的处理还不够,导致速度慢;GloVe 认为共现矩阵可以解决这个问题

    实际 Word2Vec 已结有了一些对高频词的措施 > 高频词的处理

  • 从效果上看,虽然 GloVe 的训练速度更快,但是词向量的性能在通用性上要弱一些:
    在一些任务上表现优于 Word2Vec,但是在更多的任务上要比 Word2Vec 差

FastText

  • FastText 是从 Word2Vec 的 CBOW 模型演化而来的;

    从网络的角度来看,两者的模型基本一致;区别仅在于两者的输入和目标函数不同

    基于层次 SoftMax 的 CBOW 模型

  • FastText 与 CBOW 的相同点:

    • 包含三层:输入层、隐含层、输出层(Hierarchical Softmax)
    • 输入都是多个单词的词向量
    • 隐藏层(投影层)都是对多个词向量的叠加平均
    • 输出都是一个特定的 target
    • 从网络的角度看,两者基本一致
  • 不同点:

    • CBOW 的输入是中心词两侧skip_window内的上下文词;FastText 除了上下文词外,还包括这些词的字符级 N-gram 特征
  • 注意,字符级 N-gram 只限制在单个词内,以英文为例

    // 源码中计算 n-grams 的声明,只计算单个词的字符级 n-gram
    compute_ngrams(word, unsigned int min_n, unsigned int max_n);
    # > https://github.com/vrasneur/pyfasttext#get-the-subwords
    >>> model.args.get('minn'), model.args.get('maxn')
    (2, 4)
    # 调用源码的 Python 接口,源码上也会添加 '<' 和 '>'
    >>> model.get_all_subwords('hello') # word + subwords from 2 to 4 characters
    ['hello', '<h', '<he', '<hel', 'he', 'hel', 'hell', 'el', 'ell', 'ello', 'll', 'llo', 'llo>', 'lo', 'lo>', 'o>']
    >>> # model.get_all_subwords('hello world')  # warning
  • 值得一提的是,因为 FastText 使用了字符级的 N-gram 向量作为额外的特征,使其能够对未登录词也能输出相应的词向量;

    具体来说未登录词的词向量等于其 N-gram 向量的叠加

gensim.models.FastText 使用示例

../codes/FastText

  • 构建 FastText 以及获取词向量
    # gensim 示例
    import gensim
    import numpy as np
    from gensim.test.utils import common_texts
    from gensim.models.keyedvectors import FastTextKeyedVectors
    from gensim.models._utils_any2vec import compute_ngrams, ft_hash
    from gensim.models import FastText
    
    # 构建 FastText 模型
    sentences = [["Hello", "World", "!"], ["I", "am", "huay", "."]]
    min_ngrams, max_ngrams = 2, 4  # ngrams 范围
    model = FastText(sentences, size=5, min_count=1, min_n=min_ngrams, max_n=max_ngrams)
    
    # 可以通过相同的方式获取每个单词以及任一个 n-gram 的向量
    print(model.wv['hello'])
    print(model.wv['<h'])
    """
    [-0.03481839  0.00606661  0.02581969  0.00188777  0.0325358 ]
    [ 0.04481247 -0.1784363  -0.03192253  0.07162753  0.16744071]
    """
    print()
    
    # 词向量和 n-gram 向量是分开存储的
    print(len(model.wv.vectors))  # 7
    print(len(model.wv.vectors_ngrams))  # 57
    # gensim 好像没有提供直接获取所有 ngrams tokens 的方法
    
    print(model.wv.vocab.keys())
    """
    ['Hello', 'World', '!', 'I', 'am', 'huay', '.']
    """
    print()

获取单个词的 ngrams 表示

  • 利用源码中 compute_ngrams 方法,gensim 提供了该方法的 Python 接口
    sum_ngrams = 0
    for s in sentences:
        for w in s:
            w = w.lower()
            # from gensim.models._utils_any2vec import compute_ngrams
            ret = compute_ngrams(w, min_ngrams, max_ngrams)  
            print(ret)
            sum_ngrams += len(ret)
    """
    ['<h', 'he', 'el', 'll', 'lo', 'o>', '<he', 'hel', 'ell', 'llo', 'lo>', '<hel', 'hell', 'ello', 'llo>']
    ['<w', 'wo', 'or', 'rl', 'ld', 'd>', '<wo', 'wor', 'orl', 'rld', 'ld>', '<wor', 'worl', 'orld', 'rld>']
    ['<!', '!>', '<!>']
    ['<i', 'i>', '<i>']
    ['<a', 'am', 'm>', '<am', 'am>', '<am>']
    ['<h', 'hu', 'ua', 'ay', 'y>', '<hu', 'hua', 'uay', 'ay>', '<hua', 'huay', 'uay>']
    ['<.', '.>', '<.>']
    """
    assert sum_ngrams == len(model.wv.vectors_ngrams)
    print(sum_ngrams)  # 57
    print()

计算一个未登录词的词向量

  • 未登录词实际上是已知 n-grams 向量的叠加平均

    # 因为 "a", "aa", "aaa" 中都只含有 "<a" ,所以它们实际上都是 "<a"
    print(model.wv["a"])
    print(model.wv["aa"])
    print(model.wv["aaa"])
    print(model.wv["<a"])  
    """
    [ 0.00226487 -0.19139008  0.17918809  0.13084619 -0.1939924 ]
    [ 0.00226487 -0.19139008  0.17918809  0.13084619 -0.1939924 ]
    [ 0.00226487 -0.19139008  0.17918809  0.13084619 -0.1939924 ]
    [ 0.00226487 -0.19139008  0.17918809  0.13084619 -0.1939924 ]
    """
    print()
  • 只要未登录词能被已知的 n-grams 组合,就能得到该词的词向量

    gensim.models.keyedvectors.FastTextKeyedVectors.word_vec(token) 的内部实现

    word_unk = "aam"
    ngrams = compute_ngrams(word_unk, min_ngrams, max_ngrams)  # min_ngrams, max_ngrams = 2, 4
    word_vec = np.zeros(model.vector_size, dtype=np.float32)
    ngrams_found = 0
    for ngram in ngrams:
        ngram_hash = ft_hash(ngram) % model.bucket
        if ngram_hash in model.wv.hash2index:
            word_vec += model.wv.vectors_ngrams[model.wv.hash2index[ngram_hash]]
            ngrams_found += 1
    
    if word_vec.any():  #
        word_vec = word_vec / max(1, ngrams_found)
    else:  # 如果一个 ngram 都没找到,gensim 会报错;个人认为把 0 向量传出来也可以
        raise KeyError('all ngrams for word %s absent from model' % word_unk)
    
    print(word_vec)
    print(model.wv["aam"])
    """
    [ 0.02210762 -0.10488641  0.05512805  0.09150169  0.00725085]
    [ 0.02210762 -0.10488641  0.05512805  0.09150169  0.00725085]
    """
    
    # 如果一个 ngram 都没找到,gensim 会报错
    #   其实可以返回一个 0 向量的,它内部实际上是从一个 0 向量开始累加的;
    #   但返回时做了一个判断——如果依然是 0 向量,则报错
    # print(model.wv['z'])
    """
    Traceback (most recent call last):
      File "D:/OneDrive/workspace/github/DL-Notes-for-Interview/code/工具库  /gensim/FastText.py", line 53, in <module>
        print(model.wv['z'])
      File   "D:\program\work\Python\Anaconda3\envs\tf\lib\site-packages\gensim\models  \keyedvectors.py", line 336, in __getitem__
        return self.get_vector(entities)
      File   "D:\program\work\Python\Anaconda3\envs\tf\lib\site-packages\gensim\models  \keyedvectors.py", line 454, in get_vector
        return self.word_vec(word)
      File   "D:\program\work\Python\Anaconda3\envs\tf\lib\site-packages\gensim\models  \keyedvectors.py", line 1989, in word_vec
        raise KeyError('all ngrams for word %s absent from model' % word)
    KeyError: 'all ngrams for word z absent from model'
    """

WordRank TODO

CharCNN 字向量

  • CharCNN 的思想是通过字符向量得到词向量

[1509] Character-level Convolutional Networks for Text Classification

其他实践

一般 embedding 维度的选择

Feature Columns  |  TensorFlow

  • 经验公式 embedding_size = n_categories ** 0.25
  • 在大型语料上训练的词向量维度通常会设置的更大一些,比如 100~300

    如果根据经验公式,是不需要这么大的,比如 200W 词表的词向量维度只需要 200W ** 0.25 ≈ 37

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

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

相关文章

阿里巴巴面试题- - -多线程并发篇(三十)

前言:七月末八月初的时候,秋招正式打响,公司会放出大量的全职和实习岗位。为了帮助秋招的小伙伴们,学长这里整理了一系列的秋招面试题给大家,所以小伙伴们不用太过焦虑,相信你们一定能超常发挥,收到心仪公司的Offer~~ 内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elast…

窥一斑而知全豹,从五大厂商看MCU国产化的机遇和挑战

&#x1f446;&#x1f446;&#x1f446; #电巢直播10月26日&#xff08;周三&#xff09;扫码参与 前言 近年来&#xff0c;MCU在各领域的应用大幅度增加。2021年全球MCU的总出货量仍旧增长12%&#xff0c;使去年全球MCU的交付量达到了309亿片的历史新高。根据IC Insights…

工业控制系统安全评估流程系统评定与分类

综述 随着计算机和网络技术的发展&#xff0c;特别是信息化与工业化## 综述 随着计算机和网络技术的发展&#xff0c;特别是信息化与工业化深度融合以及物联网的快速发展&#xff0c;工业控制 系统产品越来越多地采用通用协议、通用硬件和通用软件&#xff0c;网络威胁正在由传…

Linux文件属性与权限

目录 前言 文件权限类 文件属性 rwx 作用文件和目录的不同解释 chmod 改变权限 1&#xff09;基本语法 2&#xff09;经验技巧 3&#xff09;案例实操 chown 改变所有者 1&#xff09;基本语法 2&#xff09;选项说明 3&#xff09;实操案例 chgrp 改变所属组 …

康为世纪科创板上市破发:跌幅超10% 公司市值41亿

雷递网 雷建平 10月25日江苏康为世纪生物科技股份有限公司&#xff08;简称&#xff1a;“康为世纪”&#xff0c;股票代码为“688426”&#xff09;今日在科创板上市。康为世纪此次发行价为48.98元&#xff0c;发行2329万股&#xff0c;募资总额为11.4亿元。康为世纪开盘价为4…

【单片机毕业设计】【mcuclub-jj-048】基于单片机的水表的设计

最近设计了一个项目基于单片机的水表系统&#xff0c;与大家分享一下&#xff1a; 一、基本介绍 项目名&#xff1a;水表 项目编号&#xff1a;mcuclub-jj-048 单片机类型&#xff1a;STC89C52 具体功能&#xff1a; 1、通过继电器控制水泵&#xff0c;将水抽出经过流速传感器…

Redis实战篇一 (短信登录)

Redis企业实战&#xff08;黑马点评&#xff09;项目整体架构项目部署后端部署前端部署短信登陆基于Session实现登录集群的Session共享问题基于Redis实现共享session登录解决状态登录刷新的问题——登录拦截器的优化本期学习路线短信登陆: Redis的共享session应用 商户查询缓存…

jar包突然过大解决方法,解决ffmpeg剪辑视频导致jar过大

jar包突然过大解决方法 缘由&#xff1a; ​ 项目中要需要用到视频文件&#xff0c;为了方便用户使用&#xff0c;那么页面中就需要增加视频剪辑的相关功能&#xff0c;让用户上传视频后能够自定义的进行剪辑&#xff0c;对自己的视频做出相应的更改 结果&#xff1a; ​ 打jar…

Vue复刻华为官网 (二)

文章目录1 推荐信息1.1 思路1.2 代码1.3 知识补充1.4 效果图2 宣传海报2.1 思路2.2 代码2.3 效果图3 新闻与活动3.1 思路3.2 代码3.3 效果图1 推荐信息 1.1 思路 看了这个gif后&#xff0c;可以清楚的看到产生了三个动画效果&#xff1a;图片"拉近"&#xff0c;"…

js 实现页面隐藏、关闭、刷新给出对应的提示

我们在做项目的时候经常会遇到一些需求&#xff0c;比如在某些页面当点击浏览器刷新 或者关闭的时候会有对应的提示&#xff0c;是否离开或者重新加载此网站。比如csdn写文章的时候就有这个弹窗&#xff0c;这功能就是用onbeforeunload实现的。 注意&#xff1a;如果你加载下面…

学会用Linux用户管理命令

目录 useradd 添加新用户 1&#xff09;基本语法 2&#xff09;案例实操 passwd 设置用户密码 1&#xff09;基本语法 id 查看用户是否存在 1&#xff09;基本语法 2&#xff09;案例实操 cat /etc/passwd 查看创建了哪些用户 1&#xff09;案例实操 su 切换用户 1…

Linux基本工具(上)

目录 粘滞位&#xff1a;t yum yum install yum list ​编辑 yum list | grep 软件名 yum search 软件名 软件卸载&#xff1a;yum remove rz sz表示下载&#xff1a; Linux开发工具&#xff1a; vim编辑器&#xff1a; vim的几种模式&#xff1a; 粘滞位&#xff1a…

蛇形矩阵求解

题目&#xff1a; 题解思考&#xff1a; 这个题目我有两种解题方法&#xff1a; 1&#xff09;利用数组&#xff0c;数组的下标。 2&#xff09;利用等差数列的规律&#xff08;这个可能比较难理解&#xff09;&#xff0c;行和列的递增规律。 注意输出格式的处理和多组输入…

三分钟带你手撕带头双向循环链表

数据结构——带头双向循环链表 &#x1f3d6;️专题&#xff1a;数据结构 &#x1f648;作者&#xff1a;暴躁小程序猿 ⛺简介&#xff1a;双非大二小菜鸟一枚&#xff0c;欢迎各位大佬指点~ 文章目录数据结构——带头双向循环链表前言一、什么是双向链表&#xff1f;二、带头…

图像智能处理黑科技,让图像处理信手拈来

图像智能处理黑科技&#xff0c;让图像处理信手拈来0. 前言1. 图像智能处理简介2. 图像切边增强3. PS 检测4. 图像水印去除5. 图像矫正6. 图像去屏幕纹7. 调用图像智能处理 API小结0. 前言 计算机视觉 (Computer Vision, CV) 通过研究如何令机器“看懂”世界&#xff0c;构建从…

嵌入式分享合集84

今天做的某地区的项目, 了解了一下 很是不开心 原来这几年丢的不仅是某公湖 真呵呵 一、学习单片机 如何系统地入门学习STM32&#xff1f; 假如你会使用8051 &#xff0c; 会写C语言&#xff0c;那么STM32本身并不需要刻意的学习。 你要考虑的是&#xff0c; 我可以用STM32实…

Scratch软件编程等级考试三级——20200913

Scratch软件编程等级考试三级——20200913理论单选题判断题实操幻影小猫打气球游戏猫咪抓老鼠游戏理论 单选题 1、要使以下代码运行后画出如图所示三角形风车&#xff0c;则以下代码中①②③④处应分别填入多少&#xff1f;&#xff08;&#xff09; A、3 4 90 120 B、4 3 90…

实验项目一:【文本反爬网站的分析和爬取】

一、实验目的 熟悉使用Selenium、Pyppeteer等工具爬取网站基本内容&#xff0c;通过分析具有文本反爬技术网站&#xff0c;设计爬取策略来获取文本正确的内容。 二、实验预习提示 安装Python环境 &#xff08;Python 3.x&#xff09;&#xff1a;Pychram社区版Anaconda为Pytho…

[SpringBoot] YAML基础语法

✨✨个人主页:沫洺的主页 &#x1f4da;&#x1f4da;系列专栏: &#x1f4d6; JavaWeb专栏&#x1f4d6; JavaSE专栏 &#x1f4d6; Java基础专栏&#x1f4d6;vue3专栏 &#x1f4d6;MyBatis专栏&#x1f4d6;Spring专栏&#x1f4d6;SpringMVC专栏&#x1f4d6;SpringBoot专…

四线法与电桥

目录&#xff1a; 一、基本电桥电路 二、开尔文四线检测 三、惠斯通与开尔文电桥 1、电阻桥定义解释 2、电阻桥相关计算 3、开尔文双电桥 4、电阻桥的应用 --------------------------------------------------------------------------------------------------------…