NLP经典论文:Word2vec、CBOW、Skip-gram 笔记

  • 论文
  • 介绍
  • 模型结构
    • CBOW模型
      • 整体模型
        • 输入
        • 输出
        • 整体流程
        • 整体维度
      • 输入层与投影层
        • 输入
        • 输出
      • 输出层
        • 输入
        • 输出
        • 原本方式:传统softmax
        • 优化方式1:分层softmax
        • 优化方式2:负采样Negative Sampling
          • 交叉熵损失
    • Skip-gram模型
      • 整体模型
        • 输入
        • 输出
        • 整体流程
        • 流程维度
      • 输入层与投影层
        • 输入
        • 输出
      • 输出层
        • 输入
        • 输出
        • 理解1
        • 理解2
      • 优化目标
        • 优化方式
  • 文章部分翻译
    • 3 New Log-linear Models
      • 3.1 CBOW
      • 3.2 Continuous Skip-gram Model
  • 相关视频
  • 相关的笔记
  • 相关代码
    • pytorch
    • tensorflow
      • keras
  • API:

论文

NLP论文笔记合集(持续更新)

原论文:《Efficient Estimation of Word Representations in Vector Space》

分层softmax和负采样Negative Sampling的介绍:《Distributed Representations of Words and Phrases and their Compositionality》

介绍

2013-01发表的文章,使用低纬连续向量表示代替传统的one-hot高维稀疏表示。

模型结构

CBOW模型


CBOW为Continuous Bag-of-Words,将传统的稀疏空间表示的词向量转化成稠密空间表示的词向量。

有一个大家说过:一个词,可以有其上下文文本来表示。

CBOW的思想就是如果一个词经过投影降维,和上下文文本经过投影降维,在低维空间是一样的向量,那么这个降维矩阵就是我想要的转换矩阵,即look up table,embedding vector matrix。

但它有一个缺点,就是上下文词的表示,只是简单地将词向量进行叠加,即在低维的embedding空间进行合成,而没有考虑真正地考虑词的上下文关系的空间上的关系,比如(我/爱/国/共),作为上下文去预测中心词(中),和(共/国/爱/我),作为上下文去预测中心词(中),是没有区别的,预测结果是一样的。

整体模型

输入

w t − 2 , w t − 1 , w t − 1 , w t − 2 w_{t-2}, w_{t-1}, w_{t-1}, w_{t-2} wt2,wt1,wt1,wt2输入为 w t w_{t} wt的上下文,文本通过one-hot表示, w ∈ R V × 1 w \in R^{V \times 1} wRV×1,V为字典大小,包含词的总数。

输出

f ( w t − 2 , w t − 1 , w t + 1 , w t + 2 ) = w t ^ f(w_{t-2}, w_{t-1}, w_{t+1}, w_{t+2})=\hat{w_t} f(wt2,wt1,wt+1,wt+2)=wt^w ^ \hat{w} w^为预测词,为 m a x { p } max\{\boldsymbol{p}\} max{p}所对应的词,其中

p = { p ( w 1 ∣ w t − 2 , w t − 1 , w t + 1 , w t + 2 ) , p ( w 2 ∣ w t − 2 , w t − 1 , w t + 1 , w t + 2 ) , . . . , p ( w i ∣ w t − 2 , w t − 1 , w t + 1 , w t + 2 ) , . . . } , i = 1 , 2 , 3 , . . . , V \boldsymbol{p}=\{p(w_1|w_{t-2}, w_{t-1}, w_{t+1}, w_{t+2}), p(w_2|w_{t-2}, w_{t-1}, w_{t+1}, w_{t+2}), ..., p(w_i|w_{t-2}, w_{t-1}, w_{t+1}, w_{t+2}),...\}, i=1, 2, 3, ..., V p={p(w1wt2,wt1,wt+1,wt+2),p(w2wt2,wt1,wt+1,wt+2),...,p(wiwt2,wt1,wt+1,wt+2),...},i=1,2,3,...,V

意思就是给定 w t w_{t} wt的上下文输入词( w t − 2 , w t − 1 , w t + 1 , w t + 2 w_{t-2}, w_{t-1}, w_{t+1}, w_{t+2} wt2,wt1,wt+1,wt+2),预测词 w t w_{t} wt时, { p } \{\boldsymbol{p}\} {p}中概率最大的那个 p ( w i ∣ w t − n + 1 , w t − n + 2 , . . . , w t − 1 ) p(w_i|w_{t-n+1}, w_{t-n+2}, ..., w_{t-1}) p(wiwtn+1,wtn+2,...,wt1)所对应的那个词 w i w_i wi,就是预测输出的词。

整体流程

整体维度

输入层与投影层

输入

w t − 2 , w t − 1 , w t − 1 , w t − 2 w_{t-2}, w_{t-1}, w_{t-1}, w_{t-2} wt2,wt1,wt1,wt2输入为 w t w_{t} wt的上下文,文本通过one-hot表示, w ∈ R V × 1 w \in R^{V \times 1} wRV×1,V为字典大小,包含词的总数。

输出

x = C t − 2 + C t − 1 + C t + 1 + C t + 2 , x ∈ R m × 1 \boldsymbol{x}=C_{t-2}+C_{t-1}+C_{t+1}+C_{t+2}, \boldsymbol{x}\in R^{m\times 1} x=Ct2+Ct1+Ct+1+Ct+2,xRm×1

其中, C i = C w i C_{i}=\boldsymbol{C}w_{i} Ci=CwiC i ∈ R m × 1 C_i \in R^{m\times 1} CiRm×1C \boldsymbol{C} C为变换矩阵,投影矩阵, C ∈ R m × V \boldsymbol{C} \in R^{m \times V} CRm×V,把one-hot表示的稀疏向量从稀疏的V维空间投影到稠密的m维空间。然后再将 C i C_i Ci进行求和起来,形成上下文信息,传递给下一层。

输出层

输入

x = C t − 2 + C t − 1 + C t + 1 + C t + 2 , x ∈ R m × 1 \boldsymbol{x}=C_{t-2}+C_{t-1}+C_{t+1}+C_{t+2}, \boldsymbol{x}\in R^{m\times 1} x=Ct2+Ct1+Ct+1+Ct+2,xRm×1

输出

w t ^ \hat{w_t} wt^

原本方式:传统softmax

将输入 x \boldsymbol{x} x传入线性层对预测目标类别进行打分,再通过softmax层求得字典中每个词 w i w_i wi的预测概率为:
p ( w i ∣ w t − 2 , w t − 1 , w t + 1 , w t + 2 ) = e θ i x ∑ i = 1 V e θ i x p(w_i|w_{t-2}, w_{t-1}, w_{t+1}, w_{t+2})=\frac{e^{\boldsymbol{\theta_i} \boldsymbol{x}}}{\sum\limits_{i=1}^Ve^{\boldsymbol{\theta_i} \boldsymbol{x}}} p(wiwt2,wt1,wt+1,wt+2)=i=1Veθixeθix
其中 θ i ∈ R 1 × m , i = 1 , 2 , . . . , V \boldsymbol{\theta_i} \in R^{1\times m}, i=1, 2, ..., V θiR1×m,i=1,2,...,V

作者在《Distributed Representations of Words and Phrases and their Compositionality》文章中写到了2种优化方式:分层softmax和负采样Negative Sampling

优化方式1:分层softmax

传统的softmax,在计算概率 p ( w i ∣ w t − 2 , w t − 1 , w t + 1 , w t + 2 ) p(w_i|w_{t-2}, w_{t-1}, w_{t+1}, w_{t+2}) p(wiwt2,wt1,wt+1,wt+2)的时候,分母需要计算所有词的 e 得 分 e^{得分} e,即 e θ i x e^{\boldsymbol{\theta_i} \boldsymbol{x}} eθix,会带来巨大的花费,于是提出了分层softmax,基于Huffman Tree:

σ ( ⋅ ) \sigma(\centerdot) σ()为sigmoid函数。

优点:将预先定义好的类别,即词,按照词频排序,词频高的词,靠近树的根节点,词频低的词,远离根节点,每一个非叶子节点处都形成一个二分类问题,每一个节点都代表了0或1的分类标签。基于本节点,预测左右子节点的概率时,预测为左子节点的概率为 σ ( θ x ) \sigma(\boldsymbol{\theta x}) σ(θx),预测为右子节点的概率为 1 − σ ( θ x ) 1-\sigma(\boldsymbol{\theta x}) 1σ(θx)。从根节点到label所在的叶节点的路径为 l l l,其中第j层节点由其上一级父节点j-1节点进行二分类得到,其概率为:
p ( d j ∣ x , θ j − 1 ) = [ σ ( x θ j − 1 ) ] d j ⋅ [ 1 − σ ( x θ j − 1 ) ] 1 − d j p(d_j|\boldsymbol{x},\boldsymbol{\theta_{j-1}}) = [\sigma(\boldsymbol{x}\boldsymbol{\theta_{j-1}})]^{d_j} \cdot [1-\sigma(\boldsymbol{x}\boldsymbol{\theta_{j-1}})]^{1-d_j} p(djx,θj1)=[σ(xθj1)]dj[1σ(xθj1)]1dj
d j d_j dj为0或1的分类标签。

每一个叶节点,即预测词所在节点的概率为:
p ( w i ∣ w t − 2 , w t − 1 , w t + 1 , w t + 2 ) = p ( w i ∣ x ) = ∏ j l p ( d j ∣ x , θ j − 1 ) p(w_i|w_{t-2}, w_{t-1}, w_{t+1}, w_{t+2})=p(w_i|\boldsymbol{x}) = \prod_j^lp(d_j|\boldsymbol{x},\boldsymbol{\theta_{j-1}}) p(wiwt2,wt1,wt+1,wt+2)=p(wix)=jlp(djx,θj1)

例如在计算 w 4 w_4 w4的概率的时候:
p ( w 4 ∣ w t − 2 , w t − 1 , w t + 1 , w t + 2 ) = ( 1 − σ ( θ 1 x ) ) ( 1 − σ ( θ 2 x ) ) ( 1 − σ ( θ 3 x ) ) p(w_4|w_{t-2}, w_{t-1}, w_{t+1}, w_{t+2})=(1-\sigma(\boldsymbol{\theta_1x}))(1-\sigma(\boldsymbol{\theta_2x}))(1-\sigma(\boldsymbol{\theta_3x})) p(w4wt2,wt1,wt+1,wt+2)=(1σ(θ1x))(1σ(θ2x))(1σ(θ3x))
在求交叉熵损失 l o s s = − log ⁡ p ( w t ∣ w t − n + 1 , w t − n + 2 , . . . , w t − 1 ) loss=-\log p(w_t|w_{t-n+1}, w_{t-n+2}, ..., w_{t-1}) loss=logp(wtwtn+1,wtn+2,...,wt1)的时候,这么做就能避免原本softmax分母 ∑ i = 1 V e θ i x \sum\limits_{i=1}^Ve^{\boldsymbol{\theta_i} \boldsymbol{x}} i=1Veθix的V次得分计算,改为 ∏ j l p ( θ j − 1 x ) \prod\limits_j^lp(\boldsymbol{\theta_{j-1}x}) jlp(θj1x)至多logV次的计算,减小运算量。

优化方式2:负采样Negative Sampling

如果我们的训练样本里的中心词 w t w_t wt是一个很生僻的词,那么就得在Huffman Tree中辛苦的向下走很久了。能不能不用搞这么复杂的一颗霍夫曼树,将模型变的更加简单呢?

Negative Sampling就是这么一种求解word2vec模型的方法,它摒弃了霍夫曼树,采用了Negative Sampling(负采样)的方法来求解:

σ ( ⋅ ) \sigma(\centerdot) σ()为sigmoid函数。与前面的方法不一样,这里每个预测词的概率之和 ∑ i V p ( w i ∣ w t − 2 , w t − 1 , w t + 1 , w t + 2 ) ≠ 1 \sum\limits_i^Vp(w_i|w_{t-2}, w_{t-1}, w_{t+1}, w_{t+2})\neq1 iVp(wiwt2,wt1,wt+1,wt+2)=1

c o n t e x t ( w t ) = ( w t − 2 , w t − 1 , w t + 1 , w t + 2 ) context(w_t)=(w_{t-2}, w_{t-1}, w_{t+1}, w_{t+2}) context(wt)=(wt2,wt1,wt+1,wt+2),对于一个样本 ( c o n t e x t ( w t ) , w t ) (context(w_t),w_t) (context(wt)wt)来说,其他样本都是他的反例 n e g ( w t ) neg(w_t) neg(wt)

交叉熵损失

前面的方法:
l o s s = − log ⁡ p ( w t ∣ θ x ) loss= - \log p(w_t|\boldsymbol{\theta x}) loss=logp(wtθx)
Negative Sampling:

l o s s = − log ⁡ p ( w t ∣ θ w t x ) − ∑ w u ∈ n e g ( w t ) log ⁡ [ 1 − p ( w u ∣ θ w u x ) ] loss= - \log p(w_t|\boldsymbol{\theta_{w_t}x}) - \sum\limits_{w_u\in neg(w_t)} \log [1-p(w_u|\boldsymbol{\theta_{w_u}x})] loss=logp(wtθwtx)wuneg(wt)log[1p(wuθwux)]
从而达到反向传播在训练正例词对应的参数的时候,反例的参数也得到更新,降低复杂度,增加训练速度。

Skip-gram模型


Skip-gram的思想就是,通过中心词,去预测上下文的词。

整体模型

输入

w t w_{t} wt,文本 w t w_{t} wt通过one-hot表示, w ∈ R V × 1 w \in R^{V \times 1} wRV×1,V为字典大小,包含词的总数。

输出

f ( w t ) = ( w ^ t − 2 , w ^ t − 1 , w ^ t + 1 , w ^ t + 2 ) f(w_t)=(\hat{w}_{t-2}, \hat{w}_{t-1}, \hat{w}_{t+1}, \hat{w}_{t+2}) f(wt)=(w^t2,w^t1,w^t+1,w^t+2)w ^ \hat{w} w^为预测的上下文词,为预测概率 { p } \{\boldsymbol{p}\} {p}所对应的前4个最大概率的词,其中

p = { p ( w 1 ∣ w t ) , p ( w 2 ∣ w t ) , . . . , p ( w i ∣ w t ) , . . . , p ( w V ∣ w t ) } , i = 1 , 2 , 3 , . . . , V \boldsymbol{p}=\{p(w_1|w_t), p(w_2|w_t), ..., p(w_i|w_t), ..., p(w_V|w_t)\}, i=1, 2, 3, ..., V p={p(w1wt),p(w2wt),...,p(wiwt),...,p(wVwt)},i=1,2,3,...,V

意思就是给定输入词 w t w_{t} wt,预测 w t w_{t} wt的上下文 c o n t e x t ( w t ) context(w_t) context(wt)时,这里 c o n t e x t ( w t ) context(w_t) context(wt)( w t − 2 , w t − 1 , w t − 1 , w t − 2 ) (w_{t-2}, w_{t-1}, w_{t-1}, w_{t-2}) (wt2,wt1,wt1,wt2){ p } \{\boldsymbol{p}\} {p}中概率最大的前四个 p ( w i ∣ w t ) p(w_i|w_t) p(wiwt)所对应的词 w i w_i wi,就是预测的上下文输出词。

整体流程

流程维度

输入层与投影层

输入

w t w_{t} wt,文本 w t w_{t} wt通过one-hot表示, w ∈ R V × 1 w \in R^{V \times 1} wRV×1,V为字典大小,包含词的总数。

输出

x = W w t \boldsymbol{x}=\boldsymbol{W}w_t x=Wwt

可以理解为经过投影层从稀疏的高维空间映射到稠密的低维空间,也可以理解为从中心词字典look up table中查表得到改词在低维空间中的值。

输出层

输入

x = W w t \boldsymbol{x}=\boldsymbol{W}w_t x=Wwt

输出

( w ^ t − 2 , w ^ t − 1 , w ^ t + 1 , w ^ t + 2 ) (\hat{w}_{t-2}, \hat{w}_{t-1}, \hat{w}_{t+1}, \hat{w}_{t+2}) (w^t2,w^t1,w^t+1,w^t+2)w ^ \hat{w} w^为预测的上下文词

理解1

每个词在低维向量中都有2种表示,一种是在中心词字典中,表示为 v ∈ W , W ∈ R d × V \boldsymbol{v} \in \boldsymbol{W},\boldsymbol{W} \in R^{d \times V} vWWRd×V,这里的 v \boldsymbol{v} v也就是这一层的输入 x \boldsymbol{x} x,一种是在背景词字典中,表示为 u ∈ W ′ , W ′ ∈ R V × d \boldsymbol{u} \in \boldsymbol{W}^{\prime},\boldsymbol{W}^{\prime} \in R^{V \times d} uWWRV×d

在投影层到输出层之间,通过点积计算2个词之间的相似度得分,在通过softmax预测每个词 w i w_i wi的概率,结合到一起就是:
p ( w i ∣ w t ) = e x p ( u i v w t ) ∑ j V e x p ( u j v w t ) p(w_i|w_t)=\frac{exp(\boldsymbol{u_i v_{w_t}})}{\sum\limits_j^V exp(\boldsymbol{u_j v_{w_t}})} p(wiwt)=jVexp(ujvwt)exp(uivwt)
前四个概率最大的 p ( w o ∣ w t ) p(w_o|w_t) p(wowt)所对应的词就是输出的上下文词。

理解2

可以忽略背景词字典的理解,把 u \boldsymbol{u} u当成线性层的参数 θ \boldsymbol{\theta} θ,对 x \boldsymbol{x} x进行特征提取,得到的是改词的分值,再经过softmax层预测每个词 w o w_o wo的概率。
p ( w i ∣ w t ) = e x p ( θ i x ) ∑ j V e x p ( θ j x ) p(w_i|w_t)=\frac{exp(\boldsymbol{\theta_i x})}{\sum\limits_j^V exp(\boldsymbol{\theta_j x})} p(wiwt)=jVexp(θjx)exp(θix)

优化目标

l o s s = ∑ t T ∑ − m ≤ j ≤ m , j ≠ 0 log ⁡ p ( w j ∣ w t ) loss=\sum_t^T\sum_{-m \leq j \leq m, j \neq 0 } \log p(w_j|w_t) loss=tTmjm,j=0logp(wjwt)
T是所有时刻,即文本长度,m是一个滑动窗口,表示距离中心词 w t w_t wt的最大距离。

优化方式

  1. 分层softmax
  2. 负采样Negetive Sampling

与上文中CBOW的优化方式一样。

文章部分翻译

3 New Log-linear Models

在本节中,我们提出了两种新的模型架构,用于学习单词的分布式表示,以尽量减少计算复杂性。上一节的主要观察结果是,大多数复杂性是由模型中的非线性隐藏层引起的。虽然这正是神经网络如此吸引人的原因,但我们决定探索更简单的模型,这些模型可能无法像神经网络那样精确地表示数据,但可能可以更有效地在数据上进行训练。

新的体系结构直接遵循了我们早期工作[13,14]中提出的体系结构,我们发现神经网络语言模型可以通过两个步骤成功训练:首先,使用简单模型学习词的连续词向量,然后基于这些词的分布式表示来训练N-gram NNLM。虽然后来有大量的工作集中于学习词向量,但我们认为在[13 ]中提出的方法是最简单的。请注意,相关模型的提出也早得多[26,8]。

3.1 CBOW

第一个提出的架构类似于前馈NNLM,其中非线性隐藏层被移除,投影层被所有词共享(不仅仅是投影矩阵);因此,所有单词都被投影到相同的位置(它们的向量被平均)。我们称这种结构为词袋模型,因为句子中的文字顺序不影响投影。此外,我们还使用来自下文的词语;在下一节介绍的任务中,我们通过构建一个log-linear分类器,输入四个下文单词和四个上文单词,从而获得了最佳性能,其中训练标准是正确分类当前(中间)单词。训练的复杂性也随之增加

我们将该模型进一步表示为CBOW,因为与标准词袋模型不同,它使用上下文的连续分布式表示。模型架构如图1所示。请注意,输入层和投影层之间的权重矩阵对于所有单词位置是共享的,方式与NNLM中相同。

3.2 Continuous Skip-gram Model

第二种架构类似于CBOW,但它不是根据上下文预测当前词,而是尝试基于同一句子中的另一个单词来最大限度地对当前词进行分类。更准确地说,我们使用每个当前单词作为具有连续投影层的log-linear分类器的输入,并在当前词的前后范围内预测一定量的词。我们发现,增加范围可以提高输出的词向量的质量,但也会增加计算复杂度。由于距离较远的单词与当前单词的相关性通常小于距离较近的单词与当前单词的相关性,因此我们通过在训练示例中从这些单词中取样较少,从而减少了距离较远单词的权重。

此体系结构的训练复杂性与

其中C是单词的最大距离。因此,如果我们选择C=5,对于每个训练词,我们将随机选择<1;C>范围内的数字R,然后使用上文的R个词和当前词下文的R个词作为正确的标签。这将要求我们进行R×2单词分类,以当前单词作为输入,每R+R个单词作为输出。在下面的实验中,我们使用C=10。

相关视频

有的需要科学上网才能看
Lecture 2 | Word Vector Representations: word2vec
Understanding Word2Vec

相关的笔记

语言模型与Log-Linear Models
【Deep Learning学习笔记】Efficient Estimation of Word Representations in Vector Space_google2013
Efficient Estimation of Word Representations in Vector Space
word2vec原理(三) 基于Negative Sampling的模型
(三)通俗易懂理解——Skip-gram的负采样
word2vec 中的数学原理详解(五)基于 Negative Sampling 的模型
Word2Vec源码解析
Naive Softmax&Negative Sampling
NLP之—word2vec算法skip-gram原理详解

相关代码

pytorch

tensorflow

keras

API:

word2vec训练中文词向量
word2vec词向量训练及gensim的使用
自然语言处理库——Gensim之Word2vec
官方文档

NLP经典论文:Word2vec、CBOW、Skip-gram 笔记相关推荐

  1. NLP经典论文:Sequence to Sequence、Encoder-Decoder 、GRU 笔记

    NLP经典论文:Sequence to Sequence.Encoder-Decoder.GRU 笔记 论文 介绍 特点 模型结构 整体结构 输入 输出 整体流程 流程维度 GRU 模型结构 GRU单 ...

  2. NLP经典论文:Layer Normalization 笔记

    NLP经典论文:Layer Normalization 笔记 论文 介绍 模型结构 batch normalization 和 layer normalization 的相同点 batch norma ...

  3. NLP经典论文:Attention、Self-Attention、Multi-Head Attention、Transformer 笔记

    NLP经典论文:Attention.Self-Attention.Multi-Head Attention.Transformer 笔记 论文 介绍 特点 模型结构 整体结构 输入 输出 Attent ...

  4. 电信保温杯笔记——NLP经典论文:BERT

    电信保温杯笔记--NLP经典论文:BERT 论文 介绍 ELMo 对输入的表示 OpenAI GPT 对输入的表示 BERT 对输入的表示 模型结构 整体结构 输入 模型参数量 Input Embed ...

  5. NLP经典论文:ELMo 笔记

    NLP经典论文:ELMo 笔记 论文 介绍 模型结构 文章部分翻译 Abstract ELMo: Embeddings from Language Models 3.1 Bidirectional l ...

  6. 《自然语言处理学习之路》02 词向量模型Word2Vec,CBOW,Skip Gram

    本文主要是学习参考莫烦老师的教学,对老师课程的学习,记忆笔记. 原文链接 文章目录 书山有路勤为径,学海无涯苦作舟. 零.吃水不忘挖井人 一.计算机如何实现对于词语的理解 1.1 万物数字化 1.2 ...

  7. NLP、CV经典论文:Batch Normalization 笔记

    NLP.CV经典论文:Batch Normalization 笔记 论文 介绍 优点 缺点 模型结构 文章部分翻译 Abstract 1 Introduction 2 Towards Reducing ...

  8. 深度之眼Paper带读笔记NLP.2:word2vec.baseline.1

    文章目录 前言 论文储备知识 语言模型 基于专家语法规则的语言模型 统计语言模型 统计语言模型中的平滑操作 基于马尔科夫假设 语言模型评价指标:困惑度(Perplexity) 论文背景知识 词的表示方 ...

  9. 【自然语言处理(NLP)】基于CBOW实现Word2Vec

    [自然语言处理(NLP)]基于CBOW实现Word2Vec 活动地址:[CSDN21天学习挑战赛](https://marketing.csdn.net/p/bdabfb52c5d56532133df ...

最新文章

  1. centos7 中文乱码问题解决方法
  2. SolrJ搜索功能切换到集群
  3. 你要知道的开源地理空间软件10件事
  4. 《我的第一本c++书》读后感
  5. 【2016年第6期】21世纪天文学面临的大数据和研究范式转型
  6. 漫谈 | “黎曼猜想”和区块链加密算法到底有什么关系?
  7. 【cl】本地安装maven的jar包报错Artifact is already in the local repository
  8. 拓端tecdat|R语言Rstan概率编程规划MCMC采样的贝叶斯模型
  9. android edittext不可复制_【EditText】Android设置EditText不可编辑 | 学步园
  10. 疯狂涨知识!最全的java手机游戏免费下载基地
  11. 最新PHP云购源码+带机器人/控制/教程/去授权说明
  12. 苏宁小店助销湘西椪柑 6小时双线销量超60000斤
  13. 打砖块android代码,打砖块游戏的源代码
  14. PySpark 之 连接变换 union、intersection、subtract、cartesian
  15. c语言校车管理系统,交运智慧驾培管理系统
  16. 文旅灯光秀互动应用有什么优势
  17. 计算机打开文件的原理,电脑删除文件是怎么实现的?它的原理是什么?
  18. 计算机辅助技术英语,电子计算机辅助技术(CAD)
  19. CSS滤镜实现鼠标悬停图片变黑白(灰色)
  20. 复制一个维基百科!—— 维基技术梳理

热门文章

  1. 如果别人不相信你的CAE分析结果怎么办?
  2. TOP 300 Freeware software!
  3. word 中字号与数字(磅pt)对应关系
  4. DVWA的部署和教程
  5. 利用Python爬取国家水稻数据中心的品种数据
  6. 创业第一步做什么?——走出自己的“舒适区”
  7. 2022届浙江工业大学计算机专硕考研上岸经验贴
  8. Linux下通过ioctl修改IP信息
  9. python-操作列表
  10. Python列表(list)的操作及方法