当前位置: 首页 > article >正文

02_NLP文本预处理之文本张量表示法

文本张量表示法

概念

将文本使用张量进行表示,一般将词汇表示为向量,称为词向量,再由各个词向量按顺序组成矩阵形成文本表示

例如:

["人生", "该", "如何", "起头"]==># 每个词对应矩阵中的一个向量
[[1.32, 4,32, 0,32, 5.2],[3.1, 5.43, 0.34, 3.2],[3.21, 5.32, 2, 4.32],[2.54, 7.32, 5.12, 9.54]]

作用

将文本表示成张量(矩阵)形式,能够使语言文本可以作为计算机处理程序的输入,进行接下来一系列的解析工作。

  • 连接文本与计算机

    • 将文本张量转换为数值形式输入,使其能够被计算机处理和理解
  • 表达语义信息

    • 捕捉词语关系

      好的文本张量表示方法,例如词嵌入,可以将词语映射到高维空间中,使得语义相似的词语在向量空间中也彼此接近。例如,“king” 和 “queen” 的向量在空间中会比 “king” 和 “apple” 更接近。

    • 保留上下文信息

      对于句子和文档的表示方法,例如句嵌入和文档嵌入,能够保留文本的上下文信息,例如词语之间的顺序和依赖关系。

    • 理解文本含义

      通过将文本映射到向量空间,模型可以学习到文本的深层语义含义,而不仅仅是表面上的字面意思。

  • 提升模型性能

    • 特征提取

      文本张量表示可以看作是对文本进行特征提取的过程,将文本转换为计算机可以理解的特征。

    • 降维

      一些文本张量表示方法,例如词嵌入,可以将文本的维度降低,减少模型的计算量,并避免维度灾难。

    • 减少噪声

      一些文本张量表示方法,例如 TF-IDF,可以对文本中的噪声进行过滤,突出重要信息。

方法

one-hot编码

  • 概念:每个单词都会被映射到一个高维向量中,该向量中只有一个元素是 1,其他所有元素都是 0。

    举例

    假设我们有一个包含以下 5 个单词的词汇表(Vocabulary):

    • “cat”
    • “dog”
    • “fish”
    • “bird”
    • “rabbit”

    我们需要为每个单词生成一个向量,向量的维度等于词汇表中单词的数量(在这个例子中是 5)。

    1. 构建词汇表:

    我们的词汇表如下:

    IndexWord
    0cat
    1dog
    2fish
    3bird
    4rabbit

    2. 生成 One-hot 向量:

    每个单词都会被转换为一个与词汇表大小相同的向量,其中该单词所在位置的值为 1,其余位置的值为 0。

    • “cat” -> [1, 0, 0, 0, 0]
    • “dog” -> [0, 1, 0, 0, 0]
    • “fish” -> [0, 0, 1, 0, 0]
    • “bird” -> [0, 0, 0, 1, 0]
    • “rabbit” -> [0, 0, 0, 0, 1]
  • 特点:

    • 稀疏性

      one-hot编码通常会产生非常稀疏的向量,尤其是词汇表很大时。大部分元素为零,只有一个位置是1。

    • 高维度

      词汇表的大小决定了one-hot向量的维度。如果词汇表包含10000个单词,那么每个单词的表示将是一个长度为10000的向量。

    • 信息缺失

      one-hot编码无法表达词与词之间的语义关系。例如,“cat” 和 “dog” 的表示完全不同,尽管它们在语义上很接近。

  • 优缺点:

    • 优点:实现简单,容易理解
    • 缺点:高维度稀疏向量的特性导致其计算效率低下,无法捕捉词之间的语义相似性.在大语料集下,每个向量的长度过大,占据大量内存
one-hot的编码实现

核心思路: 使用Tokenizer + 列表构成的向量 实现

  • 创建Tokenizer示例
    tokenizer = Tokenizer()

    • Tokenizer() 是 Keras.preprocessing.text 模块中的一个文本处理类。
    • 它用于 构建词典,并提供方法将文本转换为整数索引或其他格式(如 One-hot、词频矩阵等)。
    • 默认情况下,它会自动对文本进行标记化(Tokenization),并创建一个 word_index(单词到索引的映射)
  • 训练 Tokenizer
    tokenizer.fit_on_texts(texts=vocabs)

    • fit_on_texts(texts)用于基于提供的文本数据构建词典。
    • texts(这里是 vocabs)应该是一个包含多个句子的列表,每个句子是一个字符串。
    • Tokenizer 解析所有文本,统计每个单词的出现次数,并将单词转换为唯一的整数索引。
  • Tokenizer的主要属性

    • word_index 单词到索引的映射 => 字典类型的成员属性
    • word_counts(单词出现次数)
    • texts_to_sequences()(文本转索引序列)
构建one-hot编码器
from tensorflow.keras.preprocessing.text import Tokenizer
import joblib
# 根据语料库生成one-hot编码器
def dm_onehot_gen():"""1.准备语料2.实例化词汇映射器Tokenizer,使用映射器拟合现有文本 -> 生成 index_word word_index3.查询单词的索引下标4.保存映射器"""# 1. 准备语料vocabs = {"周杰伦", "陈奕迅", "王力宏", "李宗盛", "范丞丞", "杨宗纬"}# 2.实例化词汇映射器Tokenizer,使用映射器拟合现有文本 -> 生成 index_word word_indextokenizer = Tokenizer()tokenizer.fit_on_texts(texts=vocabs)print(tokenizer.word_index)# 3.查询单词的 idxfor vocab in vocabs:zero_list = [0] * len(vocabs)# 注意!! tokenizer生成的`word_index`字典是从下标1开始的idx = tokenizer.word_index[vocab] - 1zero_list[idx] = 1print(f'{vocab}的one-hot编码是->\t{zero_list}')# 4. 保存映射器path = './model/tokenizer'joblib.dump(tokenizer, filename=path)print('save tokenizer.....done')
使用one-hot编码器
def dm_one_hot_use(token = '周杰伦'):"""1.加载映射器2.查询单词的索引下标,赋值给zero_list,生成one-hot向量:return:"""# 2. 加载映射器tokenizer = joblib.load('./model/tokenizer')# 3.根据给定的token查询词表进行编码zero_list = [0] * len(tokenizer.word_index)cursor = tokenizer.word_index.get(token)if cursor is not None:idx = cursor - 1zero_list[idx] = 1print(f'{token}的one-hot向量表示为->{zero_list}')else:print('语料库中找不到该词语~')raise Exception

Word2Vec

  • 概念

    • Word2Vec是一种流行的将词汇表示成向量的无监督训练方法,该过程将构建神经网络模型,将网络参数作为词汇的向量表示,通过上下文信息来学习词语的分布式表示(即词向量)。它包含CBOWskipgram两种训练模式。
    • Word2Vec实际上利用了文本本身的信息来构建 “伪标签”。模型不是被人为地告知某个词语的正确词向量,而是通过上下文词语来预测中心词(CBOW)或者通过中心词来预测上下文词语(Skip-gram)。
    • Word2Vec的目标是将每个词转换为一个固定长度的向量,这些向量能够捕捉词与词之间的语义关系。
  • 特点

    • 低维稠密表示

      Word2Vec通过训练得到的词向量通常是稠密的,即大部分值不为零,每个向量的维度较小(通常几十到几百维)。

    • 捕捉语义关系

      Word2Vec可以通过词向量捕捉到词之间的语义相似性,例如通过向量运算可以发现"king"-“man”+“woman"≈"queen”。

  • 优缺点

    • 优点:能够生成稠密的词向量,捕捉词与词之间的语义关系,计算效率高。
    • 缺点:需要大量的语料来训练,且可能不适用于某些特定任务(例如:词语的多义性)。

  • CBOW(Continuous bag of words)模式

    • 概念:给定一段用于训练的 上下文词汇(周围词汇),预测目标词汇

    在这里插入图片描述

例如,在句子"the quick brown fox jumps over the lazy dog"中,如果目标词是"jumps",则CBOW模型使用"the",“quick”,“brown”,“fox”,“over”,“the”,“lazy”,“dog"这些上下文词来预测"jumps”。

图中窗口大小为9, 使用前后4个词汇对目标词汇进行预测。

CBOW的核心思想:语义相近的词在相似的上下文中出现

CBOW的模型架构

  • 输入层:将上下文词的one-hot编码输入模型(窗口内的词,忽略顺序)。
  • 隐藏层:对上下文词向量求平均,生成一个D维向量(词向量的中间表示)。
  • 输出层:通过softmax或负采样,将隐藏层向量映射到词汇表概率分布,预测目标词。

CBOW的前向传播过程

  1. 输入层 → 隐藏层

    • 每个上下文词通过权重矩阵 WW(维度 V×D,V为词汇表大小)映射为D维向量。

    • 隐藏层输出为上下文词向量的平均值:
      h = 1 C ∗ Σ c = 1 C W ∗ x c h=\frac{1}C * Σ_{c=1}^{C}W *x_c h=C1Σc=1CWxc

      C为上下文词数量,** x c x_c xc**为第c个词的one-hot向量)。

  2. 隐藏层 → 输出层

    • 隐藏层向量通过权重矩阵 W′W′(维度 D×V)映射到词汇表空间: u = ( W ′ ) T ⋅ h u=(W′)^T⋅h u=(W)Th

    • 使用softmax计算目标词概率分布:
      p ( w t ∣ c o n t e x t ) = e x p ⁡ ( u w t ) Σ v = 1 V e x p ⁡ ( u w t ) p(wt∣context)=\frac{exp⁡(u_{w_t})}{Σ^{V}_{v=1}exp⁡(u_{w_t})} p(wtcontext)=Σv=1Vexp(uwt)exp(uwt)

  3. 损失函数和优化

    • 损失函数: 多分类下的交叉熵损失(实际目标词为one-hot编码): L = − l o g ( p ( w t ∣ c o n t e x t ) ) L=−log(p(w_t∣context)) L=log(p(wtcontext))
    • 参数更新:通过反向传播更新权重矩阵 W 和 W′。
      • 仅更新与当前上下文词和目标词相关的行或列(稀疏更新)。

CBOW过程说明

  • 假设我们给定的训练语料只有一句话: Hope can set you free (愿你自由成长),窗口大小为3,因此模型的第一个训练样本来自Hope can set,因为是CBOW模式,所以将使用Hope和set作为输入,can作为输出,在模型训练时,Hope,can,set等词汇都使用它们的one-hot编码。如图所示: 每个one-hot编码的单词与各自的变换矩阵(即参数矩阵3x5->随机初始化,这里的3是指最后得到的词向量维度)相乘,得到上下文表示矩阵(3x1),也就是词向量。将所有上下文词语的词向量按元素平均,得到平均词向量

    在这里插入图片描述

  • 接着, 将上下文表示矩阵(平均词向量)与变换矩阵(参数矩阵5x3->随机初始化,所有的变换矩阵共享参数)相乘,得到5x1的结果矩阵,使用softmax函数将得分向量转换为概率分布,它将与我们真正的目标矩阵即can的one-hot编码矩阵(5x1)进行损失的计算,然后更新网络参数完成一次模型迭代。
    在这里插入图片描述

  • 最后窗口按顺序向后移动,重新更新参数,直到所有语料被遍历完成,得到最终的变换矩阵(3x5),这个变换矩阵与每个词汇的one-hot编码(5x1)相乘,得到的3x1的矩阵就是该词汇的word2vec张量表示。


  • Skip-gram模式

    • 概念:给定一个目标词,预测其上下文词汇。

      在这里插入图片描述

    例如,在句子"the quick brown fox jumps over the lazy dog"中,如果目标词是"jumps",skip-gram模型尝试预测它周围的词,如"the",“quick”,“brown”,“fox”,“over”,“the”,“lazy”,“dog”。

    图中窗口大小为9,使用目标词汇对前后四个词汇进行预测。

    • 核心思想:一个词的含义可以通过其周围的上下文词来表征

    Skip-gram的模型结构:

    • 输入层: 输入目标词的one-hot编码。
    • 隐藏层: 将目标词映射成D维向量(转换为低维稠密向量)
    • 输出层:通过softmax或负采样,预测窗口内所有上下文词的概率分布。

    Skip-gram的前向传播过程

    1. 输入层 → 隐藏层

      • 目标词的one-hot编码 x 通过权重矩阵 W**(维度 V×D)映射为D维向量: h = W T ⋅ x h=W^T⋅x h=WTx
      • 此向量 h 直接表示目标词的词向量。
    2. 隐藏层 → 输出层

      • 对每个上下文词位置,计算其概率分布: u c = ( W ′ ) T ⋅ h , ( c = 1 , 2 , … , C ) u_c=(W′)^T⋅h ,(c=1,2,…,C) uc=(W)Th,(c=1,2,,C)

      W′是输出权重矩阵,维度 D×V ,C 为窗口内上下文词总数

      • 使用softmax为每个上下文位置生成概率:
        p ( w c ∣ w t ) = e x p ⁡ ( u c , w c ) Σ v = 1 V e x p ⁡ ( u c , w c ) p(wc∣wt)=\frac{exp⁡(uc,wc)}{Σ^{V}_{v=1}exp⁡(uc,wc)} p(wcwt)=Σv=1Vexp(uc,wc)exp(uc,wc)
    3. 损失函数与优化

      • 损失函数:对每个上下文词计算交叉熵损失,并求和: L = − ∑ c = 1 C l o g ⁡ p ( w c ∣ w t ) L=−∑_{c=1}^Clog⁡p(wc∣wt) L=c=1Clogp(wcwt)
      • 参数更新:通过反向传播更新 WW 和 W′W′,仅涉及目标词和上下文词相关的行或列。
  • Skip-gram模式下的word2vec过程说明

    • 假设我们给定的训练语料只有一句话: Hope can set you free (愿你自由成长),窗口大小为3,因此模型的第一个训练样本来自Hope can set,因为是skip-gram模式,所以将使用can作为输入,Hope和set作为输出,在模型训练时,Hope、can、set等词汇都使用它们的one-hot编码。如图所示: 将can的one-hot编码与变换矩阵(即参数矩阵3x5, 这里的3是指最后得到的词向量维度)相乘, 得到目标词汇表示矩阵(3x1)。

    • 接着, 将目标词汇表示矩阵与多个变换矩阵(参数矩阵5x3)相乘, 得到多个5x1的结果矩阵,使用softmax函数将得分向量转换为概率分布,它将与我们Hope和set对应的one-hot编码矩阵(5x1)进行损失的计算, 然后更新网络参数完成一次模 型迭代。

    • 最后窗口按序向后移动,重新更新参数,直到所有语料被遍历完成,得到最终的变换矩阵即参数矩阵(3x5),这个变换矩阵与每个词汇的one-hot编码(5x1)相乘,得到的3x1的矩阵就是该词汇的word2vec张量表示。

      在这里插入图片描述

  • 词向量的检索获取

    • 神经网络训练完毕后,神经网络的参数矩阵w就我们的想要词向量。如何检索某1个单词的向量呢?以CBOW方式举例说明如何检索a单词的词向量。

    • 如下图所示:a的onehot编码[10000],用参数矩阵[3,5] * a的onehot编码[10000],可以把参数矩阵的第1列参数给取出来,这个[3,1]的值就是a的词向量。

      在这里插入图片描述

Word2Vec的编码实现
使用的核心库与函数介绍

fasttext:是facebook开源的一个词向量与文本分类工具。

下面是该工具包的安装方法:

  • 官网(fasttext-wheel)下载对应操作系统对应python解析器版本的fasttext模块的whl文件

  • 进入到base虚拟环境,然后在whl文件目录下通过以下命令安装

    # 当前目录下要有whl文件名称
    pip install asttext_wheel-0.9.2-cp311-cp311-win_amd64.whl
    

使用到的函数:fasttext.train_unsuperised

函数功能:返回一个无监督训练过后的词向量训练模型部分超参数解释
input:输入的文件路径
model:'skipgram'或者'cbow', 默认为'skipgram',在实践中,skipgram模式在利用子词方面比cbow更好.
dim:词嵌入维度
epoch:训练迭代次数
lr:学习率
thread:使用的线程数
实现流程

数据来源:http://mattmahoney.net/dc/enwik9.zip

  • 原始数据预处理
# 使用wikifil.pl文件处理脚本来清除XML/HTML格式的内容
perl wikifil.pl data/enwik9 > data/fil9 # 该命令已经执行
  • 词向量的训练
import fasttextdef word2vec_train():model = fasttext.train_unsupervised(input='./data/fil9', model='skipgram', dim=300, lr=1e-1, epoch=1, thread=12)print('word2vec->done')model.save_model(path='./model/fil9.bin')print('model->save')
  • 模型效果检验
def model_use(k=10):model = fasttext.load_model(path='./model/fil9.bin')vector = model.get_word_vector(word='the')print(f'the的词向量表示为{vector}')nn = model.get_nearest_neighbors(word='the', k=k)print(f'the的{k}个最相近邻居为:{nn}')

词嵌入 Word Embedding

Word Embedding(词嵌入)是一种将自然语言中的词语映射到低维连续向量空间的技术,使得词语的语义和语法关系能通过向量间的距离和方向体现。它是自然语言处理(NLP)的基础技术之一。

经典模型与方法

  • Word2Vec(2013)
    • Skip-Gram:通过中心词预测上下文词。
    • CBOW(Continuous Bag-of-Words):通过上下文词预测中心词。
    • 示例:king - man + woman ≈ queen(向量运算体现语义关系)。

Word2Vec是一种Word Embedding方法,专门用于生成词的稠密向量表示。Word2Vec通过神经网络训练,利用上下文信息将每个词表示为一个低维稠密向量。

  • GloVe(2014)
    基于全局词共现矩阵,结合统计信息与局部上下文,优化词语的向量表示。
  • 上下文相关嵌入
    • ELMo(2018):通过双向LSTM生成动态词向量,同一词在不同语境中有不同表示。
    • BERT(2018):基于Transformer的预训练模型,通过掩码语言建模(MLM)捕捉深层上下文信息。

编码实现(了解)

import jieba
import torch
from tensorflow.keras.preprocessing.text import Tokenizer
import torch.nn as nndef dm_embedd():# todo:1-创建文本句子, 生成文本sentence1 = '哎呀~今天天气真好'sentence2 = "只因你实在是太美"sentences = [sentence1, sentence2]print('sentences->', sentences)# todo: 2-获取文本词列表word_list = list()for s in sentences:word_list.append(jieba.lcut(s))print('word_list->', word_list)# todo: 3- 借助Tokenizer类,实现下标与词的映射字典,文本下标表示"""Tokenizer类的参数:num_words: the maximum number of words to keep, basedon word frequency. Only the most common `num_words-1` words willbe kept.filters: a string where each element is a character that will befiltered from the texts. The default is all punctuation, plustabs and line breaks, minus the `'` character.lower: boolean. Whether to convert the texts to lowercase.split: str. Separator for word splitting.char_level: if True, every character will be treated as a token.oov_token: if given, it will be added to word_index and used toreplace out-of-vocabulary words during text_to_sequence callsanalyzer: function. Custom analyzer to split the text.The default analyzer is text_to_word_sequence"""tokenizer = Tokenizer()tokenizer.fit_on_texts(texts=word_list)# 打印 my_token_listmy_token_list = tokenizer.index_word.values()  # <class 'dict_values'># print('my_token_list->', my_token_list)# 打印文本数值化后的句子sentence2id = tokenizer.texts_to_sequences(texts=word_list)# print('sentence2id->', sentence2id)# todo: 4- 创建nn.Embedding层embed = nn.Embedding(num_embeddings=len(my_token_list), embedding_dim=8)# print('embed--->',embed)# print('nn.Embedding层词向量矩阵-->', embed.weight.data, embed.weight.data.shape, type(embed.weight.data))# # todo: 5-创建SummaryWriter对象# from torch.utils.tensorboard import SummaryWriter# summary_writer = SummaryWriter(log_dir='./data/runs')# # add_embedding(mat=embed.weight.data, metadata=my_token_list)# # mat:词向量表示 张量或numpy数组# # metadata:词标签# # 作用: 将高维数据(如词嵌入、特征向量等)投影到低维空间(通常是二维或三维),以便在 TensorBoard 的 Embedding Projector 中进行可视化。# summary_writer.add_embedding(mat=embed.weight.data, metadata=my_token_list)# summary_writer.close()# todo: 5-创建SummaryWriter对象from torch.utils.tensorboard import SummaryWritersummary_writer = SummaryWriter(log_dir='./data/runs')# add_embedding(mat=embed.weight.data, metadata=my_token_list)# mat:词向量表示 张量或numpy数组# metadata:词标签# 作用: 将高维数据(如词嵌入、特征向量等)投影到低维空间(通常是二维或三维),以便在 TensorBoard 的 Embedding Projector 中进行可视化。summary_writer.add_embedding(mat=embed.weight.data, metadata=my_token_list)summary_writer.close()# todo: -6 从nn.Embedding层中根据idx拿词向量for idx in range(len(my_token_list)):tmp_vector = embed(torch.tensor(idx))print(f'{tokenizer.index_word[idx + 1]}的词嵌入向量为:{tmp_vector.detach().numpy()}')

相关文章:

02_NLP文本预处理之文本张量表示法

文本张量表示法 概念 将文本使用张量进行表示,一般将词汇表示为向量,称为词向量,再由各个词向量按顺序组成矩阵形成文本表示 例如: ["人生", "该", "如何", "起头"]># 每个词对应矩阵中的一个向量 [[1.32, 4,32, 0,32, 5.2],[3…...

Spring Boot全局异常处理:“危机公关”团队

目录 一、全局异常处理的作用二、Spring Boot 实现全局异常处理&#xff08;附上代码实例&#xff09;三、总结&#xff1a; &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&#xff0c;可以多多支持一下&#xff0c;感谢&#x1…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_list_init

ngx_list_init 定义在 src\core\ngx_list.h static ngx_inline ngx_int_t ngx_list_init(ngx_list_t *list, ngx_pool_t *pool, ngx_uint_t n, size_t size) {list->part.elts ngx_palloc(pool, n * size);if (list->part.elts NULL) {return NGX_ERROR;}list->par…...

C# OnnxRuntime部署DAMO-YOLO香烟检测

目录 说明 效果 模型信息 项目 代码 下载 参考 说明 效果 模型信息 Model Properties ------------------------- --------------------------------------------------------------- Inputs ------------------------- name&#xff1a;input tensor&#xff1a;Floa…...

GitHub开源协议选择指南:如何为你的项目找到最佳“许可证”?

引言 当你站在GitHub仓库创建的十字路口时&#xff0c;是否曾被众多开源协议晃花了眼&#xff1f; 别担心&#xff01;这篇指南将化身你的"协议导航仪"&#xff0c;用一张流程图五个灵魂拷问&#xff0c;帮你轻松找到最佳选择。无论你是开发者、开源爱好者&#xff…...

[密码学实战]Java生成SM2根证书及用户证书

前言 在国密算法体系中,SM2是基于椭圆曲线密码(ECC)的非对称加密算法,广泛应用于数字证书、签名验签等场景。本文将结合代码实现,详细讲解如何通过Java生成SM2根证书及用户证书,并深入分析其核心原理。 一、证书验证 1.代码运行结果 2.根证书验证 3.用户证书验证 二、…...

安装 cnpm 出现 Unsupported URL Type “npm:“: npm:string-width@^4.2.0

Unsupported URL Type "npm:": npm:string-width^4.2.0 可能是 node 版本太低了&#xff0c;需要安装低版本的 cnpm 试试 npm cache clean --force npm config set strict-ssl false npm install -g cnpm --registryhttps://registry.npmmirror.com 改为 npm insta…...

探秘基带算法:从原理到5G时代的通信变革【九】QPSK调制/解调

文章目录 2.8 QPSK 调制 / 解调简介QPSK 发射机的实现与原理QPSK 接收机的实现与原理QPSK 性能仿真QPSK 变体分析 本博客为系列博客&#xff0c;主要讲解各基带算法的原理与应用&#xff0c;包括&#xff1a;viterbi解码、Turbo编解码、Polar编解码、CORDIC算法、CRC校验、FFT/…...

四、数据存储

在爬虫项目中&#xff0c;我们需要将目标站点数据进行持久化保存&#xff0c;一般数据保存的方式有两种&#xff1a; 文件保存数据库保存 在数据保存的过程中需要对数据完成去重操作&#xff0c;所有需要使用 redis 中的 set 数据类型完成去重。 1.CSV文件存储 1.1 什么是c…...

C# OnnxRuntime部署DAMO-YOLO人头检测

目录 说明 效果 模型信息 项目 代码 下载 参考 说明 效果 模型信息 Model Properties ------------------------- --------------------------------------------------------------- Inputs ------------------------- name&#xff1a;input tensor&#xff1a;Floa…...

Metal学习笔记七:片元函数

知道如何通过将顶点数据发送到 vertex 函数来渲染三角形、线条和点是一项非常巧妙的技能 — 尤其是因为您能够使用简单的单行片段函数为形状着色。但是&#xff0c;片段着色器能够执行更多操作。 ➤ 打开网站 https://shadertoy.com&#xff0c;在那里您会发现大量令人眼花缭乱…...

《一个端粒到端粒的参考基因组为木瓜中五环三萜类化合物生物合成提供了遗传学见解》

A telomere-to-telomere reference genome provides genetic insight into the pentacyclic triterpenoid biosynthesis in Chaenomeles speciosa Amplification of transposable elements 转座元件的扩增 Sequence mining disclosed that TEs were one main event in the ex…...

【Mac】2025-MacOS系统下常用的开发环境配置

早期版本的一个环境搭建参考 1、brew Mac自带终端运行&#xff1a; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" Installation successful!成功后运行三行命令后更新环境&#xff08;xxx是mac的username&a…...

蓝桥杯web第三天

展开扇子题目&#xff0c; #box:hover #item1 { transform:rotate(-60deg); } 当悬浮在父盒子&#xff0c;子元素旋转 webkit display: -webkit-box&#xff1a;将元素设置为弹性伸缩盒子模型。-webkit-box-orient: vertical&#xff1a;设置伸缩盒子的子元素排列方…...

Qt基础入门-详解

前言 qt之路正式开启 &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&#x1f44…...

FPGA开发,使用Deepseek V3还是R1(3):系统级与RTL级

以下都是Deepseek生成的答案 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;1&#xff09;&#xff1a;应用场景 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;2&#xff09;&#xff1a;V3和R1的区别 FPGA开发&#xff0c;使用Deepseek V3还是R1&#x…...

移动端国际化翻译同步解决方案-V3

1.前言 因为软件出海&#xff0c;从在上上家公司就开始做翻译系统&#xff0c;到目前为止已经出了两个比较大的版本了&#xff0c;各个版本解决的痛点如下&#xff1a; V1版本&#xff1a; 主要针对的是AndroidiOS翻译不一致和翻译内容管理麻烦的问题&#xff0c;通过这个工具…...

多空狙击线-新指标-图文教程,多空分界买点以及强弱操盘技术教程,通达信炒股软件指标

“多空狙击线”指标 “多空狙击线”特色指标是量能型技术指标&#xff0c;主要用于分析股票市场中机构做多/做空力量的强程度。该指标的构成、定义与原理如下: “多空狙击线”指标&#xff0c;又称机构做多/做空能量线&#xff0c;通过计算和分析股票市场中机构做多/做空力量…...

零信任架构和传统网络安全模式的

零信任到底是一个什么类型的模型&#xff1f;什么类型的思想或思路&#xff0c;它是如何实现的&#xff0c;我们要做零信任&#xff0c;需要考虑哪些问题&#xff1f; 零信任最早是约翰金德瓦格提出的安全模型。早期这个模型也是因为在安全研究上考虑的一个新的信任式模型。他最…...

Oracle 11g的部署配置

1、进入官网下载所需版本的Oracle 2、安装 ①&#xff1a;选择setup.exe开始安装 ②&#xff1a;安装提示如下&#xff0c;直接忽略&#xff0c;选是 ③&#xff1a;配置安全更新 填写邮箱&#xff0c;并取消勾选 ④&#xff1a;如果点击下一步&#xff0c;提示什么代理啥的…...

下载b站视频音频

文章目录 方案一&#xff1a;jjdown如何使用 方案二&#xff1a;bilibili哔哩哔哩下载助手如何使用进入插件网站插件下载插件安装 使用插件下载视频音频&#xff1a;复制音频下载地址 方案三&#xff1a;bat命令下载单个音频下载单个视频下载单个音视频 方案一&#xff1a;jjdo…...

记录spring-boot 3.X版本整合RocketMq

版本信息 先把该次整合的版本信息列如下&#xff1a; spring-boot spring-cloud rocketmq-spring-boot-starter rocketmq-client rocketmq 3.0.13 2022.0.5 2.2.3 4.9.8 4.9.8 版本信息是如何选择的呢&#xff1f;看rocketMq官网springcloud alibaba版本声明 rock…...

《基于HarmonyOS NEXT API 12+,搭建新闻创作智能写作引擎》

在信息爆炸的时代&#xff0c;新闻行业对于内容生产的效率和质量有着极高的要求。AI技术的发展为新闻创作带来了新的变革契机&#xff0c;借助AI智能写作助手&#xff0c;新闻工作者可以快速生成新闻稿件的初稿&#xff0c;大大提高创作效率。本文将基于HarmonyOS NEXT API 12及…...

探秘基带算法:从原理到5G时代的通信变革【六】CRC 校验

文章目录 2.5 CRC 校验2.5.1 前言2.5.2 CRC算法简介2.5.3 CRC计算的详细过程2.5.4 CRC校验的两种方法详解**分离比较法****整体运算法****不同位出错与余数的关系****总结** 2.5.5 CRC计算的C实现及工具介绍**C实现CRC计算****CRC计算工具推荐** **2.5.6 总结&#xff1a;CRC校…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_conf_add_dump

ngx_conf_add_dump 定义在src\core\ngx_conf_file.c static ngx_int_t ngx_conf_add_dump(ngx_conf_t *cf, ngx_str_t *filename) {off_t size;u_char *p;uint32_t hash;ngx_buf_t *buf;ngx_str_node_t *sn;ngx_conf_dump_t *cd;has…...

MySQL快速搭建主从复制

一、基于位点的主从复制部署流程 确定主库Binlog是否开启修改主从server_id主库导出数据从库导入数据确定主库备份时的位点在从库配置主库信息查看复制状态并测试数据是否同步 二、准备阶段(主库和从库配置都需要修改&#xff09; 1、确定主库Binlog是否开启 2、修改主从se…...

Linux注册进程终止处理函数

atexit() 是一个标准库函数&#xff0c;用于注册在进程正常终止时要调用的函数。通过 atexit()&#xff0c;你可以确保在程序结束时自动执行一些清理工作&#xff0c;比如释放资源、保存状态等。 函数原型如下&#xff1a; #include <stdlib.h> int atexit(void (*func…...

pytorch 模型测试

在使用 PyTorch 进行模型测试时,一般包含加载测试数据、加载训练好的模型、进行推理以及评估模型性能等步骤。以下为你详细介绍每个步骤及对应的代码示例。 1. 导入必要的库 import torch import torch.nn as nn import torchvision import torchvision.transforms as trans…...

水仙花数(华为OD)

题目描述 所谓水仙花数&#xff0c;是指一个n位的正整数&#xff0c;其各位数字的n次方和等于该数本身。 例如153是水仙花数&#xff0c;153是一个3位数&#xff0c;并且153 13 53 33。 输入描述 第一行输入一个整数n&#xff0c;表示一个n位的正整数。n在3到7之间&#x…...

(十二)基于 Vue 3 和 Mapbox GL 实现的坐标拾取器组件示例

下面是一个基于 Vue 3 和 Mapbox GL 实现的坐标拾取器组件示例: <template><div class="map-container"><div ref="mapContainer" class="map"></div><div class="coordinates-box"><div v-if=&qu…...