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

Tomas Mikolov
Google Inc., Mountain View, CA
tmikolov@google.com
 Kai Chen
Google Inc., Mountain View, CA
kaichen@google.com
Greg Corrado
Google Inc., Mountain View, CA
gcorrado@google.com
 Jeffrey Dean
Google Inc., Mountain View, CA
jeff@google.com

arXiv:1301.3781v3  [cs.CL]  7 Sep 2013

<word2vec.pdf>

目录

摘要

1.Introduction

1.1论文目标

1.2以前的工作

2.模型体系结构

2.1前馈神经网络语言模型(NNLM)

2.2递归神经网络语言模型(RNNLM)

2.3神经网络的并行训练

3.新的对数线性模型

3.1连续词袋模型

3.2连续跳跃图模型

4.结果

4.1任务描述

4.2准确度最大化

4.3模型体系结构的比较

4.4模型的大规模并行训练

4.5 Microsoft研究句子完成挑战

5.学习关系示例

6.结论

7.后续工作


摘要

我们提出了两种新的模型架构,用于从非常大的数据集计算单词的连续向量表示。在单词相似性任务中测量这些表示的质量,并将结果与基于不同类型的神经网络的先前表现最佳的技术进行比较。我们观察到,在低得多的计算成本下,准确度有了很大的提高,也就是说,从16亿个单词的数据集中学习高质量的单词向量只需要不到一天的时间。此外,我们证明这些向量在我们的测试集上提供了最先进的性能,用于测量句法和语义单词的相似性。

1.Introduction

许多当前的NLP系统和技术将单词视为原子单位——单词之间没有相似性的概念,因为它们在词汇表中被表示为索引。这种选择有几个很好的理由——简单性、健壮性,以及观察到在大量数据上训练的简单模型优于在较少数据上训练过的复杂系统。一个例子是用于统计语言建模的流行的N-gram模型——如今,可以在几乎所有可用数据(万亿字[3])上训练N-gram

然而,简单的技术在许多任务中都处于极限。例如,用于自动语音识别的相关域内数据量是有限的——性能通常由高质量转录语音数据(通常只有数百万字)的大小决定。在机器翻译中,许多语言的现有语料库仅包含数十亿个单词或更少。因此,在某些情况下,简单地扩大基本技术不会带来任何重大进展,我们必须专注于更先进的技术。

随着近年来机器学习技术的进步,可以在更大的数据集上训练更复杂的模型,并且它们通常优于简单模型。可能最成功的概念是使用单词的分布式表示[10]。例如,基于神经网络的语言模型显著优于N-gram模型[1,27,17]。

1.1论文目标

本文的主要目标是介绍一些技术,这些技术可以用于从包含数十亿个单词和数百万个单词的庞大数据集中学习高质量的单词向量。据我们所知,之前提出的架构中没有一个在超过数亿个单词上成功训练过,单词向量的维数在50-100之间。

我们使用最近提出的技术来测量结果向量表示的质量,期望不仅相似的单词趋向于彼此接近,而且单词可以具有多个相似度[20]。这一点早在屈折语言的上下文中就已经观察到了——例如,名词可以有多个词尾,如果我们在原始向量空间的子空间中搜索相似的单词,就有可能找到具有相似词尾的单词[13,14]。

令人惊讶的是,人们发现单词表达的相似性超越了简单的句法规律。使用单词偏移技术,在单词向量上执行简单的代数运算,例如,向量(“King”)-向量(“Man”)+向量(“Woman”)得到的向量最接近单词Queen的向量表示[20]。

在本文中,我们试图通过开发新的模型架构来最大化这些向量运算的准确性,以保持单词之间的线性规律。我们设计了一个新的综合测试集,用于测量句法和语义规则1,并表明可以高精度地学习许多这样的规则。此外,我们讨论了训练时间和准确性如何取决于单词向量的维数和训练数据的量。

1.2以前的工作

将单词表示为连续向量有着悠久的历史[10,26,8]。[1]中提出了一种用于估计神经网络语言模型(NNLM)的非常流行的模型架构,其中使用具有线性投影层和非线性隐藏层的前馈神经网络来联合学习单词向量表示和统计语言模型。这项工作已被许多其他人效仿。

[13,14]中提出了NNLM的另一个有趣的架构,其中首先使用具有单个隐藏层的神经网络学习单词向量。然后使用字向量来训练NNLM。因此,即使不构造完整的NNLM,也可以学习单词向量。在这项工作中,我们直接扩展了这个体系结构,并将重点放在使用简单模型学习单词向量的第一步。

后来的研究表明,单词向量可以用于显著改进和简化许多NLP应用[4,5,29]。单词向量本身的估计是使用不同的模型架构进行的,并在不同的语料库上进行训练[4,29,23,19,9],并且得到的一些单词向量可用于未来的研究和比较2。然而,据我们所知,这些架构在训练方面的计算成本明显高于[13]中提出的架构,除了使用对角权重矩阵的对数双线性模型的某些版本[23]。

2.模型体系结构

许多不同类型的模型被提出用于估计单词的连续表示,包括众所周知的潜在语义分析(LSA)和潜在狄利克雷分配(LDA)。

在本文中,我们关注由神经网络学习的单词的分布式表示,因为先前表明,它们在保持单词之间的线性规律方面比LSA表现得更好[20,31];此外,在大型数据集上,LDA在计算上变得非常昂贵。

与[18]类似,为了比较不同的模型架构,我们首先将模型的计算复杂度定义为需要访问以完全训练模型的参数数量。下一步,我们将尽量提高精度,同时最小化计算复杂性。

对于以下所有模型,训练复杂度与

O = E × T × Q,

其中E是训练时期的数目,T是训练集中的单词的数目,Q是针对每个模型架构进一步定义的。常见的选择是E=3− 50T高达10亿。所有模型都使用随机梯度下降反向传播进行训练[26]。

2.1前馈神经网络语言模型(NNLM)

[1]中提出了概率前馈神经网络语言模型。它由输入层、投影层、隐藏层和输出层组成。在输入层,N个前面的单词使用V中1编码进行编码,其中V是词汇表的大小。然后使用共享投影矩阵将输入层投影到维度为N×D的投影层P。由于在任何给定时间只有N个输入是有效的,所以合成投影层是一种相对便宜的操作。

NNLM架构对于投影和隐藏层之间的计算变得复杂,因为投影层中的值很密集。对于N=10的常见选择,投影层(P)的大小可以是500到2000,而隐藏层大小H通常是500到1000个单位。此外,隐藏层用于计算词汇表中所有单词的概率分布,从而生成维度为V的输出层。因此,每个训练示例的计算复杂度为

Q = N × D + N × D × H + H × V,

其中主导项是H×V。然而,为了避免这种情况,提出了几种实用的解决方案;或者使用softmax的分层版本[25,23,18],或者通过使用训练期间未归一化的模型来完全避免归一化模型[4,9]。使用词汇表的二叉树表示,需要评估的输出单元的数量可以降到log2(V)左右。因此,大多数复杂性是由术语N×D×H引起的。

在我们的模型中,我们使用分层softmax,其中词汇表表示为霍夫曼二叉树。这遵循了先前的观察,即单词的频率对于在神经网络语言模型中获得类很有效[16]。霍夫曼树将短二进制码分配给频繁的单词,这进一步减少了需要评估的输出单元的数量:虽然平衡二进制树需要评估log2(V)个输出,但基于霍夫曼树形结构的分层softmax只需要大约log2(U黑字复杂度(V))。例如,当词汇量为一百万个单词时,这会导致评估速度提高大约两倍。虽然这对于神经网络LM来说不是关键的加速,因为计算瓶颈在N×D×H项中,但我们稍后将提出不具有隐藏层的架构,因此严重依赖于softmax归一化的效率。

2.2递归神经网络语言模型(RNNLM)

已经提出了基于递归神经网络的语言模型,以克服前馈NNLM的某些限制,例如需要指定上下文长度(模型N的阶数),并且因为理论上RNN可以比浅层神经网络有效地表示更复杂的模式[15,2]。RNN模型不具有投影层;仅输入、隐藏和输出层。这种模型的特殊之处在于递归矩阵,它使用延时连接将隐藏层连接到自身。这允许递归模型形成某种短期记忆,因为过去的信息可以由隐藏层状态表示,该隐藏层状态基于当前输入和前一时间步中隐藏层的状态进行更新。

RNN模型的每个训练示例的复杂性为

Q = H × H + H × V,

其中单词表示D具有与隐藏层H相同的维度。再次,通过使用分层softmax,可以将项H×V有效地减少为H×log2(V)。大多数复杂度来自H×H。

2.3神经网络的并行训练

为了在巨大的数据集上训练模型,我们在名为DistBelief[6]的大规模分布式框架之上实现了几个模型,包括前馈NNLM和本文提出的新模型。该框架允许我们并行运行同一模型的多个副本,每个副本通过一个保存所有参数的集中式服务器同步其梯度更新。对于这种并行训练,我们使用具有自适应学习速率过程的小批量异步梯度下降,称为Adagrad[7]。在这个框架下,通常使用100个或更多的模型副本,每个副本在数据中心的不同机器上使用许多CPU核心。

3.新的对数线性模型

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

新的架构直接遵循了我们早期工作[13,14]中提出的那些架构,其中发现神经网络语言模型可以通过两个步骤成功训练:首先,使用简单模型学习连续单词向量,然后在这些单词的分布式表示上训练N元NNLM。虽然后来有大量的工作专注于学习单词向量,但我们认为[13]中提出的方法是最简单的方法。

请注意,相关模型也在更早的时候提出[26,8]。

3.1连续词袋模型

第一种提出的架构类似于前馈NNLM,其中非线性隐藏层被去除,并且投影层被所有字共享(而不仅仅是投影矩阵);因此,所有单词都被投影到相同的位置(它们的向量被平均)。我们称这种架构为一个单词包模型,因为历史中的单词顺序不会影响投影。此外,我们还使用来自未来的词语;我们通过构建一个对数线性分类器,在输入端有四个未来单词和四个历史单词,从而在下一节介绍的任务中获得了最佳性能,其中训练标准是正确分类当前(中间)单词。

培训的复杂性

Q = N × D + D × log2(V ).

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

图1:新的模型架构。CBOW体系结构根据上下文预测当前单词,Skip gram根据当前单词预测周围单词。

3.2连续跳跃图模型

第二种架构类似于CBOW,但它不是根据上下文预测当前单词,而是试图根据同一句子中的另一个单词最大化对单词的分类。

更准确地说,我们使用每个当前单词作为具有连续投影层的对数线性分类器的输入,并预测当前单词前后一定范围内的单词。我们发现,增加范围提高了结果词向量的质量,但也增加了计算复杂性。由于距离较远的单词通常与当前单词的相关性比与当前单词相近的单词要小,因此我们在训练示例中通过从这些单词中抽取较少的样本来减少对距离较远单词的权重。

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

Q = C × (D + D × log2(V )),

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

4.结果

为了比较不同版本的单词向量的质量,以前的论文通常使用一个表格来显示示例单词及其最相似的单词,并直观地理解它们。尽管很容易表明“法国”一词与意大利或其他一些国家相似,但在对这些向量进行更复杂的相似性任务时,这就更具挑战性了,如下所示。我们遵循先前的观察,单词之间可能有许多不同类型的相似性,例如,单词大与大相似,小与小相似。另一种类型的关系可以是单词对大-最大和小-最小[20]。我们进一步将具有相同关系的两对单词表示为一个问题,正如我们可以问的:“在与最大和大相同的意义上,与小相似的单词是什么?”

令人惊讶的是,这些问题可以通过用单词的向量表示进行简单的代数运算来回答。要找到一个与“小”相似的单词,与“最大”与“大”相似,我们可以简单地计算向量X=向量(“最大”)− 矢量(“大”)+矢量(“小”)。然后,我们在向量空间中搜索以余弦距离度量的最接近X的单词,并将其用作问题的答案(我们在搜索过程中丢弃输入的问题单词)。当单词向量经过很好的训练后,就可以使用这种方法找到正确的答案(单词最小)。

最后,我们发现,当我们在大量数据上训练高维单词向量时,得到的向量可以用来回答单词之间非常微妙的语义关系,例如城市和它所属的国家,例如法国对巴黎就像德国对柏林一样。具有这种语义关系的词向量可以用于改进许多现有的NLP应用,例如机器翻译、信息检索和问答系统,并且可以实现其他尚未发明的未来应用。

4.1任务描述

为了衡量词向量的质量,我们定义了一个综合测试集,包含五种类型的语义问题和九种类型的句法问题。每个类别的两个例子如表1所示。总体而言,共有8869个语义问题和10675个句法问题。每个类别中的问题分两步创建:首先,手动创建一个相似单词对列表。然后,通过连接两个单词对形成一个大的问题列表。例如,我们列出了68个美国大城市及其所属州的列表,通过随机挑选两个单词对,形成约2.5K个问题。我们在测试集中只包含了单个标记词,因此不存在多词实体(例如纽约)。

表1:语义-句法-词语关系测试集中五种类型的语义和九种类型的句法问题的示例。

我们评估所有问题类型的总体准确性,并分别评估每个问题类型(语义、句法)的总体准确性。只有当使用上述方法计算的与向量最接近的单词与问题中的正确单词完全相同时,才假设问题得到正确答案;同义词因此被视为错误。这也意味着,达到100%的准确率很可能是不可能的,因为当前的模型没有关于单词形态的任何输入信息。

然而,我们认为单词向量在某些应用中的有用性应该与这个准确度指标正相关。进一步的进步可以通过结合关于单词结构的信息来实现,特别是对于句法问题。

4.2准确度最大化

我们使用了谷歌新闻语料库来训练单词向量。这个语料库包含大约6B个令牌。我们将词汇量限制在100万个最常用的单词。显然,我们面临着时间约束优化问题,因为可以预期,使用更多的数据和更高维的词向量将提高准确性。为了估计快速获得尽可能好的结果的模型架构的最佳选择,我们首先评估了在训练数据子集上训练的模型,词汇限制在最频繁的30k个单词。

表2显示了使用CBOW架构的结果,其中选择了不同的词向量维度和增加的训练数据量。

表2:使用有限词汇的CBOW架构中的词向量,语义句法词关系测试集子集的准确性。只使用包含最常用的30k单词的问题。

可以看出,在某一点之后,添加更多的维度或添加更多的训练数据会带来越来越小的改进。所以,我们必须同时增加向量维数和训练数据量。虽然这一观察结果看似微不足道,但必须注意的是,目前流行的是在相对大量的数据上训练单词向量,但其大小不够(例如50-100)。给定等式4,两次增加训练数据量导致的计算复杂度的增加与两次增加向量大小的增加大致相同。

对于表2和表4中报告的实验,我们使用了三个具有随机梯度下降和反向传播的训练时期。我们选择起始学习率0.025并线性降低,以便在最后一个训练周期结束时接近零。

表4:语义句法词关系测试集上公开可用的词向量与我们模型中的词向量的比较。使用完整的词汇表。

4.3模型体系结构的比较

首先,我们比较了使用相同训练数据和使用640个单词向量的相同维度导出单词向量的不同模型架构。在进一步的实验中,我们在新的语义句法单词关系测试集中使用了全套问题,即不限于30k词汇。我们还包括了[20]中介绍的测试集的结果,该测试集中于单词之间的句法相似性。

训练数据由几个LDC语料库组成,并在[18]中详细描述(320M个单词,82K个词汇)。我们使用这些数据与之前训练的递归神经网络语言模型进行了比较,该模型在单个CPU上训练大约需要8周。我们使用DistBelief并行训练[6]训练了具有相同数量640个隐藏单元的前馈NNLM,使用8个先前单词的历史(因此,NNLM比RNNLM具有更多参数,因为投影层的大小为640×8)。

在表3中,可以看出,来自RNN的词向量(如[20]中所用)在句法问题上表现良好。NNLM向量的性能明显优于RNN——这并不奇怪,因为RNNLM中的字向量直接连接到非线性隐藏层。CBOW架构在句法任务上比NNLM更好,在语义任务上也差不多。最后,Skip-gram架构在语法任务上的工作比CBOW模型稍差(但仍比NNLM好),在测试的语义部分比所有其他模型要好得多。

表3:使用在相同数据上训练的模型与640维单词向量的架构比较。准确度在我们的语义句法单词关系测试集和[20]的句法关系测试集上进行了报告.

接下来,我们评估了仅使用一个CPU训练的模型,并将结果与公开可用的单词向量进行了比较。比较见表4。CBOW模型在大约一天的时间内根据谷歌新闻数据的子集进行训练,而Skip-gram模型的训练时间大约为三天。

对于进一步报道的实验,我们只使用了一个训练时期(再次,我们线性地降低学习速率,以便在训练结束时接近零)。如表5所示,使用一个历元在两倍于两倍的数据上训练模型比在三个历元的相同数据上迭代得到类似或更好的结果,并提供了额外的小加速。

表5:在相同数据上训练三个时期的模型与训练一个时期的模式的比较。准确度报告在完整的语义句法数据集上。

4.4模型的大规模并行训练

如前所述,我们在一个名为DistBelief的分布式框架中实现了各种模型。下面我们报告了在Google News 6B数据集上训练的几个模型的结果,其中包括小批量异步梯度下降和称为Adagrad的自适应学习速率过程[7]。在培训期间,我们使用了50到100个模型副本。CPU核的数量是一个估计值,因为数据中心机器与其他生产任务共享,使用量可能会有很大波动。注意,由于分布式框架的开销,CBOW模型和Skip-gram模型的CPU使用率比它们的单机实现更接近。结果见表6。

表6:使用DistBelief分布式框架训练的模型比较。请注意,使用1000维向量训练NNLM需要太长时间才能完成。

4.5 Microsoft研究句子完成挑战

微软句子完成挑战最近被引入,作为推进语言建模和其他NLP技术的一项任务[32]。这项任务由1040个句子组成,每个句子中缺少一个单词,目标是选择与句子其余部分最连贯的单词,给出五个合理选择的列表。已经报道了这组技术的性能,包括N-gram模型、基于LSA的模型[32]、对数双线性模型[24]和递归神经网络的组合,该组合目前在该基准上保持55.4%准确率的最新性能[19]。

我们已经探索了Skip-gram架构在这项任务中的性能。首先,我们在[32]中提供的50M个单词上训练640维模型。然后,我们使用输入处的未知单词计算测试集中每个句子的得分,并预测句子中所有周围的单词。最后一句话的得分就是这些预测的总和。使用句子得分,我们选择最有可能的句子。

表7简要总结了一些以前的结果和新的结果。尽管Skip-gram模型本身在这项任务上的表现不如LSA相似性,但该模型的得分与RNNLM获得的得分是互补的,加权组合导致了58.9%的最新技术结果准确率(开发部分为59.2%,测试部分为58.7%)。

表7:微软句子完成挑战模型的比较和组合。

5.学习关系示例

表8显示了遵循各种关系的单词。我们遵循上述方法:通过减去两个单词向量来定义关系,然后将结果加到另一个单词上。例如,巴黎-法国+意大利=罗马。可以看出,准确度相当好,尽管显然还有很大的改进空间(请注意,使用我们假设精确匹配的准确度度量,表8中的结果只能得到大约60%的分数)。我们相信,在更大的数据集和更大的维度上训练的词向量将表现得更好,并将有助于开发新的创新应用程序。提高准确性的另一种方法是提供一个以上的关系示例。通过使用十个例子而不是一个例子来形成关系向量(我们将各个向量平均在一起),我们观察到,在语义句法测试中,我们的最佳模型的准确率绝对提高了约10%。

表8:单词对关系的示例,使用表4中的最佳单词向量(在783M个300维单词上训练的Skipgram模型)。

还可以应用向量运算来解决不同的任务。例如,我们已经观察到,通过计算单词列表的平均向量,并找到最远的单词向量,可以很好地从列表中选择单词。这是某些人类智力测试中常见的问题。显然,使用这些技术仍有许多发现要做。

6.结论

在这篇论文中,我们研究了在一组句法和语义语言任务上由各种模型导出的词的向量表示的质量。我们观察到,与流行的神经网络模型(前馈和递归)相比,使用非常简单的模型架构可以训练高质量的词向量。由于计算复杂度低得多,所以可以从大得多的数据集中计算出非常精确的高维字向量。

使用DistBelief分布式框架,应该可以训练CBOW和Skip-gram模型,即使是在有一万亿单词的语料库上,基本上可以训练无限大的词汇。这比之前发表的同类模型的最佳结果大了几个数量级。

一项有趣的任务是SemEval-2012任务2[11],其中单词向量最近被证明显著优于现有技术。公开可用的RNN向量与其他技术一起使用,使Spearman的秩相关性比之前的最佳结果提高了50%以上[31]。基于神经网络的词向量先前被应用于许多其他NLP任务,例如情感分析[12]和转述检测[28]。可以预期,这些应用程序可以从本文描述的模型体系结构中受益。

我们正在进行的工作表明,词向量可以成功地应用于知识库中事实的自动扩展,也可以用于验证现有事实的正确性。机器翻译实验的结果也很有希望。在未来,将我们的技术与潜在关系分析[30]和其他技术进行比较也是很有趣的。我们相信,我们的综合测试集将有助于研究界改进现有的词向量估计技术。我们还期望高质量的词向量将成为未来NLP应用的重要构建块。

7.后续工作

在本文的初始版本编写完成后,我们发布了用于计算单词向量的单机多线程C++代码,使用了连续单词包和跳转语法结构4。训练速度明显高于本文早些时候报道的速度,即对于典型的超参数选择,训练速度大约为每小时数十亿个单词。我们还发布了140多万个代表命名实体的向量,这些向量经过了1000多亿字的训练。我们的一些后续工作将发表在即将发表的NIPS 2013论文中[21]。

向量空间中单词表示的有效估计相关推荐

  1. 统计一个字符串中单词的个数

    <程序设计基础-c语言>杨莉 刘鸿翔 ISBN-978-7-03-032903-5 p113 习题4 7.统计一个字符串中单词的个数.字符串中两个空格之间的非空格字符串可看做单词. #in ...

  2. IT公司100题-10-翻转句子中单词的顺序

    2019独角兽企业重金招聘Python工程师标准>>> ‍问题描述:‍ 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变. 句子中单词以空格符隔开.为简单起见,标点符号 ...

  3. 简单的MapReduce项目,计算文件中单词出现的次数

    简单的MapReduce项目,计算文件中单词出现的次数 计算文件中单词出现的次数,试题如下图 1.创建读取单词的文件tast,内容如下: hadoop core map reduce hiv hba ...

  4. 程序员面试题精选100题(07)-翻转句子中单词的顺序[算法]

    题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.句子中单词以空格符隔开.为简单起见,标点符号和普通字母一样处理. 例如输入"I am a student.", ...

  5. php单词出现频率,PHP编程计算文件或数组中单词出现频率的方法

    本文实例讲述了PHP编程计算文件或数组中单词出现频率的方法.分享给大家供大家参考,具体如下: 如果是小文件,可以一次性读入到数组中,使用方便的数组计数函数进行词频统计(假设文件中内容都是空格隔开的单词 ...

  6. 统计一段英文中单词的个数c语言,C语言统计一篇英文短文中单词的个数实例代码...

    具体代码如下所述: #include #define N 1000 void main(){ char en[N][81]; int i,j,num=0,n,state; //num 用来统计单词的个 ...

  7. 翻转句子中单词的顺序

    题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.句子中单词以空格符隔开.为简单起见,标点符号和普通字母一样处理. 例如输入"I am a student.", ...

  8. python中统计单词出现的次数_python统计文章中单词出现次数实例

    python统计单词出现次数 做单词词频统计,用字典无疑是最合适的数据类型,单词作为字典的key, 单词出现的次数作为字典的 value,很方便地就记录好了每个单词的频率,字典很像我们的电话本,每个名 ...

  9. python输入一个英文句子、翻转句子中单词的顺序_ODOA(1) 翻转句子中单词的顺序(C语言实现)...

    动动手才发现自己现在的在C/C++方向的几个问题: 对自己的入门语言C语言变得非常陌生 编程的思维固定在找既有的方法,主要原因是python写多了,基本上所有常见的问题,都有现成的方法,让自己变得懒惰 ...

最新文章

  1. Linux 应用---make及makefile的编写
  2. sql 删除数据_从零开始学SQL:是什么、如何安装、基本语法、表格(创建、删除、更新)、数据(插入、删除、更新)...
  3. 软件架构风格整理(1 数据流风格)
  4. hive: Error in acquiring locks
  5. 企业微信如何查看,或更换手机号
  6. vue的基础知识-vue基础入门
  7. Spring @Aspect简单使用
  8. Deep Mutual Learning
  9. matlab绘制中国地图
  10. 近视200度能学计算机吗,近视200度严重吗
  11. 右下角自动弹出广告的删除
  12. 2年Java软件工程师的觉悟
  13. Helix MP3解码库脱离汇编指令束缚,运行在任何处理器上的解决方案
  14. 怎样用计算机做一个电子地图,电子地图如何制作简介-20210525123653.docx-原创力文档...
  15. 用树莓派构建一台服务器,永久运行网站
  16. java实现欢乐找茬,欢乐找茬乐翻天红包版
  17. 全民k歌视频在线解析下载,手把手教你如何批量下载
  18. 【ESP32】8.红外遥控实验(红外遥控解码库)
  19. 安装vue脚手架报错
  20. 准大二女生对“女生学计算机”的体会与片面看法与片面建议

热门文章

  1. SAP通过工单归集研发费用
  2. 扩展欧几里得算法java_扩展欧几里得算法
  3. 转:关于对SSDP协议的解析
  4. 入门OJ 1278【关系网络】
  5. 在运行gbplanner_ros遇到的一些问题解决方法
  6. HTML习题(写两个日期输入框,一个可以自由选择年月日,一个只能在限定时间内选择)
  7. httpd: Could not reliably determine the server's fully qualified domain name
  8. 病毒组学数据分析 -03 Virsorter2病毒序列识别
  9. DataGear 制作基于Vue2、Element UI前端框架的数据可视化看板
  10. 进程运行的轨迹跟踪与统计