NLP学习路线
开始记录学习nlp,学习路线参考博主的建议,后续把这部分的内容进行整理。
前言
要学好NLP,下面3个是缺一不可的: 1. 机器学习基础 人工智能很多技术和模块是搭建在机器学习基础上的,无论是CV,NLP,语音识别。可以直接去学习一个方向,也能学到东西。 但是可能不能很好的理解技术和模型背后的细节。 2. 数据结构与算法 在工程上写一个算法,如果不懂数据结构和算法,写出来的程序可能效率不高,达不到上线的要求。所以要懂数据结构和算法,才能写出最优化,性能高的程序。 3. 良好的编程基础 有良好的编程基础才能写出好的程序,不只是会讲讲理论,还能够实现出来,达到落地的地步。 在有了上面的基础后,学完自然语言的基础知识。然后需要在NLP里选择一个技术路线或者应用领域。比如预训练模型BERT,图神经网络。或者选择一个领域,智能对话系统,自然语言生成等,在某一个领域深入下去,把领域内的方方面面知识点都搞明白能够串起来。我们要使自己成为一个T字型的人才,有一个的知识的宽度,同时一定要在某方面有深度。 同时我们要养成读论文的习惯,比如在工作中突然来了一个新的需求,这时候就需要去读读论文,看看别人的思路,做一个baseline出来,然后再此基础上进行改进。
1、什么是自然语言处理
自然语言处理 = Natural Language Processing = NLP
自然语言理解 = Natural Language Understanding = NLU = 理解文本中的意思
自然语言生成 = Natural Language Generation = NLG = 根据意思生成文本
例1) 一个人在看百度贴吧看帖子的时候, 首先是看帖子,这是一个理解文本内容(NLU)的过程, 然后回答帖子,这是一个生成文本(NLG)的过程。
例2) 人类在语言交流的时候
1) 听到对方的声音讯号, 根据从小学习的语文, 转换成一串文字。 (语音识别)
2) 对这段文字进行理解。 (NLU)
3) 回复对方。 (NLG)
1.1 为什么自然语言处理难?
图片:所见即所得 文字:看到的是文字,要理解背后的含义。
1) CV的图像,一眼看过去,图片内容很直观明了。比如图片中一只狗在追一只猫,看图片就知道内容,很少有要揣摩图片意思的应用场景, 基本都是图片分类,目标检测等。 2) 自然语言的理解,想想我们从小学习的古诗还有阅读理解,要进行前后文内容的结合,才能回答问题; 还有一词多义, 一句多义等。 还有一个场景,有人突然说了一句话,听的多个人听完后可能理解的意思是不一样的。
1.2 自然语言处理技术的三个维度
自然语言理解是从上到下的一个过程:单词->句子结构->句子含义
Morphology(单词) :构成语言的最小单位,单词本身含义,词性
Syntax(句子结构):句子剖析,主语+谓语+宾语,语法树
Semantic(语义):这句话的含义, 最终的目的地
1.3 NLP基础任务
nlp基础任务主要分为以下几点:
1、分词(Word Segmentation):单词是句子最小的单位,要把句子切分完后做特征工程,中文比英文要难些,英文天生空格或其他符号就能切分,中文要借助一些算法才能分出一个比较好的结果。分词是NLP任务的第一步,是已经解决的问题。 2. 词性分析(Part-of-Speech Tagging):对后续单词理解是有帮助的,词性也可以作为后续任务的特征。非常基础的工作,是已经解决的比较好的问题。 3. 语义理解(Semantic Understanding):理解一句话的含义,NLP领域的核心。例如Bert本身也是为了很好的理解一个单词,以达到更好的理解一句话。 4. 命名实体识别(Named Entity Recognition):比较基础的任务,现实生活中实际存在的一个物体,比如人,地名,公司名,组织名,时间。 医疗领域:科室,药名。 实体是在一个领域里比较有含义的单词,通常是给一个文本,任务是把实体标记出来。 像聊天机器人,意图识别,知识图谱等场景中,命名实体识别对后续的任务有非常大的帮助。 5. 依存文法分析(Dependecy Parsing):语法分析领域的重要技术,单词之间的依存关系。 6. 句法分析(Parsing):对一句话的结构,主谓宾来进行剖析,语法树。实际应用场景比较少,即使有也对系统提升比较小。 依存文法分析通常价值比句法分析大。 7. 自然语言处理技术概览
1.4 算法复杂度
对于复杂度的理解是至关重要的。写完任何一个程序,我们都需要仔细思考程序的效率如何。这个效率可以从两个方面来考虑,一方面是时间复杂度,另外一方面是空间复杂度。 算法复杂度衡量的是一个算法的效率,比如一个算法运行下来需要多长时间?需要消耗多少资源?根据算法复杂度,我们可以评估一个算法的优劣。在算法复杂度的衡量上,我们经常使用Big O表示法 复杂度的理解是必修课。在从事AI工作中经常会碰到各种各样程序效率低的问题,一个模型训练起来可能需要几天甚至几个月。这时候最直接的解决方式就是加机器,但也是最笨的方法。作为一名AI工程师,我们首先需要想到如何从根本上优化算法,比如检查是否使用了合理的数据结构? 如果一个程序需要经常做数据的查询,那这时候你要考虑用像哈希等合理的数据结构了。相反,如果你用的是列表(list),查询速度就会变得很慢。 再比如,假设我们需要寻找一堆数据中的最大的几个数,很多人可能会选择先把所有的数做排序,之后在提取最大的前几个。但有没有比这个更高效的做法呢? 实际上,在这个场景,我们可以使用一个优先队列(priority queue)来更快速地做查询。 所以,你可以看到每一个小的细节决定了整个程序的效率。这也是为什么一定要重视算法复杂度的原因。 算法复杂度不是衡量程序跑了几秒,而是分析算法效率的级别,线性与问题的大小,平方与问题大小,三次方与问题大小。 复杂度从下面两个角度去衡量1)时间复杂度:用了多少时间; 2)空间复杂度:用了多少内存空间
|