谢邀。
针对这个问题,我们邀请了微软亚洲研究院首席研究员周明博士为大家解答。
周明博士于2016年12月当选为全球计算语言学和自然语言处理研究领域最具影响力的学术组织——计算语言学协会(ACL, Association for Computational Linguistics)的新一届候任主席。此外,他还是中国计算机学会中文信息技术专委会主任、中国中文信息学会常务理事、哈工大、天津大学、南开大学、山东大学等多所学校博士导师。他1985年毕业于重庆大学,1991年获哈工大博士学位。1991-1993年清华大学博士后,随后留校任副教授。1996-1999访问日本高电社公司主持中日机器翻译研究。他是中国第一个中英翻译系统、日本最有名的中日机器翻译产品J-北京的发明人。1999年加入微软研究院并随后负责自然语言研究组,主持研制了微软输入法、对联、英库词典、中英翻译等著名系统。近年来与微软产品组合作开发了小冰(中国)、Rinna(日本)等聊天机器人系统。他发表了100余篇重要会议和期刊论文。拥有国际发明专利40余项。
————这里是正式回答的分割线————
自然语言处理(简称NLP),是研究计算机处理人类语言的一门技术,包括:
1.句法语义分析:对于给定的句子,进行分词、词性标记、命名实体识别和链接、句法分析、语义角色识别和多义词消歧。
2.信息抽取:从给定文本中抽取重要的信息,比如,时间、地点、人物、事件、原因、结果、数字、日期、货币、专有名词等等。通俗说来,就是要了解谁在什么时候、什么原因、对谁、做了什么事、有什么结果。涉及到实体识别、时间抽取、因果关系抽取等关键技术。
3.文本挖掘(或者文本数据挖掘):包括文本聚类、分类、信息抽取、摘要、情感分析以及对挖掘的信息和知识的可视化、交互式的表达界面。目前主流的技术都是基于统计机器学习的。
4.机器翻译:把输入的源语言文本通过自动翻译获得另外一种语言的文本。根据输入媒介不同,可以细分为文本翻译、语音翻译、手语翻译、图形翻译等。机器翻译从最早的基于规则的方法到二十年前的基于统计的方法,再到今天的基于神经网络(编码-解码)的方法,逐渐形成了一套比较严谨的方法体系。
5.信息检索:对大规模的文档进行索引。可简单对文档中的词汇,赋之以不同的权重来建立索引,也可利用1,2,3的技术来建立更加深层的索引。在查询的时候,对输入的查询表达式比如一个检索词或者一个句子进行分析,然后在索引里面查找匹配的候选文档,再根据一个排序机制把候选文档排序,最后输出排序得分最高的文档。
6.问答系统: 对一个自然语言表达的问题,由问答系统给出一个精准的答案。需要对自然语言查询语句进行某种程度的语义分析,包括实体链接、关系识别,形成逻辑表达式,然后到知识库中查找可能的候选答案并通过一个排序机制找出最佳的答案。
7.对话系统:系统通过一系列的对话,跟用户进行聊天、回答、完成某一项任务。涉及到用户意图理解、通用聊天引擎、问答引擎、对话管理等技术。此外,为了体现上下文相关,要具备多轮对话能力。同时,为了体现个性化,要开发用户画像以及基于用户画像的个性化回复。
随着深度学习在图像识别、语音识别领域的大放异彩,人们对深度学习在NLP的价值也寄予厚望。再加上AlphaGo的成功,人工智能的研究和应用变得炙手可热。自然语言处理作为人工智能领域的认知智能,成为目前大家关注的焦点。很多研究生都在进入自然语言领域,寄望未来在人工智能方向大展身手。但是,大家常常遇到一些问题。俗话说,万事开头难。如果第一件事情成功了,学生就能建立信心,找到窍门,今后越做越好。否则,也可能就灰心丧气,甚至离开这个领域。这里针对给出我个人的建议,希望我的这些粗浅观点能够引起大家更深层次的讨论。
建议1:如何在NLP领域快速学会第一个技能?
我的建议是:找到一个开源项目,比如机器翻译或者深度学习的项目。理解开源项目的任务,编译通过该项目发布的示范程序,得到与项目示范程序一致的结果。然后再深入理解开源项目示范程序的算法。自己编程实现一下这个示范程序的算法。再按照项目提供的标准测试集测试自己实现的程序。如果输出的结果与项目中出现的结果不一致,就要仔细查验自己的程序,反复修改,直到结果与示范程序基本一致。如果还是不行,就大胆给项目的作者写信请教。在此基础上,再看看自己能否进一步完善算法或者实现,取得比示范程序更好的结果。
建议2:如何选择第一个好题目?
工程型研究生,选题很多都是老师给定的。需要采取比较实用的方法,扎扎实实地动手实现。可能不需要多少理论创新,但是需要较强的实现能力和综合创新能力。而学术型研究生需要取得一流的研究成果,因此选题需要有一定的创新。我这里给出如下的几点建议。
建议3:如何写出第一篇论文?
————这里是回答结束的分割线————
感谢大家的阅读。
本帐号为微软亚洲研究院的官方知乎帐号。本帐号立足于计算机领域,特别是人工智能相关的前沿研究,旨在为人工智能的相关研究提供范例,从专业的角度促进公众对人工智能的理解,并为研究人员提供讨论和参与的开放平台,从而共建计算机领域的未来。
微软亚洲研究院的每一位专家都是我们的智囊团,你在这个帐号可以阅读到来自计算机科学领域各个不同方向的专家们的见解。请大家不要吝惜手里的“邀请”,让我们在分享中共同进步。
昨天实验室一位刚进组的同学发邮件来问我如何查找学术论文,这让我想起自己刚读研究生时茫然四顾的情形:看着学长们高谈阔论领域动态,却不知如何入门。经过研究生几年的耳濡目染,现在终于能自信地知道去哪儿了解最新科研动态了。我想这可能是初学者们共通的困惑,与其只告诉一个人知道,不如将这些Folk Knowledge写下来,来减少更多人的麻烦吧。当然,这个总结不过是一家之谈,只盼有人能从中获得一点点益处,受个人认知所限,难免挂一漏万,还望大家海涵指正。
1. 国际学术组织、学术会议与学术论文
自然语言处理(natural language processing,NLP)在很大程度上与计算语言学(computational linguistics,CL)重合。与其他计算机学科类似,NLP/CL有一个属于自己的最权威的国际专业学会,叫做The Association for Computational Linguistics(ACL,URL:ACL Home Page),这个协会主办了NLP/CL领域最权威的国际会议,即ACL年会,ACL学会还会在北美和欧洲召开分年会,分别称为NAACL和EACL。除此之外,ACL学会下设多个特殊兴趣小组(special interest groups,SIGs),聚集了NLP/CL不同子领域的学者,性质类似一个大学校园的兴趣社团。其中比较有名的诸如SIGDAT(Linguistic data and corpus-based approaches to NLP)、SIGNLL(Natural Language Learning)等。这些SIGs也会召开一些国际学术会议,其中比较有名的就是SIGDAT组织的EMNLP(Conference on Empirical Methods on Natural Language Processing)和SIGNLL组织的CoNLL(Conference on Natural Language Learning)。此外还有一个International Committee on Computational Linguistics的老牌NLP/CL学术组织,它每两年组织一个称为International Conference on Computational Linguistics (COLING)的国际会议,也是NLP/CL的重要学术会议。NLP/CL的主要学术论文就分布在这些会议上。
作为NLP/CL领域的学者最大的幸福在于,ACL学会网站建立了称作ACL Anthology的页面(URL:ACL Anthology),支持该领域绝大部分国际学术会议论文的免费下载,甚至包含了其他组织主办的学术会议,例如COLING、IJCNLP等,并支持基于Google的全文检索功能,可谓一站在手,NLP论文我有。由于这个论文集合非常庞大,并且可以开放获取,很多学者也基于它开展研究,提供了更丰富的检索支持,具体入口可以参考ACL Anthology页面上方搜索框右侧的不同检索按钮。
与大部分计算机学科类似,由于技术发展迅速,NLP/CL领域更重视发表学术会议论文,原因是发表周期短,并可以通过会议进行交流。当然NLP/CL也有自己的旗舰学术期刊,发表过很多经典学术论文,那就是Computational Linguistics(URL:MIT Press Journals)。该期刊每期只有几篇文章,平均质量高于会议论文,时间允许的话值得及时追踪。此外,ACL学会为了提高学术影响力,也刚刚创办了Transactions of ACL(TACL,URL:Transactions of the Association for Computational Linguistics (ISSN: 2307-387X)),值得关注。值得一提的是这两份期刊也都是开放获取的。此外也有一些与NLP/CL有关的期刊,如ACM Transactions on Speech and Language Processing,ACM Transactions on Asian Language Information Processing,Journal of Quantitative Linguistics等等。
根据Google Scholar Metrics 2013年对NLP/CL学术期刊和会议的评价,ACL、EMNLP、NAACL、COLING、LREC、Computational Linguistics位于前5位,基本反映了本领域学者的关注程度。
NLP/CL作为交叉学科,其相关领域也值得关注。主要包括以下几个方面:(1)信息检索和数据挖掘领域。相关学术会议主要由美国计算机学会(ACM)主办,包括SIGIR、WWW、WSDM等;(2)人工智能领域。相关学术会议主要包括AAAI和IJCAI等,相关学术期刊主要包括Artificial Intelligence和Journal of AI Research;(3)机器学习领域,相关学术会议主要包括ICML,NIPS,AISTATS,UAI等,相关学术期刊主要包括Journal of Machine Learning Research(JMLR)和Machine Learning(ML)等。例如最近兴起的knowledge graph研究论文,就有相当一部分发表在人工智能和信息检索领域的会议和期刊上。实际上国内计算机学会(CCF)制定了“中国计算机学会推荐国际学术会议和期刊目录”(CCF推荐排名),通过这个列表,可以迅速了解每个领域的主要期刊与学术会议。
最后,值得一提的是,美国Hal Daumé III维护了一个natural language processing的博客(natural language processing blog),经常评论最新学术动态,值得关注。我经常看他关于ACL、NAACL等学术会议的参会感想和对论文的点评,很有启发。另外,ACL学会维护了一个Wiki页面(ACL Wiki),包含了大量NLP/CL的相关信息,如著名研究机构、历届会议录用率,等等,都是居家必备之良品,值得深挖。
2. 国内学术组织、学术会议与学术论文
与国际上相似,国内也有一个与NLP/CL相关的学会,叫做中国中文信息学会(URL:中国中文信息学会)。通过学会的理事名单(中国中文信息学会)基本可以了解国内从事NLP/CL的主要单位和学者。学会每年组织很多学术会议,例如全国计算语言学学术会议(CCL)、全国青年计算语言学研讨会(YCCL)、全国信息检索学术会议(CCIR)、全国机器翻译研讨会(CWMT),等等,是国内NLP/CL学者进行学术交流的重要平台。尤其值得一提的是,全国青年计算语言学研讨会是专门面向国内NLP/CL研究生的学术会议,从组织到审稿都由该领域研究生担任,非常有特色,也是NLP/CL同学们学术交流、快速成长的好去处。值得一提的是,2010年在北京召开的COLING以及2015年即将在北京召开的ACL,学会都是主要承办者,这也一定程度上反映了学会在国内NLP/CL领域的重要地位。此外,计算机学会中文信息技术专委会组织的自然语言处理与中文计算会议(NLP&CC)也是最近崛起的重要学术会议。中文信息学会主编了一份历史悠久的《中文信息学报》,是国内该领域的重要学术期刊,发表过很多篇重量级论文。此外,国内著名的《计算机学报》、《软件学报》等期刊上也经常有NLP/CL论文发表,值得关注。
过去几年,在水木社区BBS上开设的AI、NLP版面曾经是国内NLP/CL领域在线交流讨论的重要平台。这几年随着社会媒体的发展,越来越多学者转战新浪微博,有浓厚的交流氛围。如何找到这些学者呢,一个简单的方法就是在新浪微博搜索的“找人”功能中检索“自然语言处理”、 “计算语言学”、“信息检索”、“机器学习”等字样,马上就能跟过去只在论文中看到名字的老师同学们近距离交流了。还有一种办法,清华大学梁斌开发的“微博寻人”系统(清华大学信息检索组)可以检索每个领域的有影响力人士,因此也可以用来寻找NLP/CL领域的重要学者。值得一提的是,很多在国外任教的老师和求学的同学也活跃在新浪微博上,例如王威廉(Sina Visitor System)、李沐(Sina Visitor System)等,经常爆料业内新闻,值得关注。还有,国内NLP/CL的著名博客是52nlp(我爱自然语言处理),影响力比较大。总之,学术研究既需要苦练内功,也需要与人交流。所谓言者无意、听者有心,也许其他人的一句话就能点醒你苦思良久的问题。无疑,博客微博等提供了很好的交流平台,当然也注意不要沉迷哦。
3. 如何快速了解某个领域研究进展
最后简单说一下快速了解某领域研究进展的经验。你会发现,搜索引擎是查阅文献的重要工具,尤其是谷歌提供的Google Scholar,由于其庞大的索引量,将是我们披荆斩棘的利器。
当需要了解某个领域,如果能找到一篇该领域的最新研究综述,就省劲多了。最方便的方法还是在Google Scholar中搜索“领域名称 + survey / review / tutorial / 综述”来查找。也有一些出版社专门出版各领域的综述文章,例如NOW Publisher出版的Foundations and Trends系列,Morgan & Claypool Publisher出版的Synthesis Lectures on Human Language Technologies系列等。它们发表了很多热门方向的综述,如文档摘要、情感分析和意见挖掘、学习排序、语言模型等。
如果方向太新还没有相关综述,一般还可以查找该方向发表的最新论文,阅读它们的“相关工作”章节,顺着列出的参考文献,就基本能够了解相关研究脉络了。当然,还有很多其他办法,例如去http://videolectures.net上看著名学者在各大学术会议或暑期学校上做的tutorial报告,去直接咨询这个领域的研究者,等等。
1.幼年体——自然语言处理好屌,我什么都不会但是好想提高
建议。。。去看公开课~去做Kaggle的那个情感分析题。
2.成长期——觉得简单模型太Naive,高大上的才是最好的
这个阶段需要自己动手实现一些高级算法,或者说常用算法,比如LDA,比如SVM,比如逻辑斯蒂回归。并且拥抱Kaggle,知道trick在这个领域的重要性。
3.成熟期——高大上的都不work,通过特征工程加规则才work
大部分人应该都在这个级别吧,包括我自己,我总是想进化,但积累还是不够。觉得高大上的模型都是一些人为了paper写的,真正的土方法才是重剑无锋,大巧不工。在这个阶段,应该就是不断读论文,不断看各种模型变种吧,什么句子相似度计算word2vec cosine已经不再适合你了。
4.完全体——在公开数据集上,把某个高大上的模型做work了~
这类应该只有少数博士可以做到吧,我已经不知道到了这个水平再怎么提高了~是不是只能说不忘初心,方得始终。
5.究极体——参见Micheal Jordan Andrew Ng.
好好锻炼身体,保持更长久的究极体形态不请自来,语言学背景,研二。废话不说,直接上货。
书籍篇:
入门书籍挺多的,我也看过不少。
1)《数学之美》(吴军)
这是我看的第一本关于NLP的书。现在第二版出来了,貌似新增了两章内容,还没看过。第一版写的挺好,科普性质。看完对于nlp的许多技术原理都有了一点初步认识。现在没事还会翻翻的。
2)《自然语言处理简明教程》(冯志伟)
冯志伟老师这本书,偏向于语言学,书略厚。关于语言学的东西很多。都是很容易理解的东西。建议没有学过理工科们翻一翻,毕竟nlp这东西未来趋势可能会融合不少语言学的东西。
3)《自然语言处理综论》(Daniel Jurafsky)
这本书也是冯志伟老师翻译的,翻译的挺棒,看了差不多一半。综论性质的,选感兴趣的章节翻翻就行。作者是Daniel Jurafsky,在coursera上面有他的课程,后面视频篇里集中谈。
4)《自然语言处理的形式模型》(冯志伟)
这本书还是冯志伟老师写的。很佩服冯志伟老师,文理兼修,而且都很厉害。内容许多是从他以前的著作里面摘取的。算是一本各种语言模型和统计模型的大集合吧。放在桌面,没事翻翻也能是极好的。
5)《统计自然语言处理(第2版)》(宗成庆)
这本书我觉得写的不错。虽然我是语言学背景,但读起来也没有太吃力。它也是综论性质的,可以跳着看。
6)《统计学习方法》(李航)
自然语言处理需要些机器学习的知识。我数学基础还是太薄弱,有的内容还是有些吃力和困惑的。
7)《机器学习实战》哈林顿 (Peter Harrington)
《Python自然语言处理》
《集体智慧编程》
这些书都是python相关的。中间那本就是将NLTK的。网上都有电子版,需要的时候翻一番看一看就行。
视频篇:
其他篇:
1)博客的话,我爱自然语言处理专门记录nlp的,很不错,再有就是csdn上一些比较琐碎的了。
2)北京大学中文系 应用语言学专业这个刚开始的时候也看了看,又不少干货。
3)《中文信息学报》说这个,不会被大神喷吧。英语不佳,英文文献实在看的少。这个学报,也是挑着看看就行。
好像就是这些内容了。如果有,日后再补。
虽然自己写了这么多,但不少书和视频都没有完整的看完。现在水平仍很菜,仍在进阶的路上。希望各路大神多多指点,该拍砖就拍吧。这里有一份用深度学习做自然语言处理的最佳实践清单,希望对你有所帮助。
对于如何使用深度学习进行自然语言处理,本文作者 Sebastian Ruder 给出了一份详细的最佳实践清单,不仅包括与大多数 NLP 任务相关的最佳实践,还有最常见任务的最佳实践,尤其是分类、序列标注、自然语言生成和神经机器翻译。作者对最佳实践的选择很严格,只有被证明在至少两个独立的群体中有益的实践才会入选,并且每个最佳实践作者至少给出两个参引。作者承认这份清单并不全面,比如其不熟悉的解析、信息提取等就没有涉及。机器之心对该文进行了编译, 原文链接在此,点击即可跳转。
本文是一系列关于如何使用神经网络进行自然语言处理(NLP)的最佳实践汇集,将随着新观点的出现定期进行更新,从而不断提升我们对用于 NLP 的深度学习的理解。
NLP 社区中有这样一句说法:带有注意力的 LSTM 能在所有任务上实现当前最佳的表现。尽管在过去的两年这确实是真的,NLP 社区却在慢慢偏离带有注意力的 LSTM,而去发现更有趣的模型。
但是,NLP 社区并非想再花费两年独立地(重新)发现下一个带有注意力的 LSTM。我们不打算重新发明已经奏效的技巧或方法。尽管现存的深度学习库已经从整体上编码了神经网络的最佳实践,比如初始化方案,但是很多其他的细节,尤其是特定任务或特定领域还有待从业者解决。
本文并不打算盘点当前最佳,而是收集与大量任务相关的最佳实践。换言之,本文并不描述某个特定架构,而是旨在收集那些构建成功框架的特征。其中的很多特征对于推动当前最佳是最有用的,因此我希望对于它们的更广泛了解将会带来更强的评估、更有意义的基线对比,以及更多灵感,帮助我们觉察那些可能奏效的方法。
本文假设你对神经网络应用于 NLP 的情况已经很熟悉(如果不熟悉,我建议你看一下 Yoav Goldberg 写的A Primer on Neural Network Modelsfor Natural Language Processing),并大体上对 NLP 或某个特定任务感兴趣。本文的主要目标是使你快速掌握相关的最佳实践,从而尽快做出有意义的贡献。我首先会对与绝大多数任务相关的最佳实践做一个概述,接着略述与最常见的任务相关的最佳实践,尤其是分类、序列标注、自然语言生成和神经机器翻译。
免责声明:把某些东西定义为最佳实践极其困难:最佳的标准是什么?如果有更好的实践出现呢?本文基于我的个人理解和经验(肯定不全面)。接下来,我将只讨论被证明在至少两个独立的群体中有益的实践。对于每个最佳实践我将给出至少两个参引。
词嵌入
在最近的 NLP 发展中,词嵌入无疑是最广为人知的最佳实践,这是因为预训练嵌入的使用对我们十分有帮助 (Kim, 2014) [12]。词嵌入的最佳维度绝大多数是依赖任务的:一个更小的维度更多在句法任务上工作更好,比如命名实体识别(named entity recognition)(Melamud et al., 2016) [44],或者词性标注(POS)(Plank et al., 2016) [32],尽管一个更大的维度对于更多的语义任务来说更有用,比如情感分析 (Ruder et al., 2016) [45]。
深度
虽然短时间内我们还无法达到计算机视觉的深度,但是 NLP 中的神经网络已经发展地更深了。现在最佳的方法通常使用 deep Bi-LSTM,它通常包含 3-4 层,比如词性标注 (Plank et al., 2016) 和语义角色标注 (He et al., 2017) [33]。一些任务的模型甚至更深。谷歌的 NMT 模型有 8 个编码器和 8 个解码器层,(Wu et al., 2016) [20]。然而,大多数情况下,模型超过 2 层所带来的性能提升是最小的 (Reimers & Gurevych, 2017) [46]。
这些观察适用于绝大多数序列标注和结构化预测问题。对于分类,深或者非常深的模型只在字符级的输入中表现良好,并且浅层的字词级模型依然是当前最佳 (Zhang et al., 2015; Conneau et al., 2016; Le et al., 2017) [28, 29, 30]。
层连接
训练深度神经网络时,可以使用一些核心技巧避免梯度消失问题。不同的层和连接因此被提出来了,这里我们将讨论 3 点:i) Highway 层,ii) 残差连接(residual connection),iii) 密集型残差连接。
Highway 层:它受到 LSTM 的门控机制所启发 (Srivastava et al., 2015) [1]。首先让我们假设一个单层的 MLP,它将一个非线性 g 的仿射变换应用到其输入 x:
Highway 层接着计算以下函数:
其中 t=σ(WTx+bT) 被称作变换门(transform gate),(1−t) 被称作进位门(carry gate)。我们可以看到,Highway 层和 LSTM 门很相似,因为它们自适应地把输入的一些维度直接传递到输出。
Highway 层主要用于语言建模,并取得了当前最佳的结果 (Kim et al., 2016; Jozefowicz et al., 2016; Zilly et al., 2017) [2, 3, 4],但它同时也用于其他任务,如语音识别 (Zhang et al., 2016) [5]。想了解更多相关信息和代码,可查看 Sristava 的主页(http://people.idsia.ch/~rupesh/very_deep_learning/)。
残差连接:残差连接(He et al., 2016)[6] 的首次提出是应用于计算机视觉,也是计算机视觉在 ImageNet 2016 夺冠的最大助力。残差连接甚至比 Highway 层更直接。我们使用代表当前层的指数 L 来增加之前的层输出 h。然后,残差连接学习以下函数:
仅通过一个快捷连接,残差连接即可把之前层的输入添加到当前层。这一简单的更改缓解了梯度消失问题,因为层级不能变得更好,模型可以默认使用恒等函数(identity function)。
密集型残差连接:密集型残差连接 (Huang et al., 2017) [7] ( CVPR 2017 最佳论文奖)从每一个层向所有随后的层添加连接,而不是从每一个层向下一个层添加层:
密集型残差连接已成功应用于计算机视觉,也被证明在神经机器翻译方面的表现持续优于残差连接 (Britz et al., 2017) [27]。
Dropout
尽管在计算机视觉领域的多数应用中,批归一化已使其他正则化器变得过时,但是 dropout (Srivasta et al., 2014) [8] 依然是应用于 NLP 深度神经网络中的正则化器。0.5 的 dropout 率表明其在绝大多数场景中依然高效 (Kim, 2014)。近年来,dropout 的变体比如适应性 dropout(Ba & Frey, 2013) [9]和进化 dropout (Li et al., 2016) [10] 已被提出,但没有一个在 NLP 社区中获得广泛应用。造成这一问题的主要原因是它无法用于循环连接,因为聚集 dropout masks 会将嵌入清零。
循环 dropout:循环 dropout(Gal & Ghahramani, 2016)[11] 通过在层 ll 的时间步中应用相同的 dropout masks 来解决这一问题。这避免了放大序列中的 dropout 噪音,并为序列模型带来了有效的正则化。循环 dropout 已在语义角色标注 (He et al., 2017) 和语言建模 (Melis et al., 2017) [34] 中取得了当前最佳的结果。
多任务学习
如果有额外的数据,多任务学习(MTL)通常可用于在目标任务中提升性能。
辅助目标(auxiliary objective):我们通常能找到对我们所关心的任务有用的辅助目标 (Ruder, 2017) [13]。当我们已经预测了周围词以预训练词嵌入 (Mikolov et al., 2013) 时,我们还可以在训练中将其作为辅助目标 (Rei, 2017) [35]。我们也经常在序列到序列模型中使用相似的目标(Ramachandran et al., 2016)[36]。
特定任务层:尽管把 MTL 用于 NLP 的标准方法是硬参数共享,但允许模型学习特定任务层很有意义。这可通过把一项任务的输出层放置在较低级别来完成 (Søgaard & Goldberg, 2016) [47]。另一方法是诱导私有和共享的子空间 (Liu et al., 2017; Ruder et al., 2017) [48, 49]。
注意力机制
注意力机制是在序列到序列模型中用于注意编码器状态的最常用方法,它同时还可用于回顾序列模型的过去状态。使用注意力机制,系统能基于隐藏状态 s_1,...,s_m 而获得环境向量(context vector)c_i,这些环境向量可以和当前的隐藏状态 h_i 一起实现预测。环境向量 c_i 可以由前面状态的加权平均数得出,其中状态所加的权就是注意力权重 a_i:
注意力函数 f_att(h_i,s_j) 计算的是目前的隐藏状态 h_i 和前面的隐藏状态 s_j 之间的非归一化分配值。在下文中,我们将讨论四种注意力变体:加性注意力(additive attention)、乘法(点积)注意力(multiplicative attention)、自注意力(self-attention)和关键值注意力(key-value attention)。
加性注意力是最经典的注意力机制 (Bahdanau et al., 2015) [15],它使用了有一个隐藏层的前馈网络来计算注意力的分配:
其中 v_a 和 W_a 是所学到的注意力参数,[* ; *] 代表了级联。类似地,我们同样能使用矩阵 W_1 和 W_2 分别为 h_i 和 s_j 学习单独的转换,这一过程可以表示为:
乘法注意力(Multiplicative attention)(Luong et al., 2015) [16] 通过计算以下函数而简化了注意力操作:
加性注意力和乘法注意力在复杂度上是相似的,但是乘法注意力在实践中往往要更快速、具有更高效的存储,因为它可以使用矩阵操作更高效地实现。两个变体在低维度 d_h 解码器状态中性能相似,但加性注意力机制在更高的维度上性能更优。缓解这一现象的方法是将 f_att(h_i,s_j) 缩放到 d_h^(-1/2) 倍 (Vaswani et al., 2017) [17]。
注意力机制不仅能用来处理编码器或前面的隐藏层,它同样还能用来获得其他特征的分布,例如阅读理解任务中作为文本的词嵌入 (Kadlec et al., 2017) [37]。然而,注意力机制并不直接适用于分类任务,因为这些任务并不需要情感分析(sentiment analysis)等额外的信息。在这些模型中,通常我们使用 LSTM 的最终隐藏状态或像最大池化和平均池化那样的聚合函数来表征句子。
自注意力机制(Self-attention)通常也不会使用其他额外的信息,但是它能使用自注意力关注本身进而从句子中抽取相关信息 (Lin et al., 2017) [18]。自注意力又称作内部注意力,它在很多任务上都有十分出色的表现,比如阅读理解 (Cheng et al., 2016) [38]、文本继承 (textual entailment/Parikh et al., 2016) [39]、自动文本摘要 (Paulus et al., 2017) [40]。
我们能计算每个隐藏状态 h_i 的非归一化分配值从而简化加性注意力:
在矩阵形式中,对于隐藏状态 H=h_1,…,h_n,我们能通过以下形式计算注意力向量 a 和最后的句子表征 c:
我们不仅可以抽取一个向量,同时还能通过将 v_a 替代为 V_a 矩阵而执行一些其他注意力特征,这可以令我们抽取注意力矩阵 A:
在实践中,我们可以执行以下的正交约束而惩罚计算冗余,并以 Frobenius 范数平方的形式鼓励注意力向量的多样性:
Vaswani et al. (2017) 同样使用了类似的多头注意力(multi-head attention)。
最后,关键值注意力 (Daniluk et al., 2017) [19] 是最近出现的注意力变体机制,它将形式和函数分开,从而为注意力计算保持分离的向量。它同样在多种文本建模任务 (Liu & Lapata, 2017) [41] 中发挥了很大的作用。具体来说,关键值注意力将每一个隐藏向量 h_i 分离为一个键值 k_i 和一个向量 v_i:[k_i;v_i]=h_i。键值使用加性注意力来计算注意力分布 a_i:
其中 L 为注意力窗体的长度,I 为所有单元为 1 的向量。然后使用注意力分布值可以求得环境表征 c_i:
其中环境向量 c_i 将联合现阶段的状态值 v_i 进行预测。
最优化
最优化算法和方案通常是模型的一部分,并且常常被视为黑箱操作。有时算法轻微的变化,如在 Adam 算法中减少超参数β2 的值 (Dozat & Manning, 2017) [50] 将会造成优化行为的巨大改变。
Adam 方法 (Kingma & Ba, 2015) [21] 是使用最广泛、最常见的优化算法,它通常也作为 NLP 研究员的优化器。Adam 方法要明显地比 vanilla 随机梯度下降更优秀,并且其收敛速度也十分迅速。但近来有研究表明通过精调并带动量的梯度下降方法要比 Adam 方法更优秀 (Zhang et al., 2017) [42]。
从优化方案来说,因为 Adam 方法会适应性地为每一个参数调整学习速率 (Ruder, 2016) [22],所以我们可以使用 Adam 方法精确地执行 SGD 风格的退火处理。特别是我们可以通过重启(restart)执行学习速率退火处理:即设定一个学习速率并训练模型,直到模型收敛。然后,我们可以平分学习速率,并通过加载前面最好的模型而重启优化过程。在 Adam 中,这会令优化器忘记预训练参数的学习速率,并且重新开始。Denkowski & Neubig (2017) [23] 表示带有两个重启和学习速率退火处理的 Adam 算法要比带有退火处理的 SGD 算法更加优秀。
集成方法
通过平均多个模型的预测将多个模型组合为一个集成模型被证明是提高模型性能的有效策略。尽管在测试时使用集成做预测十分昂贵,最近提取方面的一些进展允许我们把昂贵的集成压缩成更小的模型 (Hinton et al., 2015; Kuncoro et al., 2016; Kim & Rush, 2016) [24, 25, 26]。
如果评估模型的多样性增加 (Denkowski & Neubig, 2017),集成是确保结果可靠的重要方式。尽管集成一个模型的不同检查点被证明很有效 (Jean et al., 2015; Sennrich et al., 2016) [51, 52],但这种方法牺牲了模型的多样性。周期学习率有助于缓解这一影响 (Huang et al., 2017) [53]。但是,如果资源可用,我们更喜欢集成多个独立训练的模型以最大化模型多样性。
超参数优化
我们可以简单地调整模型超参数从而在基线上获得显著提升,而不仅仅只是使用预定义或现有的超参数来训练模型。最近 Bayesian Optimization 的新进展可以用于在神经网络黑箱训练中优化超参数 (Snoek et al., 2012) [56],这种方法要比广泛使用的网格搜索高效地多。LSTM 的自动超参数调整已经在语言建模产生了最佳的性能,远远胜过其他更复杂的模型 (Melis et al., 2017)。
LSTM 技巧
学习初始状态:我们通常初始化 LSTM 状态为零向量。但我们可以将初始状态看作参数进行优化,而不是人为地调整来提升性能。这一方法十分受 Hinton 的推荐。关于这一技巧的 TensorFlow 实现,详见:https://r2rt.com/non-zero-initial-states-for-recurrent-neural-networks.html
尝试输入和输出嵌入:适合于输入和输出嵌入在 LSTM 模型中占了绝大多数参数数量的情况。如果 LSTM 在语言建模中预测词汇,输入和输出参数可以共享 (Inan et al., 2016; Press & Wolf, 2017) [54, 55]。这一技巧在不允许学习大规模参数的小数据集中十分有用。
梯度范数截断(Gradient norm clipping):降低梯度消失风险的一个方法是截断其最大值 (Mikolov, 2012) [57]。但是这并没有持续提升性能(Reimers & Gurevych, 2017)。与其独立地截断每个梯度,截断梯度的全局范数 (Pascanu et al., 2013) 反而会带来更加显著的提升(这里有一个 Tensorflow 实现:https://stackoverflow.com/questions/36498127/how-to-effectively-apply-gradient-clipping-in-tensor-flow)。
下投影(Down-projection):为了进一步减少输出参数的数量,LSTM 的隐态可以被投影到更小的尺寸。这对带有大量输出的任务尤其有用,比如语言建模(Melis et al., 2017)。
下面,我们要介绍特定任务的最佳实践。大部分模型在执行特定类型的单项任务时表现很好,部分模型可以应用于其他任务,不过在应用之前需要验证其性能。我们还将讨论以下任务:分类、序列标注、自然语言生成(NLG)和自然语言生成的特殊案例神经机器翻译。
分类
由于卷积操作更加高效,近期 CNN 应用范围扩大,成为处理 NLP 中分类任务的通用方法。下面的最佳实践和 CNN 相关,可选择多个最优超参数(optimal hyperparameter)。
序列标注
序列标注在 NLP 中非常普遍。现有的很多最佳实践都是模型架构的一个环节,下列指南主要讨论模型输出和预测阶段。
标注策略(Tagging scheme): 对于将标签分配到文本分隔的任务,不同的标注策略均可采用。比如:BIO,分隔的第一个符号处标注 B-tag,其他符号处标注 I-tag,分隔外的符号标注 O-tag;IOB,和 BIO 相似,不同之处在于如果前面的符号属于相同的类别,但不属于同一个分隔,则使用 B-tag 来标注;IOBES,还需要在单个符号实体处标注 S-tag,每个分隔的最后一个符号处标注 E-tag。IOBES 和 BIO 的性能相似。
条件随机场输出层(CRF output layer): 如果输出之间存在依赖,如在命名实体识别(named entity recognition)中,可以用线性链条件随机场(linear-chain conditional random field)代替最后的 softmax 层。经证实,这种方法对于要求对约束进行建模的任务有持续改善的效果(Huang et al., 2015; Max & Hovy, 2016; Lample et al., 2016)[60, 61, 62]。
约束解码(Constrained decoding): 除了条件随机场输出层以外,还可用约束解码来排除错误排序,即不产生有效的 BIO 过渡(BIO transition)(He et al., 2017)。约束解码的优势在于可以执行随意约束(arbitrary constraint),如特定任务约束或句法约束。
自然语言生成
多数现有最佳实践可用于自然语言生成(NLG)。事实上,目前出现的很多技巧都植根于语言建模方面的进步,语言建模是最典型的 NLP 任务。
建模覆盖率(Modelling coverage): 重复是 NLG 任务的一大难题,因为当前的模型无法很好地记忆已经产生的输出结果。在模型中直接设置建模覆盖率是解决该问题的好方法。如果提前知道哪些实体应该出现在输出结果中(就像菜谱中的调料),则需要使用一个检查表(checklist)(Kiddon et al., 2016)[63]。如果使用注意力机制,我们可以追踪覆盖率向量 c_i,它是过去的时间步上注意力分布 a_t 的总和(Tu et al., 2016; See et al., 2017)[64, 65]:
该向量可以捕捉我们在源语言所有单词上使用的注意力。现在我们可以在覆盖率向量上设置加性注意力(additive attention),以鼓励模型不重复关注同样的单词:
此外,我们可以添加辅助损失(auxiliary loss),该损失可以捕捉我们想关注的特定任务的注意力行为:我们希望神经机器翻译可以做到一对一对齐(one-to-one alignment);如果最后的覆盖率向量多于或少于每一个指数上的覆盖率向量,那么模型将被罚分(Tu et al., 2016)。总之,如果模型重复处理同样的位置,我们就会惩罚该模型(See et al., 2017)。
神经机器翻译
我确定这份清单上一定有遗漏的最佳实践。相似地,也有很多我不熟悉的任务,如解析、信息提取,我没办法做出推荐。我希望本文对开始学习新的 NLP 任务有所帮助。即使你对这里列出的大部分内容都很熟悉,我也希望你能够学到一些新的东西或者重新掌握有用的技巧。
本文来源于微信公众号:机器之心(almosthuman2014),如需转载,请私信联系,十分感谢。
大家回答的都挺不错了,只好来强答。
一、独立实现一个小型的自然语言处理项目。
要找一个合适的的自然语言处理相关的开源项目。这个项目可以是与自己工作相关的,也可以是自己感兴趣的。项目不要太大,以小型的算法模块为佳,这样便于独立实现。像文本领域的文本分类、分词等项目就是比较合适的项目。 运行程序得到项目所声称的结果。然后看懂程序,这期间一般需要阅读程序实现所参考的文献。最后,自己尝试独立实现该算法,得到与示例程序相同的结果。再进一步的,可以调试参数,了解各参数对效果的影响,看是否能得到性能更好的参数组合。
这一阶段主要是学习快速上手一个项目,从而对自然语言处理的项目有比较感性的认识——大体了解自然语言处理算法的原理、实现流程等。
当我们对自然语言处理项目有了一定的认识之后,接下来就要深入进去。任何自然语言处理应用都包含算法和所要解决的问题两方面,要想深入进去就需要从这两方面进行着手。
二、对问题进行深入认识
对问题的深入认识通常来源于两个方面,一是阅读当前领域的文献,尤其是综述性的文献,理解当前领域所面临的主要问题、已有的解决方案有哪些、有待解决的问题有哪些。这里值得一提的是,博士生论文的相关文献介绍部分通常会对本问题做比较详细的介绍,也是比较好的综述类材料。
除了从文献中获取对问题的认识外,另一种对问题进行深入认识的直观方法就是对算法得出的结果进行bad case分析,总结提炼出一些共性的问题。对bad case进行分析还有一个好处,可以帮助我们了解哪些问题是主要问题,哪些问题是次要问题,从而可以帮助我们建立问题优先级。如果有具体任务的真实数据,一定要在真实数据上进行测试。这是因为,即使是相同的算法,在不同的数据集上,所得到的结果也可能相差很大。
三、对算法进行深入理解
除了具体的问题分析,对算法的理解是学习人工智能必须要过的关。经过这么多年的发展,机器学习、模式识别的算法已经多如牛毛。幸运的是,这方面已经有不少好的书籍可供参考。这里推荐华为李航的蓝宝书《统计学习方法》和周志华的西瓜书《机器学习》,这两本都是国内顶级的机器学习专家撰写的书籍,思路清晰,行文流畅,样例丰富。
如果觉得教科书稍感乏味,那我推荐吴军的《数学之美》,这是一本入门级的科普读物,作者以生动有趣的方式,深入浅出的讲解了很多人工智能领域的算法,相信你一定会有兴趣。
国外的书籍《Pattern Recognition and Machine Learning》主要从概率的角度解释机器学习的各种算法,也是不可多得的入门教材。如果要了解最新的深度学习的相关算法,可以阅读被誉为深度学习三架马车之一Bengio所著的《Deep Learning》。 在学习教材时,对于应用工程师来说,重要的是理解算法的原理,从而掌握什么数据情况下适合什么样的数据,以及参数的意义是什么。
四、深入到领域前沿
自然语言处理领域一直处在快速的发展变化当中,不管是综述类文章还是书籍,都不能反映当前领域的最新进展。如果要进一步的了解领域前沿,那就需要关注国际顶级会议上的最新论文了。下面是各个领域的一些顶级会议。这里值得一提的是,和其他人工智能领域类似,自然语言处理领域最主要的学术交流方式就会议论文,这和其他领域比如数学、化学、物理等传统领域都不太一样,这些领域通常都以期刊论文作为最主要的交流方式。 但是期刊论文审稿周期太长,好的期刊,通常都要两三年的时间才能发表,这完全满足不了日新月异的人工智能领域的发展需求,因此,大家都会倾向于在审稿周期更短的会议上尽快发表自己的论文。 这里列举了国际和国内文本领域的一些会议,以及官网,大家可以自行查看。
国际上的文本领域会议:
ACL:http://acl2017.org/ 加拿大温哥华 7.30-8.4
EMNLP:http://emnlp2017.net/ 丹麦哥本哈根 9.7-9.11
COLING:没找到2017年的
国内会议:
CCKS http://www.ccks2017.com/index.php/att/ 成都 8月26-8月29
SMP http://www.cips-smp.org/smp2017/ 北京 9.14-9.17
CCL http://www.cips-cl.org:8080/CCL2017/home.html 南京 10.13-10.15
NLPCC http://tcci.ccf.org.cn/conference/2017/ 大连 11.8-11.12
NCMMSC http://www.ncmmsc2017.org/index.html 连云港 11.11 - 11.13
像paperweekly,机器学习研究会,深度学习大讲堂等微信公众号,也经常会探讨一些自然语言处理的最新论文,是不错的中文资料。
五、当然,工欲善其事,必先利其器。我们要做好自然语言处理的项目,还需要熟练掌握至少一门工具。当前,深度学习相关的工具已经比较多了,比如:tensorflow、mxnet、caffe、theano、cntk等。这里向大家推荐tensorflow,自从google推出之后,tensorflow几乎成为最流行的深度学习工具。究其原因,除了google的大力宣传之外,tensorflow秉承了google开源项目的一贯风格,社区力量比较活跃,目前github上有相当多数量的以tensorflow为工具的项目,这对于开发者来说是相当大的资源。
以上就是对于没有自然语言处理项目经验的人来说,如何学习自然语言处理的一些经验,希望对大家能有所帮助。
说说自己的历程吧。
我是一名非科班的自然语言,机器学习,数据挖掘关注者。
因工作关系,5年前需要做与自然语言处理的项目。当时的项目老大先是扔给我一本书《统计自然语言处理》,直接给我看蒙了。不能说一点都不懂,但是看的云里雾里,不知道get几层。
但看这本书的过程中,我狂搜了些自然语言处理的课件,有北大的,中科院的,都写的很好,从语言模型开始。从分词,标注,语法树,语意等等。也大体知道自然语言处理,分词法,语法,语义。然后是各种应用,信息检索,机器翻译等自然语言经典应用问题。
断断续续做了些小项目,基于语言模型的拼音输入法,仿照sun'pinyin写的,他们的blog写的很详细,从模型建模,到平滑处理,很详细,我也用python实现了一遍,当时这个输入法配合上一个简单的ui还在部门内部推广了,搞了个基于云的拼音输入法,获得个小奖品,很是洋洋得意。这个过程中,我看着sunpinyin的blog, 回过头又去看课件,去了解很细节的问题,如拉普拉斯平滑,回退平滑的细节等,收获很多。
后来老大告诉我,看自然语言问题时,可以找博士论文先看,因为博士论文一般都会来龙去脉讲的非常详细,看完一遍之后基本上这个问题就了解的差不多,然后就是follow业界的进度,那就是关注各种会议和期考,可自行百度和谷歌。
搞好这个拼音输入法,进入实际项目,做一套中文自然语言的基础处理引擎,好在不是让我一个人来,公司开始找大学合作,我做企业项目负责跟进的,大学负责具体算法,我跟着自己调查分词标注算法,了解了有基于词典的,语言模型的,hmm,crf的,那个crf的,我始终搞不大明白,后来先了解了hmm的vertbe算法,em算法,大学的博士给我讲了一遍crf,终于豁然开朗。还把解码过程写到了http://52nlp.cn上,关注的人还可以。从那以后我感觉我就真入门了。在来一个什么问题,我基本上也有套路来学习和研究了。
在知乎上搜索相关问题,有人推荐《数学之美》,之前粗略看过一次,这次想重新看一下并且做个读书笔记。下面是关于自然语言理解方面的一些读书笔记和自己的思考。
一. 自然语言处理历史:
自然语言处理最初发展的20多年里,相关科学家都极力通过电脑模拟人脑,试图用这种方式来处理人类语言,但是这种方式被证明是行不通的,成功几乎为零。NLP发展的第二阶段是70年代之后,科学家们终于找到了基于数学模型和统计的方法。
第一阶段的时候,学术界对人工智能和自然语言理解的普遍认识是:要让机器完成翻译或者语音识别等等,必须先让计算机理解自然语言,就像人类一样去理解这些语言,这显然是做不到的。即便在可预见的将来,这也必定是一件不太现实的事情。
第二阶段,比如机器在翻译的过程中,并没有理解这句话的意思,它只是做了一种统计上的归纳而已。机器依旧是机器。
基于规则的分析方法,需要将现有的句法系统按照句子成分划分成一个一个单位,而这会随着句子的复杂多样化句子的划分复杂度几何级上升,并且没有上下文的帮助句子词义的多样性同样限制了规则分析方法的发展。比如The pen is in the box.和The box is in the pen.按照规则来分析该句子根本不可能获得语义,必须依靠常识来得到该句子的真正含义,但是基于统计的方法可以依靠上下文对该语义做一个合理的预估。基于规则的方法完全从该单独的句子着手,根本不管上下文。但是这样也还是没有让基于统计的方法快速发展起来,主要原因在于基于统计的方法需要大量的训练数据,这在当时来说是达不到的。
二.统计语言模型:
自然语言逐渐演变成为一种上下文相关的信息表达和传递的方式,计算机就用统计语言模型去表征自然语言这种上下文相关的特性。
一个句子S=(w1,w2,w3…wn)由n个词组成,我们要弄清该句子是否是一个合乎实际的句子,可以计算该句子在现实情况下的概率,最最简单的想法是把人类所有句子统计一遍,然后再计算这个句子的概率,但是这显然是行不通的。一个可行的方法是把这个句子分成n个词(对于中文来说,这就是中文分词研究的东西),然后再计算这n个词按照该顺序组成这个句子的概率大小。可以表示如下:
这个概率计算的复杂度会随着n的增大指数上升。因此引入齐次马尔科夫性假设,即假设一个词的出现只与其前面一个词的出现有关,而与更前面的词无关,这样概率计算可以简化为如下:
这样的模型称为二元模型,用更一般的表示方法为:
但是二元模型显然太过于简单草率,所以有了高阶模型的出现,n阶模型表示一个词的出现与其前面的n-1个词有关。表示为:
一般由于计算复杂度的问题,大多数情况下用3阶模型,谷歌的用到了4阶模型。
接下来的问题是,由于用来训练模型的语料库(corpus)太少而出现的零概率情况如何处理?
这里有一个古德-图灵公式,基本思路是当词语对出现次数大于某一阈值时,利用条件概率计算出来的频率根据大数定理就当做概率(因为只有大于某一阈值时我们才有充分理由相信大数定理的条件被满足),当出现频数小于该阈值但又大于零的频率,则相应的下调该频率值,因为这个时候大数定律成立的条件是没有被满足的,并且出现次数越少,下调频率越多,最后把这个下调的频率当做所求的概率,最后对于零出现的情况,则将这些下调的总和平均分配给零出现的次数,以保证概率总和为1。
三.中文分词问题:
汉语和英语有分割每个词的空格不一样,汉语中所有的词都没有明显分界,所以必须解决中文分词问题,最简单的方法是查字典,基本思想是首先有一个中文词语的字典库,将一个句子从左扫描到末尾,遇到字典里有的词之后就保存,规则是尽量找最长的词,比如中国航天城,中是一个单字词,先保存,继续往下扫描,遇到国字,中和国可以组成一个更长的词,因此最后保存中国这个词,后面的航天城类似。查字典的处理方法简单,但不够准确。因为很多情况下并不是最长词的分词规则就是最适合的。
利用统计语言模型来处理中文分词的第一人是郭进博士,基本思想是:假设一个句子有很多种分词方法,则分别计算每种分词方法对应的该句子概率。即:
也就是说,利用每种分词方法都可以计算该句子的概率。然后取最大概率对应的分词方法。其本质上是一种极大似然估计。
四.关于郭进博士分词方法的一些思考:(求指正)
在这里我添加一些关于极大似然估计和极大后验概率,以及频率学派和贝叶斯学派这方面自己的思考,因为每次好不容易弄清楚了二者联系和区别之后,过段时间又混淆了。
在这里,极大似然估计和极大后验概率都是如下的应用场景:在给定观测数据X的情况下,我们要求解产生该观测数据X背后的参数,并且我们求得的参数并不是非此即彼的,也就是有一个概率分布来表征每一个可能的参数。当然, 一般情况下我们都取概率最大的那个参数,即.
极大似然估计和极大后验概率的关键区别就在第三个等号这里,这也是历史上著名的频率学派和贝叶斯学派争论的地方,焦点就在于是否是一个常数,假如是常量的话,那么第三个等号自然就成立了,这样对于参数的估计就变成了极大似然估计(Maximum Likelihood),假如不为常量,那么第三个等号就不能成立,对于参数的估计只能停留在倒数第二个式子这里,这便是极大后验概率(Maximum A Posteriori)。
在频率学派的世界里, 参数是常量只是未知。而在贝叶斯学派的世界里,参数则不是常量。双方曾经对这两种观点进行了激烈的争论,这是后话不表。
回到我们这里的问题,给定一个句子,我们要求解其分词组合,实际上给定的这个句子就是我们的观测值,而分词组合便是待求解的参数,而上文说到的清华大学博士郭进所用到的方法便是:先求得每个分词组合下对应的句子概率,把最大概率对应的分词组合作为最终答案。很明显存在如下这个公式:
所以我把这个归为本质上的极大似然估计。
中文分词并不是只能应用在中文领域,而是根据特定场合同样可以应用在字母语言的领域,比如英语词组的分割,手写句子的识别(因为手写英文句子的空格不那么明显)等等。
中文分词已经发展到相当高的阶段,目前只是做一些完善和添加新词的工作,但是也存在一些工程实现方面的取舍问题,主要有两点:
1.分词的一致性,对于同样一个句子,每个人的分词方法不一样,不能说哪种分词方法更优,只能说在具体应用场景里存在一种最优的分词方法;
2.分词的颗粒度问题,和一致性问题一样,不同的应用场景适合用不同的颗粒度,分词器在设计的时候一般会全面兼顾颗粒度小和颗粒度大的情况,在具体问题的时候再进行相应的取舍。
个人觉得可以先完整过一遍NLP的过程,自己经历过一遍,就可以更好了解怎么操作了。在经历的同时,也可以按需补充自己的知识。
放一个Github,从语料库,特征选取,到算法对比,评价指标,还附带参考论文,可以试着跑一跑
GitHub - ZixuanKe/Ch2r_ood_understanding推荐一个博客52NLP和CS224D教程