NLP.TM[23] | NLP学习线路推荐
【NLP.TM】
本人有关自然语言处理和文本挖掘方面的学习和笔记,欢迎大家关注。
往期回顾:
之前写过一篇和这个非常接近的内容:NLP.TM[8] | 我的NLP学习之路
开始谈之前,还是先说明一下我下面内容的思路和一些看法。
内容在精不在多,我不会堆砌大量资料,而是精心选择一些适合各个阶段的一个或者几个。我发现大部分时候,收藏了大量资料你也不见得会学,那意义可就不大了。
和打游戏一样有简单模式和困难模式,简单模式玩起来舒服,但是收获会少,困难模式玩起来难受,但是收获会多,想要收获多没毛病,但是也要分析好自己的能力,量力而行,最重要的是,游戏要通关了,才会有最终的收获。
基础打好再来走下一步,否则寸步难行。
基础内容现在可以开始看中文了,本身基础不好看英文会很吃力,理解效果也不好。但是,英文欠的债迟早要还,前沿的内容很多都是英文了。
基础不好,根基不稳,迟早会出问题。
特定营销号制造的焦虑,没必要。
NLP领域,我感觉还没有非常完善的书本和课程,很多书也浅尝辄止,博客知识有比较零散不成体系。所以打开这里的注意一下,我关心的是你要具备什么和怎么具备,而不是简单的给你推材料,毕竟你的目标是学到东西而不是积累材料对吧。
理论和开发,两个都不能少。
要是想看体系化的东西,我只推荐下面几个。
CS224n课程,这应该是我看的NLP最为完善,理论和技术兼具的课程。笔记的话可以看看这个:https://looperxx.github.io/CS224n-2019-01-Introduction%20and%20Word%20Vectors/
统计自然语言处理、文本数据挖掘、基于深度学习的自然语言处理。理论综述,里面会有基础知识,但更多是论文,给了超级多的论文。
《tensorflow与自然语言处理应用》,这本书除了序列标注这块不是很完善,别的都还好。
下面我来和大家谈谈,NLP领域的学习线路。
先修
下面的内容,默认你已经学会。
基础的数学知识吧,高数线代概率统计。
统计学习方法内的知识已经覆盖。(包括条件随机场,nlp里面条件随机场很重要)
深度学习基础知识都没问题,全连接,CNN,RNN,GRU,LSTM等。
编程能力没太大问题。(可以理解为,你有个严谨的想法,要翻译为代码的能力,具体可以体现在你做算法题的能力)
入门
我的理解,满足下面条件,你就算入门了:
知道自然语言处理是什么,具体任务有哪些。
文本的一些基础预处理,例如分词等。
基础简单的任务的基础解决方案及其理论基础。
基础的语言模型。词袋模型(onehot、TFIDF)word2vector必须理解完全,GloVe选学。
文本分类。基于词袋模型的文本分类,fasttext(最简单快捷的文本分类模型)、TextCNN。
序列标注,命名实体识别。CRF、LSTM-CRF、BiLSTM-CRF。
匹配问题。BM25、DSSM。
有关的技术实现。个人还是推荐tensorflow,优先搞1。
例如Transformer、bert之类的东西,都不算基础,主要有几个原因:
基础知识的理解对后续解决问题能力的提升非常重要,让你不关注于模型本身,而是解决问题,甚至是特定场景下的问题。
这个点非常重要,类似word2vector之类的玩意,现在还被广泛使用,未被淘汰,transformer之类的使用门槛太高,无论是时间代价还是空间代价都很高,实现成本也不低,因此这些都不是你的第一选择。
有关NLP是什么,建议大家看看百度百科,另外是一些NLP的教材和专著,例如统计自然语言处理,基于深度学习的自然语言处理,看一下书的第一章和最后一章,还有目录,你就会大概理解这个概念,对一个学科有了“边界”的概念。书因为具有一定的门槛,所以乱说的会少一些,
预处理处理,主要是针对中文,我列举出来有这些,这些可以通过百度技术博客快速习得:
标点符号处理——这个很基础,正则表达式即可处理。
繁体转简体。看这个:https://blog.csdn.net/wds2006sdo/article/details/53583367
分词,最简单的还是jieba,适配的环境也比较多,主流的c++、python、java都需要会。在现实应用中,尤其是大项目,分词由于属于很上游且对下游影响重大的任务,因此选定后一般不换。(了解jieba的回答我一下,jieba里面的分词用的是那种模型?)
英文的话补充一点点,NLTK基本能覆盖所有功能了。
好了终于要开始讲模型了,希望大家能看下去吧。
语言模型
语言模型的突破性进展几乎都是NLP发展的里程碑,毕竟语义理解和抽象化都来源于上游的语言模型。
首先是词袋模型,one hot和TF-IDF是比较常见的,这块难度不是很高,百度和知乎找博客学就好了。
word2vector这块,首先是基本版的大家最好能理解,一方面理论明白,对于具体的细节,大家可以看看word2vector的源码,有关H树、负采样之类的。这方面要看详情,我很建议大家看看上面CS224N里面涉及word2vector的章节,就在前几章,中文笔记也有的。具体实现可以使用gensim,自己做试验还是够用的。我写过一篇自己的理解:
GloVe我之前就写过,看这里。【NLP.TM】GloVe模型及其Python实现
需要补充得是,主题模型,其实这块我也理解为一种文本表示的方法,如LDA等,理论可参考一些博客,另外是gensim包和LDA之类的。
文本分类
文本分类应该是NLP里面比较基础的任务了,如果要完成工程任务,非常推荐fasttext,但是建议还是能从词袋模型+机器学习的模式学到点东西。这块比较简单,到了这里词袋模型到这步大家应该了解,加上机器学习是先修,大家已经明白,至于实现上,大家可以看看网上垃圾邮件分类的例子,是一个词袋模型+朴素贝叶斯的例子。
fasttxt有两个实现方法,一个是fasttext的原生工具包,另一个是gensim。说原理,原理和word2vector非常接近,如果你word2vector能看懂,其实这个也不会很难,给个博客吧:cnblogs.com/huangyc/p/9768872.html。
说起这个gensim,出镜率不低,他其实是一个和NLP有关的工具包,里面含盖了很多工具,希望大家可以花大概1天左右看看里面的API文档,知道里面有什么。(相似的还有sklearn)
序列标注
序列标注其实是一个文本分类的升级版问题,难度也随之提升,这块其实我的公众号谈的比较多了,分享给大家吧。另外材料不够可以参考其他网络资源了。
这块的学习目标如下:
知道序列标注的问题的实质以及核心解决思路,即能不能把具体问题抽象出来。
常见模型。从CRF开始到BILSTM-CRF等,深度学习能理解的话,其实这些也不会太难。
这里挺考验大家得是tensorflow的使用吧。
匹配问题
匹配问题其实并不常见,但是我想提到的一个核心点在于多输入的问题,另外有关相似度衡量的问题,也能通过学习产生理解。这里面的模型就建议大家看看DSSM即可,这块比较建议大家直接看论文,网络上比较多博客对DSSM的解读存在问题。另外我也看了一些其他材料,可供大家拓展和进阶阅读:
进阶
这里的进阶,只是让自己能更好地往前沿走,具体的个人成长应该从这块完成后开始。这一块我只想大家对BERT带来的新模式有一个比较完整的理解,有条件的能自己启起来玩,没有条件会比较尴尬吧。
涉及下面内容。
Transformer。来自论文Attention is all you need。可能需要一些seq2seq的知识,但是只需要知道他在干什么就好,核心还是要知道transformer是什么。(不是变形金刚!!)这里的辅助材料建议看知乎。
不建议直接学bert,建议从EMLO开始,语言模型整套整一遍,这整理了一整套,阅读量不大,额,我的理解可能写的有点深入,大家可以以哪个为提纲作为学习参考,这里就包含了可能很多人想学的bert,大家可以体验一下一开始就学bert和现在再来接触的感觉有什么不同。
bert建议看一遍源码。
由于我感觉大家学到这里已经基本能有一定的代码能力和自学能力,能找到适合自己的材料,所以这里的材料不单独列啦,百度知乎谷歌github走起来。
自由发展之路
进入工作后好多前辈和我聊,对我的建议更多是有一个方向能有更加深刻的了解,所以建议大家也是找一个方向,做点有深入的学习和尝试。具体会有这些方向吧。大方向是分为NLU(理解)和NLG(生成)。
NLU其实上面大家了解了很多基础了,这里就是一些更加有深度的模型了。
文本分类。
序列标注。
语义匹配。
NLG重在生成,这是比较前沿的方向了,但是现实应用目前看的并不多。
自动摘要。
阅读理解。
机器翻译。
具体怎么学习呢,首先是内容上,建议大家走这个路线。
bert之类的,尽可能尝试用上去,例如序列标注,可以试试bert+bilstm+crf。
阅读论文和专利,不要局限在近几年的热文,也要多看看13年后的文章(具体数是个人经验吧),看看别人是怎么做的,可以从综述入手找论文来看。
有一个固定的数据集,也可以是比赛,自己尝试尽可能多的模型。
小结
内容会比较零散,主要以阐述知识点为主,从上面我的学习经历也可以看到,要是你真的想走在前面,那其实真没有很多很好的材料能覆盖,这就注定是一个需要自己独立完成的过程,困难和弯路固然是有,但是那些没打到我的终究让我变得强大,有问题可以随时沟通,各位共勉。