今天我们将围绕主题,分享以下三个方面:首先对命名实体识别(NER)这个任务做一个问题定义,再基于一篇Survey论文去介绍解决NER问题的统一框架。然后会详细介绍前沿的一些研究工作,重点基于ACL18和arXiv19这两篇论文来探讨中文命名实体识别中关于引入词汇信息的工作。最后简单介绍一下实体识别技术在我们阿里小蜜的应用场景。

01 问题定义及基本框架

命名实体识别是信息抽取的一个子任务,能够从非结构化文本中识别出特殊含义的词汇或专有名词。这个特殊含义其实是“用户自定义”的语义类别,比如说是一些人名、地名、机构名,按照实体的语义类别一般可以划分为开放域的实体识别和垂直域的实体识别。以上图为例,输入的句子是“咽部无浮肿,扁桃体无肿大”,NER模型需要能够识别出紫色框里的实体,这个过程相当于对每一个token做多分类,再对多分类的结果做一个后处理。

NER的历史研究过程大致可以分为三个时间段,早期是基于规则和词典的方法。在深度学习之前,以条件随机场为代表的统计机器学习方法是非常流行的,而且已经达到了不错的效果。近年来,随着深度学习的兴起,基于神经网络模型来自动学习特征,以端到端的形式进行训练,取得了更好的效果。

接下来基于这篇Survey文章来讲一讲实现NER模型有哪些方法?如果是NER初入门的同学,我非常推荐一定要先把这篇Survey文章认真看一下。

命名实体识别是一个NLP底层任务,和分词,POS tagging,chunking等,都是可以建模成序列标注任务。它们的解决框架都比较类似,模型需要对输入句子中的每一个token输出一个对应的类别。

那么神经网络该怎么设计呢?大概分为三层,第一层是输入表示层,输入层所要做的工作,就是把输入的 word或char(或者是构造的一些额外特征,比如说POS tagging或者是词典的一些特征)进行向量化表示。第二层是上下文编码层,实现对上下文的建模,第三层是输出层,完成输出解码分类。

在输入表示层,如果输入的基本单元是词语,可以使用静态的embedding。比如13年的word2vec工作,也可以使用近年来的工作,比如上下文有关的动态embedding方法,效果会更好一点,像ELMo和BERT。特别针对英文语言,为了缓解OOV问题,更多时候还会去建模character级别的特征,可以使用CNN或者是RNN去建模表示。比如使用CNN网络,通过卷积操作和Pooling操作,就可以拿到单词的character level的向量表示。

上下文编码层实现对输入token的上下文建模,这是研究最多的,现有很多网络可供选择。比如上图罗列的CNN、RNN、Transformer、Attention、GCN,都有工作尝试应用在实体识别上。

输出解码层实现对每个token进行分类,最简单的可以用MLP+Softamx进行分类,然后中间用你想用的神经网络模型。不过,解码层最常用的还是CRF。为什么呢?以LSTM-CRF为例,神经网络模型实现NER仍然借鉴传统的CRF思想,像传统CRF一样去建模点特征(通过LSTM模型自动学习点特征)和边特征(通常显示建模标签的一阶转移概率)。建模边特征在实体识别中是很重要的。

举个例子,比如我们需要显示建模标签之间的依赖关系,如中间图里的人名,有三个词组成,预测了第1个token(Michael)是B-PER表示Person Begin,第2个预测的标签其实和第1个标签是非常相关的,第2个标签不太可能是以B开头的label,更大的概率可能是以I或者E开头,所以需要去建模这种依赖关系。就是说,当预测出来一个标签之后,下一个标签和这个标签有一定的相关性的时候,要建模标签转移概率。
所以,这里CRF的作用,就是在神经网络分类loss基础上,加上标签之间的一阶转移概率。当然也有人会用RNN的方式,但比较少见。RNN这种方式和machine translation里decoder过程是非常像的,就是预测出这个标签之后,会把它输入到下一个预测位置的信息里面去,这样也是可以学习到标签之间的依赖关系的。

上面介绍了解决NER问题的基本框架,包含三层,分别是输入表示层、上下文编码层、输出解码层,设计每层时都有很多选择。

在中文命名实体识别中比较典型的方法是CNN-CRF,LSTM-CRF和BERT。首先,基本输入单元是基于字,因此输入表示层是Char的表示。上下文编码层,可以选择 CNN,特别是线上对速度要求比较高的时候,CNN就是首选。LSTM是论文里的首选baseline,也是一个很强的baseline。随着预训练技术的兴起,BERT在绝大多数情况下比上面两个模型的效果要好很多,但是BERT缺点就是速度慢。

02 基于词汇增强的前沿工作

上一部分,介绍了NER的问题定义以及解决NER问题的基本框架。下面重点去介绍中文NER里引入词汇信息该如何实现,主要基于两篇论文,分别是Lattice LSTM和Soft-Lexicon。

在介绍引入词汇信息之前,先简单罗列一下现在NER的学术前沿工作聚焦在哪几个方面。

第一,减少标注成本,我们希望尽量不牺牲模型效果的同时,降低标注数据量。像主动学习、远程监督,这些工作在命名实体识别里面都有涉及。

第二个,预训练技术也是近两年很火的一个方向。BERT之后,如雨后春笋般出现了BERT-wwm、百度ERNIE、清华ERNIE等。这些工作中都有提到,它们的改进对NER任务也有一定的提升。
第三个,基于知识进行增强,也是我们关注的方向。我们把知识广义分为:词汇、词典、三元组。顺便提一下,这里需要区分词汇和词典。词汇,在文献中比较常见的表达是Lexicon,它是一个词汇集合,是没有语义类别的。词典,是Dictionary,它是有语义类别的。什么意思呢?比如说你有一个医疗领域的词典,它除了包含词汇,还要介绍这个词汇是属于症状,还是属于疾病,或者其他,需要有一个较明确的语义类别,因此词汇和词典是有所区分的。Lexicon相对而言是最容易获得的一种外部知识。

那么我们为什么要去引入词汇信息呢?这边我先给大家看两个例子。比如一个句子,我们先分词,把句子分成一个个词语,如图(b),再送到模型中,但是分词往往会造成错误,这样的错误一旦造成,它有误差传播,是不可逆的。像上面的这个南京市长江大桥,它有可能会分错,分成了“南京|市长|江大桥”,那么继续做实体识别的话,就没办法再识别出长江大桥这个location实体了。

所以,现在最常见的做法是基于字作为输入,然后再基于字来预测,但是这样也有个问题,因为人们平时说话的时候,最小使用的语义单元是词语。比如南京长江大桥这种,现在把一个字一个字输到模型中,就丢失了字之间关联信息。所以,我们希望把这些词汇信息再引回来,当我们单看到“南京市长”这4个字的时候,大脑会做一个语义组合,“南”和“京”这两个字会组合在一起,来表征“南京”这个词语。我们也希望把这个词汇信息输入送到模型中,以提供更多信息。

这个词汇信息有什么好处呢?第一点,词汇信息,它提供了先验知识,告诉模型实体的边界信息。第二点,也是非常实际的,在很多垂直领域里面,我们有很多专有词汇表,它是一个很强的约束信息集合,有时候甚至希望这些约束信息可以直接干预模型的输出,这样就可以通过词汇表的方式提高模型效果。

所以,引入词汇信息,对于中文命名实体识别是非常重要的事情。那么想要引入词汇信息有什么思路呢?我把它总结为两点。

第一点是改造模型。改造模型就是原有模型是只能接受字的输入,或是只能接受词语的输入,我们现在希望这个模型既能接受字的输入,也能接受词的输入。希望这个模型能够对字的信息和词的信息进行有效的融合。

第二点是构造特征。比如说,如图这样的一个模型,x是原先的字向量,我们希望给每个字去构造一个额外的特征e,这个额外特征是通过词汇表得到的。然后输入到表示层后进行信息拼接,再输入到后续的模型中去。这样的方式还有一个好处就是我们不需要关心上下文编码层具体使用什么模型,只需要在输入表示层完成构造,这种通用性很强。

接下来概览一下在18年到19年,基于词汇增强这个方向来做中文命名实体识别的效果对比。

在中文NER任务里,这4个公开的数据集OneNote, MSRA, Weibo, Resume最为常见。今天介绍第一篇文章Lattice-LSTM是比较早的工作去引入词汇信息,该方法比LSTM-CRF模型有明显的提高。Lattice LSTM直接或间接地启发了LR-CNN、CGN等一批工作。第二篇论文是Soft-Lexicon,它也是基于Lattice-LSTM的思想,但是进行了简化同时又取得了更好的效果。

将上述论文方法的研究过程简单归纳,如图所示,最左边LSTM是最简单的Base模型,中间上面第一个是Lattice-LSTM。然后,最右边是19年的三篇文章,分别依赖前面的一些工作展开的。下面,我们重点讲的第一篇Lattice-LSTM,它是一种基于改造模型的方式来引入词汇信息的。要讲的第二篇是Soft-Lexicon,它是从构造特征的角度来引入的。

改造模型的Lattice LSTM

接下来我们来讲第一篇,这篇是现西湖大学的张岳老师和他的博士生18年的一篇工作。

研究动机是希望这个模型能够同时接受字输入和词输入,利用这两者的信息去做实体识别。图中有个例子,比如“南京市长江大桥”,我用Jieba分词,它是分词正确的。但是我又选了一个句子“广州市长隆公园”它就分错了,分成了“广州”、“市长”、“隆”、“公园”,那么长隆公园这样一个location,如果是基于分词之后再做识别,就没有办法再正确识别了。

下面讲下Lattice-LSTM工作原理。在讲具体原理和公式之前,先带大家整体看一下模型的设计。假设没有词语输入情况下,那就是原先句子“南京市长江大桥”,一个字一个字的输入,模型可以用一个LSTM。现在要输入词汇信息了,就会有这几个问题需要解决:

第一,这些词汇信息是从哪里来呢?或者说我们的词汇表从哪里来?论文中的方法是用一种低成本的方式获得,使用一个分词工具对大量无监督语料进行分词,然后整理成一个词汇表。现在有一个词汇表了。

第二,在给定这个句子和我们已有的词汇表前提下,我们需要把词汇表里面哪些词语引入到这个句子当中呢?论文中所采用的方式也是一种简易可行的方式,就是string match。具体来说,这句话里面的所有的子串,如果在字典中出现的话,我们就把这个词语引进来。

第三,匹配到的这些词语怎么输到模型中去?输到模型的什么位置?以“南京市”为例,将词语信息输入到这个词的最后一个字的位置上(“市”字),与此同时,会有一个信息从这个词语的第一个字的位置过来(“南”字)。其他的词语也是一样的,比如说“长江大桥”,他会把信息输入到结尾“桥”,从开头“长”这个字的信息过来。下面,将重点解释最重要的问题:在这样一个给定字和词的输入情况下,模型的信息单元是如何更新的。

首先,回顾一下深度学习中使用广泛的LSTM模型。LSTM模型最重要的概念是信息单元的更新方式,它是通过门机制来实现的。如图红框中的公式,这个信息单元,基于遗忘门和输入门实现更新。遗忘门是遗忘掉上一单元多少信息后,留下的一些信息,然后和现在这个时刻输入的信息进行求和,得到了现在记忆单元的信息。随后记忆单元,再通过一个输出门得到h隐状态,然后再去做分类预测。
不过,这种方式理解不够直观,我们还可以用另外一种方式来理解,门控机制是可以近似看作成一种注意力机制,相信大家对注意力机制肯定非常熟悉。我们以第3个字“市”这个字为例,在这个时候我们输入是,即“市”这个char embedding。
注意力机制的计算主要有三个步骤:

第一步,要知道输入的信息有几路?图中输入的有和。

第二步,输入信息的value计算出来之后,它对应的权重也要计算出来。

第三步,计算的时候,相当于做一个加权求和。具体来说,第一步就是要去考虑清楚有几个输入的value,第1个是要输入,还有就是要输入。对应的value就是原始的,即上一时刻的记忆单元信息,另一个输入是(char embedding),需要通过非线性变换得到候选状态value,即这样一个value值。得到value信息和后,需要去计算和所对应的权重和。

LSTM中,权重的计算是门控机制思想,对于权重对应这个value的值,是通过一个输入门得到权重。对于这上一时刻的记忆单元的信息,它是通过遗忘门来计算得到权重,最后我们拿到了两个value,以及要输入的两个value对应的权重,最后权重和value进行相乘,最后得到了更新的记忆单元。简单小结一下,这里的门控机制看作注意力机制之后,本质上更新操作就是三个步骤,计算value,然后计算value对应的权重,最后再作做一个加权的求和。

Lattice LSTM要解决的问题是原先只有字输入的基础上又有了词语输入。原先只输入“市”这个char embedding,现在还要输入对应的word embedding。现在还是以“市”为例,以上图来讲解一下,图中的value值和权重在上一页PPT中已经计算过了。现在只需要计算得到及对应的权重(1,3是指词语“南京市”从位置到位置,w表示word)。首先介绍一下的计算公式如上图左下角所示,是完全借鉴LSTM的门控机制,引入word级别的记忆单元概念,这个公式和上一页PPT基本一样,所以,在这边输入word embedding时候,我们也能够像原来输入char embedding一样,计算出该word embedding所对应的 word级别的记忆单元,这个value值就计算得到了。

下面,讲解如何计算value对应的权重。这个权重和的计算过程也是非常类似的,计算的时候会基于输入门计算,那么也会去计算一个输入门,计算完输入门之后进行normalize。这里,以“市”结尾,只有一个词语“南京市”输入,不过一般某个字可能会有多个词语的输入,就会有多个输入门,所以会有normalize操作(保证权重和为1)。最终,该字对应的要输入的所有词语信息的value和对应的权重向量点乘,然后再加上字这一路输入的结果,得到最终更新的记忆单元。

最后我们来看一下实验效果,在18年的时候,这个模型在四个数据集上都取得了SOTA结果,提升效果显著。

构造特征的Soft-Lexicon

第二篇是复旦大学黄萱菁老师和她博士生的工作。

这篇工作的出发点是什么呢?大家看到Lattice LSTM模型,虽然效果是很好的,但是计算复杂度高,没有办法并行。且通用性稍差,它是专门针对LSTM模型进行改造的。改造之后,比如说,我现在线上想用CNN模型,就没有办法引入词汇信息了,所以Soft-Lexicon的工作就是希望能够去解决这两个问题。他是借鉴了Lattice LSTM的思想,只不过不再是改造模型的上下文编码层,而是从输入表示层角度出发去构造词汇特征,然后再和本身的字特征拼接输入到模型当中。这种方式因为是模型无关的,因此在LSTM,CNN,Transformer上使用都有效果。

在改造之前,先重新审视一下Lattice LSTM的工作原理。为什么引入这些词汇之后,能提高效果呢?本质上来说,这种引入词汇的方式,主要是提供两个非常重要的信息。

第1个是引入实体的先验边界信息,以“南京市”举例来说,输入到“市”这个结点的时候,其实会从“南”这个字的结点过来,也就是对于“市”而言,有显示告诉它,“南”这个字可能和它非常的紧密相连。“长江大桥”也一样,对于“桥”而言,会显示引入远处的边界信息。

第2点是引入了实体的语义信息,这个语义信息是怎么引入的呢?原来的输入是只有char embedding,现在还会输入 word embedding,word embedding包含了丰富的句法和语义信息的。因此,引入实体的边界信息和语义信息,对于提升NER是非常有效的。

现在,既想引入边界信息,又想引入语义信息,而且要求不改造上下文编码层的情况下,还可以怎么做呢?可以通过构造特征的方式,输入表示层为每个char构造一个额外的特征,然后进行拼接输入到模型当中去,具体如何实现呢?Softword方法就是利用一个分词工具,分完词后,可以得到边界信息。比如分词工具告诉我们“南京市”是应该在一起的,“长、江、大、桥”这4个字要在一起。第1类特征就是原先的char embedding,第2类特征就是分词的信息,比如说“南”这个字,在分词Begin位于开头,“京”在于Middle中间,“市”在于end末尾。那每一个字都可以通过分词工具拿到一个边界信息。最后就把这个边界信息和这个char embedding进行拼接。这种方法其实非常简单,也是非常有效的,但是这个方法还是存在两个问题,第1个问题就是它虽然引用了边界信息,但是分词可能会错。比如刚刚那个例子,广州市长隆公园的例子,边界信息出现噪音。第2个问题是没有引入词向量,丢失了词语的语义的信息。

我们可以更“激进”一点,刚才Softword方法可以理解为利用一种分词可能,ExtensionSoftword是利用多种分词可能。以“南京市”举例来说,相匹配的既有“南京”、“南京市”,还有“市长”共三个词。我们把每个词语都连接到相应的字上面,以“市”为例,“市”关联两个词语,第1个词语是“南京市”,“市”是在“南京市”的结尾,所以它的E(End)的是1。第2个词语是 “市长”,“市”这个词的开头,所以B(Begin)是1,那么“市”的边界特征就是10100,可以和char embedding进行拼接,输入到模型中。但这种方法依然还是存在两个问题,一个是噪音信息,另一个是没有引入语义信息,即词向量。

接下来介绍Soft-Lexicon工作,这一篇论文提出一种非常巧妙的方式去构造了边界特征,同时又引入词向量。依然以“市”这个字为例,它有“南京市”和“市长”两个词语和它相关联。首先,作者通过边界信息把这些词语进行分类,就是与“市”相连的所有词语划分为4类B(Begin), M(Middle), E(End),S(Single)。具体来说,以“市”为开头的词语,有“市长”,所以B={“市长”};以“市”为中间的词语没有,所以M={“None”};以“市”为结尾的词语有“南京市”,所以E={“南京市”};不存在单字,所以S={“None”}。现在通过这个方式,我们既拿到了边界信息,也拿到了边界信息对应的词语。

现在重点理解额外特征向量的计算方式,对于句子中的每个字都会有4类的词汇集合,对这4类词汇集合分别计算得到一个向量表示,再将四个向量进行拼接就拿到词汇的向量表示。那么如何计算每类词汇集合的向量表示呢?如以B开头的词汇集合为例,归一化的词频与词向量相乘得到向量表示。这个集合中有“市长”,计算方式就是首先拿到“市长”对应的词向量,以及“市长”对应的语料库词频。然后,再进行归一化,归一化的分子是该词语词频,分母是4类词汇集合中所有词语的词频求和。词向量就是词语的本身的词向量。词频是通过一个大量的无监督语料去统计出这些词语的词频。

仔细对比Soft-Lexicon和Lattice LSTM方法会发现,两个方法都是计算词语的value和权重。Lattice LSTM通过非线性函数得到的候选状态value,权重是通过门控机制实现的,本质上是通过注意力机制动态地去计算出词汇的value和权重。然而,Soft-Lexicon使用一种更直接的方式,value就是这个词语的词向量,权重就是静态的一个统计的信息,这样设计方式还有一个额外的优势,即词语的静态统计信息可以人为设定,一定程度上可以实现模型可控。

最后看一下Soft-Lexicon效果,比LSTM在4个公开数据集上都取得了更优的效果,而且它是模型无关的,更具有通用性。这里引发一个问题,相同的思路,简化的方法为什么效果会更好呢?一种原因可能是Lattice LSTM参数量较大,训练数据量不足的情况下不一定能够训练好这些参数。另一个更加直觉的原因是, Soft-Lexicon比Lattice LSTM引入了更多的边界信息。Lattice LSTM的forward把词语的字开头这个信息引入到字结尾(backward时,把词语字结尾信息引入到字开头),但是中间这些字并没有显示获得词汇边界信息。但是Soft-Lexicon增加了字在词汇中间的边界信息。所以相比较,Soft-Lexicon引入边界信息更全面,而且方式更为简单。

实体识别在阿里小蜜的应用

下面,简单介绍一下实体识别技术在阿里小蜜中的一些应用场景。

实体识别技术,在知识挖掘过程和知识应用过程都有非常重要的作用。以我负责的两个业务为例:

第一个应用是知识挖掘过程,是对商品图谱数据进行补充,阿里内部本身是有商品图谱的,但是这个商品图谱在某些业务场景下不够完善。具体来说,用户会关心商品的某些属性,但商家在商品详情页里面没有填写这些属性及对应属性值,用户就会经常去问客服,因而客服的回复中就会包含这些属性信息。我们需要做的就是从客服的回复中把涉及到用户非常关心的属性值抽取出来,从而实现对商品图谱进行补充。

第二个应用是知识应用过程,当完善这个商品图谱数据之后,可以利用知识库问答技术去回答用户询问商品属性值的相关问题。

在这两个业务中,实体识别技术是如何发挥作用的呢?知识挖掘过程是一个离线的过程,模型可以做的重一点,我使用的方法是在预训练语言模型的基础之上,结合LSTM模型,作为baseline去做实体挖掘。同时基于前面论文介绍的方法,基于领域词汇表引入额外特征,可以进一步提升效果。知识应用过程是实时的过程,这个模型和离线不太一样,线上对性能要求很高,所以这块采用另外一套框架,基于CNN的方式来实现实体识别功能。

最后小结一下,我今天介绍三个方面内容,首先定义实体识别问题,给出统一模型框架,包括输入表示层、上下文编码层和输出解码层;然后重点分析了改造模型和构造特征这两种方式来引入词汇信息。最后简单介绍了实体识别在阿里小蜜中的应用,包括知识挖掘和知识应用。

转载:达摩院算法工程师35页PPT详解命名实体识别及其在阿里小蜜的应用【附PPT下载】

达摩院命名实体识别及其在阿里小蜜的应用(v2020-05-11)相关推荐

  1. 清华阿里联合发布:一个Few-shot场景的命名实体识别数据集

    2021-05-31 15:17:32 作者 | 陈雨琳.丁宁 编辑 | 刘冰一 近来,围绕着 "少样本命名实体识别"(few-shot NER)这一主题,出现了大量的工作和文献. ...

  2. 阿里AAAI2018论文解读:轻量网络训练框架、GAN中文命名实体识别、英俄翻译等...

    1. 火箭发射:一种有效的轻量网络训练框架<Rocket Launching: A Universal and Efficient Framework for Training Well-per ...

  3. 【AdaSeq基础】30+NER数据汇总,涉及多行业、多模态命名实体识别数据集收集

    简介 命名实体识别NER是NLP基础任务,一直以来受到学术界和业界的广泛关注,本文汇总了常见的中英文.多语言.多模态NER数据集介绍. 相关数据详情可以访问链接: https://github.com ...

  4. 用隐马尔可夫模型(HMM)做命名实体识别——NER系列(二)

    上一篇文章里<用规则做命名实体识别--NER系列(一)>,介绍了最简单的做命名实体识别的方法–规则.这一篇,我们循序渐进,继续介绍下一个模型--隐马尔可夫模型. 隐马尔可夫模型,看上去,和 ...

  5. 用深度学习做命名实体识别(四)——模型训练

    通过本文你将了解如何训练一个人名.地址.组织.公司.产品.时间,共6个实体的命名实体识别模型. 准备训练样本 下面的链接中提供了已经用brat标注好的数据文件以及brat的配置文件,因为标注内容较多放 ...

  6. 【NLP】BiLSTM 命名实体识别 手写代码

    [参考:pytorch_BiLSTM 命名实体识别 手写代码_哔哩哔哩_bilibili] [参考:shouxieai/nlp-bilstm_crf-ner: nlp-bilstm+crf-ner] ...

  7. 序列标注-命名实体识别

    三个月之前 NLP 课程结课,我们做的是命名实体识别的实验.在MSRA的简体中文NER语料(我是从这里下载的,非官方出品,可能不是SIGHAN 2006 Bakeoff-3评测所使用的原版语料)上训练 ...

  8. 「自然语言处理(NLP)论文解读」中文命名实体识别(Lattice-LSTM模型优化)

    来源:AINLPer微信公众号 编辑: ShuYini 校稿: ShuYini 时间: 2019-8-27 引言     今天主要和大家分享一篇关于中文命名实体识别的文章,本文分析Lattice-LS ...

  9. 用隐马尔可夫模型(HMM)做命名实体识别——NER系列(一)

    原博python2写的,文末是我改的python3代码 隐马尔可夫模型,看上去,和序列标注问题是天然适配的,所以自然而然的,早期很多做命名实体识别和词性标注的算法,都采用了这个模型. 这篇文章我将基于 ...

  10. 利用huggingface-transformers进行命名实体识别

    利用huggingface-transformers进行命名实体识别 项目地址:https://github.com/huggingface/transformers 文档地址:https://hug ...

最新文章

  1. 盖尔-沙普利算法_盖尔定律-及其与初创企业的关系
  2. SAP CRM后台取数据逻辑的性能优化
  3. IntelliJ IDEA查看方法在哪里被调用(Usage Search/Call Hierarchy)
  4. python建模仿真 matlab_清华大学出版社-图书详情-《仿真建模与MATLAB实用教程》
  5. OpenCV4每日一练day4:Mat类的创建、赋值、读取
  6. Java中String连接性能的分析
  7. 【Xamarin】MonoTouch - iOS 使用 UIImagePickerController 打开图片库和相机选择图片修改头像...
  8. Cadence输出Gerber文件
  9. 基础线性代数知识点总结与回顾(二):秩与线性相关
  10. 《炬丰科技-半导体工艺》衬底温度对ZnO薄膜的结构和光学特性的影响
  11. OA实施成功的几个必备条件
  12. 12306一直显示服务器忙,网购春运火车票首日 12306网站又现服务器忙
  13. TIM/QQ——将群文件中的临时文件转换成永久文件的方法
  14. 18.3 KSM页面小结
  15. Java读取txt格式文件打印到控制台
  16. 十月百度,阿里巴巴,迅雷搜狗最新面试七十题(第201-270题)
  17. AI人工智能学习路径图
  18. 三大逻辑推理。逻辑推理的基本规则
  19. 关于聚类的一些经验及其在R中的实现
  20. 自媒体人如何写出10w+爆文,这个工具很有用

热门文章

  1. 程序媛秋招心得及面试经验分享
  2. 什么是互联网营销?看一篇这就够了
  3. JPA中的could not initialize proxy - no Session异常分析与解决
  4. Contest1389 - 2018年第三阶段个人训练赛第四场. Transit Tree Path(DFS)
  5. 基于LDC1614 1612的电感式位移传感器
  6. Centos7下cobbler(补鞋匠)安装部署全过程
  7. you are in emergency mode解决办法
  8. 我原来的chinaunix博客地址
  9. win10企业版2016长期服务版本---低配置电脑最适合的win10版本
  10. [剑指Offer]-把数字翻译成字符串