让机器读懂文章: pLSA模型推导及实现

  • 概述
  • pLSA模型
  • pLSA的EM算法推导
  • pLSA的实现
  • 总结
  • 参考文献

概述

人类读懂文章是一个很自然的行为,当我们读完一篇《背影》的时候,我们就可以知道这篇文章在写些什么,也就是我们说获得了这篇文章的相关知识。有了这些知识,我们就可以回答一些问题,例如:

  1. 问:这篇文章写的主要内容是什么呢?
    答: 亲情、送别
  2. 问:有类似《背影》这样的文章可以推荐的吗?
    答:龙应台-《送别》

虽然上面的问答对任务对人类来说十分简单,但对于机器来说却并不容易。机器对自然语言(中文文本)的理解实际上并不是非常简单的事情,因为自然语言本身是一个高层抽象的概念,而机器只擅长处理量化的知识,例如说让机器记住向量x⃗=[1,2,3]\vec x=[1, 2, 3]x=[1,2,3]和y⃗=[4,5,6]\vec y=[4, 5, 6]y​=[4,5,6]是十分容易的事情,而且可以轻易知道x⃗\vec xx和y⃗\vec yy​的相似程度,这只需要计算其记录即可,于是我们对于向量来说就可以完成上面的问题2了。

让我们重新揣摩一下人类读懂文章的过程,实际上我们并不需要背熟每一个字词,而是阅读完成之后再总结出这篇文章主要在写什么,也就是文章的主题。为了让机器能理解文章,我们也需要把这些主题量化出来,形成类似topic→=[′亲情′:0.5,′送别′:0.5]\overrightarrow {topic}=['亲情': 0.5, '送别': 0.5]topic​=[′亲情′:0.5,′送别′:0.5]的向量,这种能量化文章主题的模型,也就叫做主题模型了。

在主题模型方面前人们已经做了很多工作,并且取得了非常不错的成效,其中影响较大的是一类模型叫做隐语义模型,而这类模型里面概率隐语义分析也就是本文所述的pLSA则是应用最成功的模型之一,同样成功的模型还有隐含狄利克雷分布,也就是大名鼎鼎的LDA主题模型,不过LDA与pLSA的思想一脉相承,只不过做了贝叶斯改造而已。

pLSA模型

事实上pLSA是在对我们写一篇文章的行为建模,我们先揣摩朱自清先生写《背影》的行为。首先我朱先生敲定了今天要写一篇《背影》,然后他开始构思了这篇文章的主题为:亲情、送别,并且朱先生认为这两部分的内容都几乎同等重要,也就是: [′亲情′:0.5,′送别′:0.5]['亲情': 0.5, '送别': 0.5][′亲情′:0.5,′送别′:0.5],朱先生开始动笔,于是当朱先生写下

我买几个橘子去,你就在此地,不要走动。

实际上是朱先生先前构思好的亲情、父子、送别这三个中心思想在影响着朱先生写下了这段话。于是在这三个中心思想的影响下,朱先生写完了《背影》里面的所有词,而我们读者所谓的理解《背影》,实际上就是从我们看到的《背影》的所有词,推断出了朱先生构思的主题: [′亲情′:0.5,′送别′:0.5]['亲情': 0.5, '送别': 0.5][′亲情′:0.5,′送别′:0.5]。而pLSA则只是用数学化的形式描述这个过程, 这样一个形式化的过程在pLSA的眼里是这样的:

  1. 从分布p(dm)p(d_m)p(dm​)上采样选择了一篇文章dmd_mdm​
  2. 对于文章dmd_mdm​每一个词,从分布p(zk∣dm)p(z_k|d_m)p(zk​∣dm​)上采样一个生成一个主题zkz_kzk​
  3. 从分布p(wn∣zk)p(w_n|z_k)p(wn​∣zk​)上采样生成了一个词wnw_nwn​

这个模型可以用plate notation更加简洁地描述:


图中的阴影部分的变量ddd和www对应着文章和文章的所有词,表示可观测的变量,zzz是观测不到的主题,我们称之为隐变量,两个框框左下角的NNN和MMM则分别表示NNN和MMM词独立重复试验。这个图所表达的文章生成过程跟上面的文字表述是一致的。

这样写文章的模型是符合直觉的,但仔细推敲总觉得过于机械生硬,这样的机械式过程能写得出朱先生《背影》那样优秀的文章吗?

如果无限多个猴子任意敲打打字机键,最终会写出大英博物馆的所有藏书 – 爱丁顿无限猴子理论

一件小概率的事件在多次试验中必然发生,这就是为什么随机敲打键盘的猴子也能作的原因,于是上面问题答案自然是肯定的,pLSA这样合乎直觉的模型当然要比一只茫无目的敲打键盘的猴子更加具备写作天赋。

我们读者需要阅读根据文章和文章的所有内容去推断文章的主题,而pLSA眼里则是根据可观测变量www和可观测变量ddd去推断隐变量zzz。我们可以通过海量的文章去解算出模型中的参数,也就是上文中的p(zk∣pm)p(z_k|p_m)p(zk​∣pm​)和p(wn∣zk)p(w_n|z_k)p(wn​∣zk​)两个分布,我们称之为文章主题分布主题词分布。 而p(zk∣dm)p(z_k|d_m)p(zk​∣dm​)这个分布实际上就是文章dmd_mdm​的主题分布,也就是我们前文所说的[′亲情′:0.5,′送别′:0.5]['亲情': 0.5, '送别': 0.5][′亲情′:0.5,′送别′:0.5]这样的文章主题,这个分布就是我们就获取到关于文章的知识,它量化说明了文章dmd_mdm​在说什么内容。至于模型参数解算的过程,这没什么不可以理解的,正如我定义了一个yyy的产生过程过y=ax+by=ax+by=ax+b, 当我拿到足够多的样本y0=0,y1=1,y2=2,....yn=ny_0=0, y_1=1, y_2=2,....y_n=ny0​=0,y1​=1,y2​=2,....yn​=n之后,实际上我可以将他们组成方程组解出合理的参数aaa、bbb和xxx来。

行文至此,我们且对pLSA的求解按下不表,先来实际感受一下pLSA的作用。这里选择格林童话中的十几篇童话作为语料训练pLSA,然后分别从5个主题分布中取出的top3词语:

topic-1 topic-2 topic-3 topic-4 topic-5
wrong birds morning soldier good
issue fox met king gave
faith horse wood castle great

可以看到pLSA是可以正确推导出来主题分布的。

pLSA的EM算法推导

pLSA是一种含隐变量的生成模型,也就是概率化地描述了样本数据(文章)的生成并且包含隐藏变量的模型,对于这种模型可用MCMC或EM算法来求解。本文讲解的是pLSA的EM算法求解,这里并不打算讲解EM的具体推导,而是直接利用EM算法的结论来对pLSA模型求解,关于EM算法的内容读者可以自己网上搜罗一下资料,或者待我抽空再写一篇关于EM算法的文章。
在开始推导之前,我们先假设词库大小为jjj, 每篇文章都由词库中的词wjw_jwj​构成。然后定义模型参数:
(1)θmk=p(zk∣dm)ψkj=p(wj∣zk)\begin{aligned} \theta_{mk}=p(z_k|d_m) \\ \psi_{kj} = p(w_j|z_k) \end{aligned} \tag{1} θmk​=p(zk​∣dm​)ψkj​=p(wj​∣zk​)​(1)
根据EM算法的求解步骤,我们先根据plate notation写出联合分布:
(2)p(w,z,d)=∏mp(dm)∏np(wmn∣zmn)p(zmn∣dm)p(\bm w, \bm z, \bm d) = \prod_m p(d_m) \prod_n p(w_{mn}|z_{mn})p(z_{mn}|d_m) \tag{2} p(w,z,d)=m∏​p(dm​)n∏​p(wmn​∣zmn​)p(zmn​∣dm​)(2)
其中dmd_mdm​表示第mmm篇文章, wmnw_{mn}wmn​表示第mmm篇文章中的第nnn个词,zmnz_{mn}zmn​表示第mmm篇文章中第nnn个词对应的主题。然后我们令给定模型参数下的主题后验证分布为:
(3)Q(z;θ,ψ)=p(z∣d,w;θ,ψ)Q(\bm z; \bm \theta, \bm \psi) = p(\bm z|\bm d, \bm w; \bm \theta, \bm \psi) \tag{3} Q(z;θ,ψ)=p(z∣d,w;θ,ψ)(3)
于是可以启动EM算法当中的求期望步骤:
(4)∑zQ(z)lnp(w,z,w)=∑mlnp(dm)∑n∑kq(zmnk)ln[p(wmn∣zk)p(zk∣dm)]\sum_{\bm z} {Q(\bm z)lnp(\bm w, \bm z, \bm w)} = \sum_mlnp(d_m) \sum_n \sum_kq(z_{mnk})ln[p(w_{mn}|z_k)p(z_k|d_m)] \tag{4} z∑​Q(z)lnp(w,z,w)=m∑​lnp(dm​)n∑​k∑​q(zmnk​)ln[p(wmn​∣zk​)p(zk​∣dm​)](4)
其中q(zmnk)q(z_{mnk})q(zmnk​)表示在给定参数下的主题验分布,这里有:
(5)q(zmnk)=p(zk∣dm,wn;θmk,ψkj)=p(dm)θmkψkn∑kp(dm)θmkψknq(z_{mnk}) = p(z_k|d_m, w_n; \theta_{mk}, \psi_{kj}) = \frac {p(d_m)\theta_{mk}\psi_{kn}}{\sum_kp(d_m)\theta_{mk}\psi_{kn}} \tag{5} q(zmnk​)=p(zk​∣dm​,wn​;θmk​,ψkj​)=∑k​p(dm​)θmk​ψkn​p(dm​)θmk​ψkn​​(5)

由于文章中总会出现许多重复词,例如文章dmd_mdm​中第1个词和第555个词是一样的,那么就会有wm1=wm5=wjw_{m1}=w_{m5}=w_jwm1​=wm5​=wj​那么对于式子(4)(4)(4)中∑n∑kq(zmnk)ln[p(wmn∣zk)p(zk∣dm)]\sum_n \sum_kq(z_{mnk})ln[p(w_{mn}|z_k)p(z_k|d_m)]∑n​∑k​q(zmnk​)ln[p(wmn​∣zk​)p(zk​∣dm​)]这部分,我们可以将文章dmd_mdm​中重复出现的词对应的项合并成为∑jnmj∑kq(zmjk)ln[p(wj∣zk)p(zk∣dm)]\sum_j n_{mj}\sum_kq(z_{mjk})ln[p(w_j|z_k)p(z_k|d_m)]∑j​nmj​∑k​q(zmjk​)ln[p(wj​∣zk​)p(zk​∣dm​)], 其中nmjn_{mj}nmj​为文章dmd_mdm​中词wjw_jwj​出现的次数。于是我们重写式子(4)(4)(4)为:
(6)∑zQ(z)lnp(w,z,w)=∑mlnp(dm)∑jnmj∑kq(zmjk)ln(θmkψkj)\sum_{\bm z} {Q(\bm z)lnp(\bm w, \bm z, \bm w)} = \sum_mlnp(d_m) \sum_j n_{mj}\sum_kq(z_{mjk})ln(\theta_{mk}\psi_{kj}) \tag{6} z∑​Q(z)lnp(w,z,w)=m∑​lnp(dm​)j∑​nmj​k∑​q(zmjk​)ln(θmk​ψkj​)(6)
我们的目标是最大化式子(6)(6)(6), 并且因为参数θ\bm \thetaθ和ψ\bm \psiψ是概率分布,所以有要约束∑kθkm=1\sum_k\theta_{km}=1∑k​θkm​=1和∑jψkj=1\sum_j{\psi_{kj}} = 1∑j​ψkj​=1, 并且由于p(dm)p(d_m)p(dm​)这个先验证分布可以设置为常数,这样我们去除与优化无关的常数项和增加了约束之后,就可以得到整个带约束的优化目标:

(7)max⁡θmk,ψkj∑m∑jnmj∑kq(zmjk)ln(θmkψkj)s.t.∑kθmk=1,m=1,2,3,...,M∑jψkj=1,k=1,2,3,...,K\begin{aligned} \max \limits_{\theta_{mk}, \psi_{kj}} \quad & \sum_m \sum_j n_{mj}\sum_kq(z_{mjk})ln(\theta_{mk}\psi_{kj}) \\ \bm{s.t.} \quad & \sum_{k}\theta_{mk}=1, m=1,2,3,...,M \\ & \sum_{j} \psi_{kj} = 1, k=1,2,3,...,K \end{aligned} \tag{7} θmk​,ψkj​max​s.t.​m∑​j∑​nmj​k∑​q(zmjk​)ln(θmk​ψkj​)k∑​θmk​=1,m=1,2,3,...,Mj∑​ψkj​=1,k=1,2,3,...,K​(7)

这个带约束的优化目标直接使用拉格朗日乘子法:
(8)L(θ,ψ,λ,α)=∑m∑jnmj∑kq(zmjk)ln(θmkψkj)+∑mλm(1−∑kθmk)+∑kαk(1−∑jψkj)L(\bm \theta, \bm \psi, \bm \lambda, \bm \alpha) = \sum_m \sum_j n_{mj} \sum_k q(z_{mjk})ln(\theta_{mk}\psi_{kj}) + \sum_m {\lambda_m} (1-\sum_k\theta_{mk}) + \sum_k \alpha_{k} (1-\sum_j {\psi_{kj}}) \tag{8} L(θ,ψ,λ,α)=m∑​j∑​nmj​k∑​q(zmjk​)ln(θmk​ψkj​)+m∑​λm​(1−k∑​θmk​)+k∑​αk​(1−j∑​ψkj​)(8)
于是可以对参数θmk\theta_{mk}θmk​求导并令其为0:
(9)∂L(θ,ψ,λ,α)∂θmk=∑jnmjq(zmjk)θmk−λm=0λmθmk=∑jnmjq(zmjk)\frac{ \partial L(\bm \theta, \bm \psi, \bm \lambda, \bm \alpha)}{\partial \theta_{mk}} = \frac{ \sum_jn_{mj}q(z_{mjk})}{\theta_{mk}} - \lambda_m = 0 \\ \lambda_m \theta_{mk} ={ \sum_jn_{mj}q(z_{mjk})} \tag{9} ∂θmk​∂L(θ,ψ,λ,α)​=θmk​∑j​nmj​q(zmjk​)​−λm​=0λm​θmk​=j∑​nmj​q(zmjk​)(9)
式子(9)左右两边对kkk求和得到:
(10)λm∑kθmk=∑jnmj∑zq(zmjk)λm=∑jnmj=Nm\lambda_m \sum_k \theta_{mk} = \sum_j{n_{mj}} \sum_{z}q(z_{mjk}) \\ \lambda_m = \sum_j {n_{mj}} = N_m \tag{10} λm​k∑​θmk​=j∑​nmj​z∑​q(zmjk​)λm​=j∑​nmj​=Nm​(10)
上述式子(10)中NmN_mNm​表示文章dmd_mdm​的总词数,将式子(10)(10)(10)代回式(9)可以得到:
(11)θmk=∑jnmjq(zmjk)Nm\theta_{mk} = \frac {\sum_j n_{mj}q(z_{mjk})}{N_m} \tag{11} θmk​=Nm​∑j​nmj​q(zmjk​)​(11)
同样地我们对参数ψkj\psi_{kj}ψkj​故技重施:
(12)∂L(θ,ψ,λ,α)∂ψkj=∑mnmjq(zmjk)ψkj−αk=0αkψkj=∑mnmjq(zmjk)\frac {\partial L(\bm \theta, \bm \psi,\bm \lambda, \bm \alpha)}{\partial \psi_{kj}} = \frac{\sum_m n_{mj}q(z_{mjk})}{\psi_{kj}} - \alpha_k = 0 \\ \alpha_k \psi_{kj} = \sum_m n_{mj}q(z_{mjk}) \tag{12} ∂ψkj​∂L(θ,ψ,λ,α)​=ψkj​∑m​nmj​q(zmjk​)​−αk​=0αk​ψkj​=m∑​nmj​q(zmjk​)(12)
式子(12)左右两边对jjj求和得到:
(13)αk∑jψkj=∑m∑jnmjq(zmjk)αk=∑m∑jnmjq(zmjk)\alpha_k \sum_{j} \psi_{kj} = \sum_m \sum_j n_{mj} q(z_{mjk}) \\ \alpha_k = \sum_m \sum_j n_{mj} q(z_{mjk}) \tag{13} αk​j∑​ψkj​=m∑​j∑​nmj​q(zmjk​)αk​=m∑​j∑​nmj​q(zmjk​)(13)
将式子代回(12)(12)(12)得到:
(14)ψkj=∑mnmjq(zmjk)∑m∑jnmjq(zmjk)\psi_{kj} = \frac { \sum_m n_{mj}q(z_{mjk})}{ \sum_m \sum_j n_{mj} q(z_{mjk})} \tag{14} ψkj​=∑m​∑j​nmj​q(zmjk​)∑m​nmj​q(zmjk​)​(14)
至此,pLSA参数求解完毕。根据参数更新的规则,我们设在EM算法迭代运行的过程中,第iii轮的参数为θmki\theta_{mk}^iθmki​和ψkji\psi_{kj}^iψkji​。于是整个pLSA的EM算法可以归纳为:

  1. 随机初始化参数θmk0\theta_{mk}^0θmk0​和ψkj0\psi_{kj}^0ψkj0​
  2. 开始第i∈[1,2,3...n]i\in[1, 2, 3...n]i∈[1,2,3...n]轮迭代:
    a. 求q(zmjk)=p(dm)θmki−1ψkji−1∑kp(dm)θmki−1ψkji−1q(z_{mjk})=\frac {p(d_m)\theta_{mk}^{i-1}\psi_{kj}^{i-1}}{\sum_kp(d_m)\theta_{mk}^{i-1}\psi_{kj}^{i-1}}q(zmjk​)=∑k​p(dm​)θmki−1​ψkji−1​p(dm​)θmki−1​ψkji−1​​
    b. 更新参数
    θmki=∑jnmjq(zmjk)Nmψkji=∑mnmjq(zmjk)∑m∑jnmjq(zmjk)\theta_{mk}^i = \frac {\sum_j n_{mj}q(z_{mjk})}{N_m} \\ \psi_{kj}^i = \frac { \sum_m n_{mj}q(z_{mjk})}{ \sum_m \sum_j n_{mj} q(z_{mjk})} θmki​=Nm​∑j​nmj​q(zmjk​)​ψkji​=∑m​∑j​nmj​q(zmjk​)∑m​nmj​q(zmjk​)​
    c. 若参数收敛,则退出迭代,否则返回a继续迭代
  3. 输出模型参数θ\bm \thetaθ和ψ\bm \psiψ

pLSA的实现

从上边的式子来看pLSA是相对比较容易实现的,但是高效地实现还需要一些技巧。首先看式(14)的分母,存在一个二阶求和的过程,如果语料库中有1000篇文档,10000个词,那么就要进行一千万次运算,这样显然必须要用并行批量计算的方式来加速,在实现上我们会将涉及的所有运算都转换为矩阵运算,这样就可以通过成熟的GPU库来加速运算。其次再看内存消耗问题,q(zmjk)q(z_{mjk})q(zmjk​)总共需要储存m*j*k个参数,如果有1000篇文档10000个词和50个主题,那么q(zmjk)q(z_{mjk})q(zmjk​)将有5亿个元素,这在内存消耗上是不可接受的,在实现上我们只会在批量计算θmk\theta_{mk}θmk​和ψkj\psi_{kj}ψkj​参数时用到的部分q(zmjk)q(z_{mjk})q(zmjk​)批量计算出来,并且一旦使用完毕立即丢弃。具体代码就不在这里贴了,完整的demo见pLSA实现

总结

pLSA是概率隐语义主题模型中相对简单的一种,推导和实现都相对简单,回头看上面的算法过程,实际上只需要简单地计数迭代而已,所以pLSA非常适合在线学习。其实并非pLSA有此特点,事实上大多数生成模型都一样适合在线学习。不过pLSA的缺点也是非常明显的,pLSA将文章建模时没有考虑文章词序,也就是我们随机将一篇文章词打散,对于pLSA来说,其联合概率p(w,z,d)p(\bm w, \bm z, \bm d)p(w,z,d)是不变的,这一点回头看式子(2)(2)(2)就知道。这意味着"谁是你爸爸"和"你爸爸是谁"这两句话在pLSA眼里看来是一样的,这种情况在短文本场景中尤其常见。但幸运的是,在长文本领域,有研表究明,汉字的序顺并不能影阅响读。不过pLSA近年来正在逐渐被更新颖复杂的LDA代替,但相对LDA来说pLSA结构简单,容易做大规模并行化,所以时至今日,pLSA在大规模文本挖掘领域依旧光耀夺目。

最后,向Thomas Hofmann先生致敬,感谢先生为我们带来如此精妙的pLSA主题模型。

参考文献

[1] Probabilistic Latent Semantic Analysis
[2] Tutorial on Probablistic Latent Semantic Analysis

让机器读懂文章: pLSA模型推导及实现相关推荐

  1. 公开课 | 让机器读懂你的意图——人体姿态估计入门

    机器视觉的主要任务是让机器看懂世界,而世界的主要组成是人类社会.我们一直在围绕物和人的识别展开研究:物品检测识别.行人检测与跟踪.人脸识别. 事实上,行人检测是人的整体粗粒度识别,人脸识别是人的局部特 ...

  2. java多线程 模型_一篇文章读懂Java多线程模型

    要真正了解Java的多线程,我们还要从进程和线程的概念说起 进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期 ...

  3. 一文读懂Java内存模型(JMM)及volatile关键字

    点赞再看,养成习惯,公众号搜一搜[一角钱技术]关注更多原创技术文章. 本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章. 前言 并发编程从操作系统底层工作的整 ...

  4. 一文读懂深度学习模型近年来重要进展(附梳理图)

    作者:丁铭,唐杰 来源:微博"唐杰THU" 本文共2200字,建议阅读5分钟. 本文为大家梳理深度学习模型近年来的重要进展,文末附梳理图~ 唐杰老师学生帮忙整理的Deep Lear ...

  5. 一文读懂JMM内存模型

    Java内存模型即Java Memory Model,简称JMM.JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式.JVM是整个计算机虚拟模型,所以JMM是隶属于JVM的. 如 ...

  6. 一文读懂目标检测模型(附论文资源)

    来源: 大数据文摘 本文共1443字,建议阅读5分钟. 本文为你详细介绍目标检测,并分享资源大礼包,为你的目标检测入门打下基础. 这是一份详细介绍了目标检测的相关经典论文.学习笔记.和代码示例的清单, ...

  7. lightgbm 保存模型 过大_一个例子读懂LightGBM的模型文件

    机器学习模型的可解释性是个让人头痛的问题.在使用LightGBM模型的肯定对生成的GBDT的结构是好奇的,我也好奇,所以就解析一个LightGBM的模型文件看看,通过这个解析,你可以看懂GBDT的结构 ...

  8. 机器“读懂”放射学报告

    在Qure,我们建立了深度学习模型来检测放射影像中的异常.这些模型需要大量的标记数据来学习诊断异常.因此,我们从医院和门诊放射中心收集了一个大型数据集.这些数据集包含相关的临床放射学报告. 目前,当我 ...

  9. 让机器读懂人类:探索问答系统和机器阅读理解

    学习内容来自 : CSDN在线直播教程 林德康 一.问答系统概念 问答系统在搜索引擎中的应用 略- 基于知识图谱的问答系统 high precision great for head queries ...

最新文章

  1. ckeditor4.4.6添加代码高亮
  2. 如何配置一台适用于深度学习的工作站?
  3. 关于外部存储器件对存储数据的管理。
  4. GitHub与PyCharm配置最新简单教程
  5. Linux_文件系统磁盘分区
  6. 基于visual Studio2013解决面试题之0601二叉树深度
  7. Android应用程序请求SurfaceFlinger服务渲染Surface的过程分析
  8. 1079. 延迟的回文数 (20)
  9. SAP UI5 调试模式标志位的持久化原理 - local storage
  10. 【高校宿舍管理系统】第十章 缺勤管理、报修管理、来访人员管理以及公告管理
  11. 概率编程语言(Probabilistic Programming Languages)库 —— edward
  12. 使用原生js实现邮箱模糊查询的效果
  13. opencv_判断两张图片是否相同
  14. grub启动主题美化
  15. 学会编单片机必须会c语言吗,十天学会单片机和C语言编程.docx
  16. C# 实现二维码的生成、解析及保存
  17. 《信号与系统学习笔记》—连续时间博里叶变换(一)
  18. 虚拟机安装时黑屏的解决办法
  19. 即将到来的量子计算时代,其商业应用价值在哪里?
  20. 面试通过,背调凉了,HR:肯定不录用...

热门文章

  1. (mac)IDEA配置git
  2. html 赛龙舟游戏,亲子游戏《赛龙舟》旱地龙舟
  3. C# 学习笔记9 接口,反射,单元测试
  4. 2021烟台市地区高考成绩排名查询,烟台最好的5所高中,2020高考成绩优秀,其中3所有11人挺进省前50...
  5. BootStrap设置footer元素在底部
  6. 半导体_001_基本概念
  7. 《英雄联盟》与路易威登联名的皮肤
  8. 医咖会SPSS免费教程学习笔记—卡方检验
  9. 人大版统计学教材第六版学习笔记--第3章 数据的图表展示
  10. 在支付宝答了1000多个保险问题后,我最想告诉你这3点 | 简保君