自然语言处理 订阅
自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门融语言学、计算机科学、数学于一体的科学。因此,这一领域的研究将涉及自然语言,即人们日常使用的语言,所以它与语言学的研究有着密切的联系,但又有重要的区别。自然语言处理并不是一般地研究自然语言,而在于研制能有效地实现自然语言通信的计算机系统,特别是其中的软件系统。因而它是计算机科学的一部分。自然语言处理(NLP)是计算机科学,人工智能,语言学关注计算机和人类(自然)语言之间的相互作用的领域。 展开全文
自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门融语言学、计算机科学、数学于一体的科学。因此,这一领域的研究将涉及自然语言,即人们日常使用的语言,所以它与语言学的研究有着密切的联系,但又有重要的区别。自然语言处理并不是一般地研究自然语言,而在于研制能有效地实现自然语言通信的计算机系统,特别是其中的软件系统。因而它是计算机科学的一部分。自然语言处理(NLP)是计算机科学,人工智能,语言学关注计算机和人类(自然)语言之间的相互作用的领域。
信息
缩    写
NLP
适用领域
计算机、人工智能
中文名
自然语言处理
外文名
natural language processing
自然语言处理详细介绍
语言是人类区别其他动物的本质特性。在所有生物中,只有人类才具有语言能力。人类的多种智能都与语言有着密切的关系。人类的逻辑思维以语言为形式,人类的绝大部分知识也是以语言文字的形式记载和流传下来的。因而,它也是人工智能的一个重要,甚至核心部分。用自然语言与计算机进行通信,这是人们长期以来所追求的。因为它既有明显的实际意义,同时也有重要的理论意义:人们可以用自己最习惯的语言来使用计算机,而无需再花大量的时间和精力去学习不很自然和习惯的各种计算机语言;人们也可通过它进一步了解人类的语言能力和智能的机制。实现人机间自然语言通信意味着要使计算机既能理解自然语言文本的意义,也能以自然语言文本来表达给定的意图、思想等。前者称为自然语言理解,后者称为自然语言生成。因此,自然语言处理大体包括了自然语言理解和自然语言生成两个部分。历史上对自然语言理解研究得较多,而对自然语言生成研究得较少。但这种状况已有所改变。无论实现自然语言理解,还是自然语言生成,都远不如人们原来想象的那么简单,而是十分困难的。从现有的理论和技术现状看,通用的、高质量的自然语言处理系统,仍然是较长期的努力目标,但是针对一定应用,具有相当自然语言处理能力的实用系统已经出现,有些已商品化,甚至开始产业化。典型的例子有:多语种数据库和专家系统的自然语言接口、各种机器翻译系统、全文信息检索系统、自动文摘系统等。自然语言处理,即实现人机间自然语言通信,或实现自然语言理解和自然语言生成是十分困难的。造成困难的根本原因是自然语言文本和对话的各个层次上广泛存在的各种各样的歧义性或多义性(ambiguity)。一个中文文本从形式上看是由汉字(包括标点符号等)组成的一个字符串。由字可组成词,由词可组成词组,由词组可组成句子,进而由一些句子组成段、节、章、篇。无论在上述的各种层次:字(符)、词、词组、句子、段,……还是在下一层次向上一层次转变中都存在着歧义和多义现象,即形式上一样的一段字符串,在不同的场景或不同的语境下,可以理解成不同的词串、词组串等,并有不同的意义。一般情况下,它们中的大多数都是可以根据相应的语境和场景的规定而得到解决的。也就是说,从总体上说,并不存在歧义。这也就是我们平时并不感到自然语言歧义,和能用自然语言进行正确交流的原因。但是一方面,我们也看到,为了消解歧义,是需要极其大量的知识和进行推理的。如何将这些知识较完整地加以收集和整理出来;又如何找到合适的形式,将它们存入计算机系统中去;以及如何有效地利用它们来消除歧义,都是工作量极大且十分困难的工作。这不是少数人短时期内可以完成的,还有待长期的、系统的工作。以上说的是,一个中文文本或一个汉字(含标点符号等)串可能有多个含义。它是自然语言理解中的主要困难和障碍。反过来,一个相同或相近的意义同样可以用多个中文文本或多个汉字串来表示。因此,自然语言的形式(字符串)与其意义之间是一种多对多的关系。其实这也正是自然语言的魅力所在。但从计算机处理的角度看,我们必须消除歧义,而且有人认为它正是自然语言理解中的中心问题,即要把带有潜在歧义的自然语言输入转换成某种无歧义的计算机内部表示。歧义现象的广泛存在使得消除它们需要大量的知识和推理,这就给基于语言学的方法、基于知识的方法带来了巨大的困难,因而以这些方法为主流的自然语言处理研究几十年来一方面在理论和方法方面取得了很多成就,但在能处理大规模真实文本的系统研制方面,成绩并不显著。研制的一些系统大多数是小规模的、研究性的演示系统。目前存在的问题有两个方面:一方面,迄今为止的语法都限于分析一个孤立的句子,上下文关系和谈话环境对本句的约束和影响还缺乏系统的研究,因此分析歧义、词语省略、代词所指、同一句话在不同场合或由不同的人说出来所具有的不同含义等问题,尚无明确规律可循,需要加强语用学的研究才能逐步解决。另一方面,人理解一个句子不是单凭语法,还运用了大量的有关知识,包括生活知识和专门知识,这些知识无法全部贮存在计算机里。因此一个书面理解系统只能建立在有限的词汇、句型和特定的主题范围内;计算机的贮存量和运转速度大大提高之后,才有可能适当扩大范围.以上存在的问题成为自然语言理解在机器翻译应用中的主要难题,这也就是当今机器翻译系统的译文质量离理想目标仍相差甚远的原因之一;而译文质量是机译系统成败的关键。中国数学家、语言学家周海中教授曾在经典论文《机器翻译五十年》中指出:要提高机译的质量,首先要解决的是语言本身问题而不是程序设计问题;单靠若干程序来做机译系统,肯定是无法提高机译质量的;另外在人类尚未明了大脑是如何进行语言的模糊识别和逻辑判断的情况下,机译要想达到“信、达、雅”的程度是不可能的。
收起全文
精华内容
下载资源
问答
  • 自然语言处理

    2019-10-24 09:28:01
    NLP学习记录 目前研一新生在读,研究方向是自然语言处理,主要处理的是中医文本。刚开始感觉很迷茫不知道该怎么办,想要用博客来记录下我的学习过程,也欢迎更多的同学和大佬们能够给我提出批评和指证。 ...

    NLP学习记录 目前研一新生在读,研究方向是自然语言处理,主要处理的是中医文本。刚开始感觉很迷茫不知道该怎么办,想要用博客来记录下我的学习过程,也欢迎更多的同学和大佬们能够给我提出批评和指证。

    展开全文
  • 1、自然语言处理圣经---《自然语言处理综论》2、视频课程《深度学习与自然语言处理-2018》3、Natural Language Processing (NLP)4、吴恩达经典课程 - Machine Learning —Coursera5、斯坦福 Natural Language ...

    15套免费的NLP课程及经典教材分享!

    1、自然语言处理圣经—《自然语言处理综论》

    在这里插入图片描述
    Dan Jurafsky and James Martin
    https://web.stanford.edu/~jurafsky/slp3/

    2、视频课程《深度学习与自然语言处理-2018》

    在这里插入图片描述
    Richard Socher (Stanford University)
    https://www.youtube.com/playlist?list=PL3FW7Lu3i5Jsnh1rnUwq_TcylNr7EkRe6

    3、Natural Language Processing (NLP)

    在这里插入图片描述
    Microsoft

    https://www.edx.org/course/natural-language-processing-3

    4、吴恩达经典课程 - Machine Learning —Coursera

    在这里插入图片描述
    https://www.coursera.org/learn/machine-learning/home/welcome

    5、斯坦福 Natural Language Processing with Deep Learning

    在这里插入图片描述
    视频:https://www.youtube.com/playlist?list=PL3FW7Lu3i5Jsnh1rnUwq_TcylNr7EkRe6
    课程资源:http://web.stanford.edu/class/cs224n/

    6、Coursea免费课程 - Sequence Models for Time Series and Natural Language Processing

    在这里插入图片描述
    https://www.coursera.org/learn/sequence-models-tensorflow-gcp?ranMID=40328&ranEAID=SAyYsTvLiGQ&ranSiteID=SAyYsTvLiGQ-ACNikbtJvh2d5Evme5yZQA&siteID=SAyYsTvLiGQ-ACNikbtJvh2d5Evme5yZQA&utm_content=10&utm_medium=partners&utm_source=linkshare&utm_campaign=SAyYsTvLiGQ

    7、免费课程《深度自然语言处理》- Hilary Term 2017 at the University of Oxford

    在这里插入图片描述
    http://www.cs.ox.ac.uk/teaching/courses/2016-2017/dl/

    8、免费课程《基于Python的自然语言处理基础课程》- Datacamp

    在这里插入图片描述
    https://www.datacamp.com/courses/natural-language-processing-fundamentals-in-python

    9、 Coursera免费课程《自然语言处理》- Higher School of Economics

    在这里插入图片描述
    https://www.coursera.org/learn/language-processing?

    10、 Coursera免费课程《不需要写代码如何搭建Chatbot》- IBM

    在这里插入图片描述
    https://www.coursera.org/learn/how-to-build-your-own-chatbot-without-coding

    11、 CS 388 -《自然语言处理》- University of Texas

    在这里插入图片描述
    https://www.cs.utexas.edu/~mooney/cs388/

    12、 书籍《基于Python的自然语言处理》

    在这里插入图片描述
    http://www.nltk.org/book/

    13、 视频课程自然语言处理 - University of Washington

    在这里插入图片描述
    https://courses.cs.washington.edu/courses/csep517/17sp/

    14、Dan Jurafsky & Chris Manning: Natural Language Processing

    在这里插入图片描述
    视频:https://www.youtube.com/playlist?list=PL8FFE3F391203C98C

    15、 NATURAL LANGUAGE PROCESSING - Carnegie Mellon University

    在这里插入图片描述
    http://demo.clab.cs.cmu.edu/NLP/

    展开全文
  • 自然语言处理NLP中的N-gram模型

    万次阅读 多人点赞 2018-05-07 21:00:03
    自然语言处理NLP中的N-gram模型 自然语言处理NLP中的N-gram模型 Naive Bayes N-gram N-gram简介 N-gram中的概率计算 N-gram的用途 用途一:词性标注 用途二:垃圾短信分类 用途三:分词器 用途四:机器翻译和...

    自然语言处理NLP中的N-gram模型

    Naive Bayes

      首先我们复习一下一个非常基本的模型,朴素贝叶斯(Naive Bayes)。朴素贝叶斯的关键组成是贝叶斯公式与条件独立性假设。为了方便说明,我们举一个垃圾短信分类的例子。

    **"在家日赚百万,惊人秘密..."**

      上面这句话抄自我手机中的一条垃圾短信,自从去过澳门,手机就时不时收到这样的关于赌场的短信。朴素贝叶斯模型就是要衡量这句话属于垃圾短信敏感句子的概率,我们以前半句为例:
    p("")p()p("")p(垃圾短信|"在家日赚百万")\propto p(垃圾邮件)p("在家日赚百万"|垃圾短信)
    由条件独立性假设:
    p(""J)=p("","","","","",""J)=p(""J)p(""J)p(""J)p(""J)p(""J)p(""J)p("在家日赚百万"|J)=p("在","家","日","赚","百","万"|J)\\ =p("在"|J)p("家"|J)p("日"|J)p("赚"|J)p("百"|J)p("万"|J)
      上面每一项条件概率都可以通过在训练数据的垃圾短信中统计每个字出现的次数得到,然而这里有一个问题,朴素贝叶斯将句子处理为一个**词袋模型(Bag-of-Words, BoW)**,以至于不考虑每个单词的顺序。这一点在中文里可能没有问题,因为有时候即使把顺序捣乱,我们还是能看懂这句话在说什么,但有时候不行,例如:

    **我烤面筋 = 面筋烤我 ?**

      那么有没有模型是考虑句子中单词之间的顺序的呢?有,N-gram就是。


    N-gram

    N-gram简介

      在介绍N-gram之前,让我们回想一下**“联想”**的过程是怎样发生的。如果你是一个玩LOL的人,那么当我说“正方形打野”、“你是真的皮”,“你皮任你皮”这些词或词组时,你应该能想到的下一个词可能是“大司马”,而不是“五五开”。如果你不是LOL玩家,没关系,当我说“上火”、“金罐”这两个词,你能想到的下一个词应该更可能“加多宝”,而不是“可口可乐”。
      N-gram正是基于这样的想法,它的第一个特点是某个词的出现依赖于其他若干个词,第二个特点是我们获得的信息越多,预测越准确。我想说,我们每个人的大脑中都有一个N-gram模型,而且是在不断完善和训练的。我们的见识与经历,都在丰富着我们的阅历,增强着我们的联想能力。

      N-gram模型是一种语言模型(Language Model,LM),语言模型是一个基于概率的判别模型,它的输入是一句话(单词的顺序序列),输出是这句话的概率,即这些单词的联合概率(joint probability)。
    这里写图片描述

      N-gram本身也指一个由NN个单词组成的集合,各单词具有先后顺序,且不要求单词之间互不相同。常用的有 Bi-gram (N=2N=2) 和 Tri-gram (N=3N=3),一般已经够用了。例如在上面这句话里,我可以分解的 Bi-gram 和 Tri-gram :

    Bi-gram : {I, love}, {love, deep}, {love, deep}, {deep, learning}
    Tri-gram : {I, love, deep}, {love, deep, learning}


    N-gram中的概率计算

      假设我们有一个由nn个词组成的句子S=(w1,w2,,wn)S=(w_1,w_2,\cdots,w_n),如何衡量它的概率呢?让我们假设,每一个单词wiw_i都要依赖于从第一个单词w1w_1到它之前一个单词wi1w_{i-1}的影响:
    p(S)=p(w1w2wn)=p(w1)p(w2w1)p(wnwn1w2w1)p(S)=p(w_1w_2\cdots w_n)=p(w_1)p(w_2|w_1)\cdots p(w_n|w_{n-1}\cdots w_2w_1)
    是不是很简单?是的,不过这个衡量方法有两个缺陷:

    • 参数空间过大,概率 p(wnwn1w2w1)p(w_n|w_{n-1}\cdots w_2w_1) 的参数有 O(n)O(n) 个。
    • 数据稀疏严重,词同时出现的情况可能没有,组合阶数高时尤其明显。

      为了解决第一个问题,我们引入马尔科夫假设(Markov Assumption)一个词的出现仅与它之前的若干个词有关
    p(w1wn)=p(wiwi1w1)p(wiwi1wiN+1)p(w_1\cdots w_n)=\prod p(w_i|w_{i-1}\cdots w_1)\approx \prod p(w_i|w_{i-1}\cdots w_{i-N+1})

    • 如果一个词的出现仅依赖于它前面出现的一个词,那么我们就称之为 Bi-gram
      p(S)=p(w1w2wn)=p(w1)p(w2w1)p(wnwn1)p(S)=p(w_1w_2\cdots w_n)=p(w_1)p(w_2|w_1)\cdots p(w_n|w_{n-1})
    • 如果一个词的出现仅依赖于它前面出现的两个词,那么我们就称之为 Tri-gram
      p(S)=p(w1w2wn)=p(w1)p(w2w1)p(wnwn1wn2)p(S)=p(w_1w_2\cdots w_n)=p(w_1)p(w_2|w_1)\cdots p(w_n|w_{n-1}w_{n-2})

    N-gram的 NN 可以取很高,然而现实中一般 bi-gram 和 tri-gram 就够用了。

      那么,如何计算其中的每一项条件概率 p(wnwn1w2w1)p(w_n|w_{n-1}\cdots w_2w_1) 呢?答案是**极大似然估计(Maximum Likelihood Estimation,MLE)**,说人话就是数频数:
    p(wnwn1)=C(wn1wn)C(wn1)p(w_n|w_{n-1})=\frac{C(w_{n-1}w_n)}{C(w_{n-1})}
    p(wnwn1wn2)=C(wn2wn1wn)C(wn2wn1)p(w_n|w_{n-1}w_{n-2})=\frac{C(w_{n-2}w_{n-1}w_n)}{C(w_{n-2}w_{n-1})}
    p(wnwn1w2w1)=C(w1w2wn)C(w1w2wn1)p(w_n|w_{n-1}\cdots w_2w_1)=\frac{C(w_1w_2\cdots w_n)}{C(w_1w_2\cdots w_{n-1})}

      具体地,以Bi-gram为例,我们有这样一个由三句话组成的语料库:

      容易统计,“I”出现了3次,“I am”出现了2次,因此能计算概率:
    p(amI)=23p(am|I)=\frac{2}{3}
      同理,还能计算出如下概率:
    p(I<s>)=0.67p(Samam)=0.5p(<s>Sam)=0.5p(doI)=0.33p(notdo)=1p(likenot)=1\begin{matrix}p(I|<s>)=0.67 & p(Sam | am)=0.5 & p(<s>|Sam)=0.5 \\ p(do|I)=0.33 & p(not|do)=1 & p(like|not)=1\end{matrix}

      另外再提供一个《Language Modeling with Ngrams》中的例子,Jurafsky et al., 1994 从加州一个餐厅的数据库中做了一些统计:
    这里写图片描述
    这里写图片描述
    这里写图片描述

      据统计,p(I<s>)=0.25p(I|<s>)=0.25p(<s>food)=0.68p(<s>|food)=0.68,于是:
    p(<s>I want chinese food<s>)=0.25×0.33×0.0065×0.52×0.68=1.896×104p(<s>I\ want\ chinese\ food<s>)\\=0.25\times 0.33\times 0.0065 \times 0.52 \times 0.68=1.896\times 10^{-4}
      我们算出了“I want chinese food”这句话的概率,但有时候这句话会很长,那么概率(都是小于1的常数)的相乘很可能造成数据下溢(downflow),即很多个小于1的常数相乘会约等于0,此时可以使用log概率解决。


    N-gram的用途

    用途一:词性标注

      N-gram可以实现词性标注。例如“爱”这个词,它既可以作为动词使用,也可以作为名词使用。不失一般性,假设我们需要匹配一句话中“爱”的词性。
    这里写图片描述

      我们可以将词性标注看成一个多分类问题,按照Bi-gram计算每一个词性概率:

    p(i"","")=i""""p(词性_i|"龙龙"的词性, "爱")=\frac{前面是“名词”的“爱”作为词性_i 的出现次数}{前面是"名词"的"爱"的出现次数}

      选取概率更大的词性(比如动词)作为这句话中“爱”字的词性。


    用途二:垃圾短信分类

      文章开头提到的那个垃圾短信分类问题,我们可以用N-gram来解决。在朴素贝叶斯的基础上,稍微对条件概率做一点改动即可。
    p("")p()p("")p(垃圾短信|"在家日赚百万")\propto p(垃圾邮件)p("在家日赚百万"|垃圾短信)
    条件概率不再是各词语之间独立:
    p(""J)=p("","","","","",""J)=p(""J)×p("""",J)×p("""",J)×p("""",J)×p("""",J)×p("""",J)p("在家日赚百万"|J)=p("在","家","日","赚","百","万"|J)\\ =p("在"|J)\times p("家"|"在",J)\times p("日"|"家",J)\times\\p("赚"|"日",J)\times p("百"|"赚",J)\times p("万"|"百",J)

      垃圾短信分类问题可以总结为以下三个步骤:

    • 步骤一:给短信的每个句子断句。
    • 步骤二:用N-gram判断每个句子是否垃圾短信中的敏感句子。
    • 步骤三:若敏感句子个数超过一定阈值,认为整个邮件是垃圾短信。

    用途三:分词器

      在NLP中,分词的效果很大程度上影响着模型的性能,因此分词甚至可以说是最重要的工程。用N-gram可以实现一个简单的分词器(Tokenizer)。同样地,将分词理解为多分类问题:XX 表示有待分词的句子,YiY_i 表示该句子的一个分词方案。

    X=""X="我爱深度学习"
    Y1={"","",""}Y2={"","","",""}Y3={"","",""}Y_1=\{"我","爱深","度学习"\}\\ Y_2=\{"我爱","深","度学","习"\}\\ Y_3=\{"我","爱","深度学习"\}
    p(Y1)=p()p()p()p(Y2)=p()p()p()p()p(Y3)=p()p()p()p(Y_1)=p(我)p(爱深|我)p(度学习|爱深)\\ p(Y_2)=p(我爱)p(深|我爱)p(度学|深)p(习|度学)\\ p(Y_3)=p(我)p(爱|我)p(深度学习|爱)

      三个概率中,“我爱”可能在语料库中比较常见,因此p()p(爱|我)会比较大,然而“我爱深”这样的组合比较少见,于是p()p(爱深|我)p()p(深|我爱)都比较小,导致p(Y3)p(Y_3)p(Y1)p(Y_1)p(Y2)p(Y_2)都大,因此第三种分词方案最佳。


    用途四:机器翻译和语音识别

    机器翻译

      同一句话,可能有多种翻译方式,它们的区别仅在于单词的组合顺序,这时候使用N-gram分别计算各种情况的概率,选最大的那个即可。

    这里写图片描述

    语音识别

      同一种发音,可能被解析成不同的句子,然而其中有一种更符合语法规则。
    这里写图片描述


    N-gram中N的确定

      为了确定NN的取值,《Language Modeling with Ngrams》使用了 Perplexity 这一指标,该指标越小表示一个语言模型的效果越好。文章使用了华尔街日报的数据库,该数据库的字典大小为19,979,训练集包含 38 million 个词,测试集包含 1.5 million 个词。针对不同的N-gram,计算各自的 Perplexity。

    PP(W)=1P(w1w2wn)n=i=1n1p(wiwi1w1)nPP(W)=\sqrt[n]{\frac{1}{P(w_1w_2\cdots w_n)}}=\sqrt[n]{\prod_{i=1}^n \frac{1}{p(w_i|w_{i-1}\cdots w_1)}}
      结果显示,Tri-gram的Perplexity最小,因此它的效果是最好的。那么NN越大是否越好呢?


    N-gram中的数据平滑方法

      上面提到,N-gram的NN越大,模型 Perplexity 越小,表示模型效果越好。这在直观意义上是说得通的,毕竟依赖的词越多,我们获得的信息量越多,对未来的预测就越准确。然而,语言是有极强的创造性的(Creative),当NN变大时,更容易出现这样的状况:某些n-gram从未出现过,这就是稀疏问题
      n-gram最大的问题就是稀疏问题(Sparsity)。例如,在bi-gram中,若词库中有20k个词,那么两两组合(C20k2C_{20k}^2)就有近2亿个组合。其中的很多组合在语料库中都没有出现,根据极大似然估计得到的组合概率将会是0,从而整个句子的概率就会为0。最后的结果是,我们的模型只能计算零星的几个句子的概率,而大部分的句子算得的概率是0,这显然是不合理的。
      因此,我们要进行数据平滑(data Smoothing),数据平滑的目的有两个:一个是使所有的N-gram概率之和为1,使所有的n-gram概率都不为0。它的本质,是重新分配整个概率空间,使已经出现过的n-gram的概率降低,补充给未曾出现过的n-gram。


    拉普拉斯平滑

    Add-one

      拉普拉斯平滑,即强制让所有的n-gram至少出现一次,只需要在分子和分母上分别做加法即可。这个方法的弊端是,大部分n-gram都是没有出现过的,很容易为他们分配过多的概率空间。
    p(wnwn1)=C(wn1wn)+1C(wn1)+Vp(w_n|w_{n-1})=\frac{C(w_{n-1}w_n)+1}{C(w_{n-1})+|V|}

    Add-K

      在Add-one的基础上做了一点小改动,原本是加一,现在加上一个小于1的常数KK。但是缺点是这个常数仍然需要人工确定,对于不同的语料库KK可能不同。

    p(wnwn1)=C(wn1wn)+kC(wn1)+kVp(w_n|w_{n-1})=\frac{C(w_{n-1}w_n)+k}{C(w_{n-1})+k|V|}


    内插与回溯

    内插

      **内插法(Interpolation)**有点像滑动平均,它的核心思想是,既然高阶组合可能出现次数为0,那稍微低阶一点的组合总有不为0的。如下是一个三阶组合,假设p(wnwn1wn2)=0p(w_n|w_{n-1}w_{n-2})=0,而p(wnwn1)>0p(w_n|w_{n-1})>0p(wn)>0p(w_n)>0,则加权平均后的概率不为0,从而达到平滑的效果。

    p^(wnwn1wn2)=λ3p(wnwn1wn2)+λ2p(wnwn1)+λ1p(wn)\hat{p}(w_n|w_{n-1}w_{n-2})=\lambda_3 p(w_n|w_{n-1}w_{n-2})+\lambda_2p(w_n|w_{n-1})+\lambda_1p(w_n)

    回溯

      **回溯法(backoff)**与内插有点像,只是它会尽可能地用最高阶组合计算概率,当高阶组合不存在时,退而求其次找次低阶,直到找到非零组合为止。参考下式,这是一个递归运算。

    p(wnwn1wnN+1)={p(wnwn1wnN+1)C(wn1wnN+1)>0α(wn1wnN+1)p(wnwn1wnN+2)otherwisep(w_n|w_{n-1}\cdots w_{n-N+1})=\left \{ \begin{matrix} p^*(w_n|w_{n-1}\cdots w_{n-N+1}) & C(w_{n-1}\cdots w_{n-N+1})>0\\ \alpha(w_{n-1}\cdots w_{n-N+1})p(w_n|w_{n-1}\cdots w_{n-N+2}) & otherwise\end{matrix} \right .


    Absolute Discounting

      Church & Gale (1991) 取了个巧,他们在训练集里找到一些出现次数为C=4C=4的bi-gram,然后在留出集(held-out)中统计它们的出现次数,平均下来发现约等于3.23。接着他们继续统计其他的CC,发现除了0和1外,基本上留出集bi-gram的出现次数等于训练集出现次数减去0.75。
      因此,他们提出直接在分子上减去一个常数,然后在后面加上一项保证概率求和为1。此处d=0.75d=0.75
    p(wnwn1)=C(wn1wn)dC(wn1)+λ(wn1)p(wn)p(w_n|w_{n-1})=\frac{C(w_{n-1}w_n)-d}{C(w_{n-1})}+\lambda(w_{n-1})p(w_n)


    Kneser-Ney Smoothing

      考虑这样一个填空:

    **I can't see without my ( )**

      一个完形填空题,正常来说,我们可能会填入**“glasses”这个词,意思是“我不戴眼镜就看不到东西”。那么,考虑上面提到的内插模型:
    λ2p(wiwi1)+λ1p(wi)\lambda_2 p(w_i|w_{i-1})+\lambda_1 p(w_i)
      这个模型很可能会在这个空里填上
    “Kong”这个词,是不是觉得很奇怪?因为语料库里,“Hong Kong”** 这个词组是高频词汇,以至于λ1p(wi)\lambda_1 p(w_i)这一项的概率会跟高,而**“glasses”是低频词,相应的概率较低,于是模型就填上了“Kong”**,在我们看来这显然是不合理的,但在模型看来却是合理的选择。
      为了解决这个问题,Kneser and Ney (1995) , Chen and Goodman(1998) 提出,修改这个 p(wi)p(w_i),具体来说,是要求它与“wiw_i为结尾的bi-gram的集合的势正相关的变量”,以表征wiw_i这个单词作为一个新的接续的可能性(即作为其他单词的下一个词的可能性)。
      以Bi-gram为例,实际上就是用下面这个PcontinuationP_{continuation}代替原来的p(w)p(w),所谓集合的势其实是要求集合中的元素互不相同后取集合的大小,其意义就是:语料库有多少种不同的以ww结尾的bi-gram。

    Pcontinuation(w){v:C(vw)>0}P_{continuation}(w)\propto |\left \{v:C(vw)>0\right\}|
      作为概率,需要进行归一化:
    Pcontinuation(w)={v:C(vw)>0}w{v:C(vw)>0}P_{continuation}(w)=\frac{|\left \{v:C(vw)>0\right\}|}{\sum_{w'}|\left\{v:C(vw')>0\right\}|}

      那么,为什么这样改过之后就能有效解决 p(Kong)p(Kong) 偏大的问题呢?根据 PcontinuationP_{continuation} 的定义,我们去统计语料库中以“Kong”结尾的bi-gram,然后发现只有“Hong Kong”一个,于是 PcontinuationP_{continuation} 就比较小了,而 “glasses”,可能有“sun glasses”,“reading glasses”等,相比“Hong Kong”这个专有名词肯定会更多。因此,问题得到解决。
      Kneser-Ney Smoothing的本质是改进Unigram概率p(w)p(w),像上文提到的其他用到这个概率的平滑方法,也可以代入这个概率,比如Absolute Discounting就变成:
    pKN(wnwn1)=C(wn1wn)dC(wn1)+λ(wn1)Pcontinuation(wn)p_{KN}(w_n|w_{n-1})=\frac{C(w_{n-1}w_n)-d}{C(w_{n-1})}+\lambda(w_{n-1})P_{continuation}(w_n)


    N-gram对训练数据集的要求

      关于N-gram的训练数据,如果你以为**“只要是英语就可以了”,那就大错特错了。文献《Language Modeling with Ngrams》**的作者做了个实验,分别用莎士比亚文学作品,以及华尔街日报作为训练集训练两个N-gram,他认为,两个数据集都是英语,那么用他们生成的文本应该也会有所重合。然而结果是,用两个语料库生成的文本没有任何重合性,即使在语法结构上也没有。
      这告诉我们,N-gram的训练是很挑数据集的,你要训练一个问答系统,那就要用问答的语料库来训练,要训练一个金融分析系统,就要用类似于华尔街日报这样的语料库来训练。
    这里写图片描述
    这里写图片描述


    N-gram的进化版:NNLM

      NNLMNeural Network based Language Model,由Bengio在2003年提出,它是一个很简单的模型,由四层组成,输入层、嵌入层、隐层和输出层。模型接收的输入是长度为nn的词序列,输出是下一个词的类别。首先,输入是单词序列的index序列,例如单词 I 在字典(大小为V|V|)中的index是10,单词 am 的 index 是23, Bengio 的 index 是65,则句子“I am Bengio”的index序列就是 10, 23, 65。嵌入层(Embedding)是一个大小为V×K|V|\times K的矩阵,从中取出第10、23、65行向量拼成3×K3\times K的矩阵就是Embedding层的输出了。隐层接受拼接后的Embedding层输出作为输入,以tanh为激活函数,最后送入带softmax的输出层,输出概率。
      NNLM最大的缺点就是参数多,训练慢。另外,NNLM要求输入是定长nn,定长输入这一点本身就很不灵活,同时不能利用完整的历史信息。
    这里写图片描述


    NNLM的进化版:RNNLM

      针对NNLM存在的问题,Mikolov在2010年提出了RNNLM,其结构实际上是用RNN代替NNLM里的隐层,这样做的好处包括减少模型参数、提高训练速度、接受任意长度输入、利用完整的历史信息。同时,RNN的引入意味着可以使用RNN的其他变体,像LSTM、BLSTM、GRU等等,从而在时间序列建模上进行更多更丰富的优化。
      论文给的模型结构图不多,这里就不放出来了,有兴趣可以直接去读论文。另外,RNNLM有开源的工具包,自行编译后得到可执行文件,可在命令行中直接使用。


    Word2Vec

      Word2Vec解决的问题已经和上面讲到的N-gram、NNLM等不一样了,它要做的事情是:学习一个从高维稀疏离散向量到低维稠密连续向量的映射。该映射的特点是,近义词向量的欧氏距离比较小,词向量之间的加减法有实际物理意义。Word2Vec由两部分组成:CBoW和Skip-Gram。其中CBoW的结构很简单,在NNLM的基础上去掉隐层,Embedding层直接连接到Softmax,CBoW的输入是某个Word的上下文(例如前两个词和后两个词),Softmax的输出是关于当前词的某个概率,即CBoW是从上下文到当前词的某种映射或者预测。Skip-Gram则是反过来,从当前词预测上下文,至于为什么叫Skip-Gram这个名字,原因是在处理过程中会对词做采样。
      Word2Vec这个内容比较丰富,这里只做一点概括性的描述,以后应该会再专门写一个博客。


    参考资料

    【博客】一周论文 | Word2Vec 作者Tomas Mikolov 的三篇代表作
    【博客】word2vector:NPLM、CBOW、Skip-gram
    【博客】大白话讲解word2vec到底在做些什么
    【博客】Deep Learning in NLP (一)词向量和语言模型
    【博客】word2vec前世今生
    【博客】Hinton神经网络公开课编程题2–神经概率语言模型(NNLM)
    【博客】神经网络语言模型(NNLM)
    【博客】NLP系列(2)_用朴素贝叶斯进行文本分类(上)
    【博客】NLP系列(5)_从朴素贝叶斯到N-gram语言模型
    【博客】语言模型系列之N-Gram、NPLM及Word2vec
    【博客】OpenNLP ngram n元语法模型(简介)
    【博客】关于N-Gram模型(例子很好)
    【博客】自然语言处理中的N-Gram模型详解
    【博客】Deep Learning 读书笔记(十二):A Neural Probabilistic Language Model
    【博客】Recurrent Neural Network Based Language Model(RNNLM)原理及BPTT数学推导
    【博客】RNNLM的使用方法
    【斯坦福课程】Speech and Language Processing
    【NNLM论文】A Neural Probabilistic Language Models
    【RNNLM论文】Statistical Language Models Based on Neural Networks
    【开源】RNNLM Toolkit

    展开全文
  • 中文自然语言处理入门实战

    万次阅读 多人点赞 2018-07-03 02:45:10
    本达人课,作为中文自然语言处理边学边实战的入门级教程,以小数据量的“简易版”实例,通过实战带大家快速掌握 NLP 在中文方面开发的基本能力。 本课程共包含 18 节。各小节之间并没有紧密耦合,但是整个内容还是...

    课程介绍

    NLP 作为 AI 技术领域中重要的分支,随着其技术应用范围不断扩大,在数据处理领域占有越来越重要的地位。本达人课,作为中文自然语言处理边学边实战的入门级教程,以小数据量的“简易版”实例,通过实战带大家快速掌握 NLP 在中文方面开发的基本能力。

    本课程共包含 22 篇。各篇之间并没有紧密耦合,但是整个内容还是遵循一定的开发流程。

    比如,按照中文语料处理的过程,在获取到语料之后开始分词,分词之后可以进行一些统计和关键字提取,并通过数据可视化手段熟悉和了解你的数据。

    紧接着通过词袋或者词向量,把文本数据转换成计算机可以计算的矩阵向量。后续从机器学习简单的有监督分类和无监督聚类入手,到深度学习中神经网络的应用,以及简易聊天机器人和知识图谱的构建。带你直观深入、高效地了解 NLP 开发的流程,全方位提升你的技术实力与思维方式。

    课程示例数据下载地址:Github

    作者介绍

    宿永杰,现就职于某知名互联网公司担任数据挖掘工程师,PC 端全栈开发工程师,擅长 Java 大数据开发 、Python、SQL 数据挖掘等,参与过客户画像、流量预测以及自然语言处理等项目的开发。

    课程内容

    开篇词:中文自然语言处理——未来数据领域的珠穆朗玛峰

    人工智能或许是人类最美好的梦想之一。追溯到公元前仰望星空的古希腊人,当亚里士多德为了解释人类大脑的运行规律而提出了联想主义心理学的时候,他恐怕不会想到,两千多年后的今天,人们正在利用联想主义心理学衍化而来的人工神经网络,构建的超级人工智能成为最能接近梦想的圣境,并一次又一次地挑战人类大脑认知的极限。

    在以大数据、云计算为背景的技术框架支撑下,互联网发展极为迅速,过去一个技术或者行业热点从诞生到消亡需要几年乃至更长的时间,但是最近几年,其生命周期在不断缩短,大多数的热点从产生到消亡只需要1-2年,有些仅仅是半年甚至几个月的时间。互联网行业越来越凸显出快鱼吃慢鱼的特点。从技术本身也有体现,比如2012-2014年是移动互联网的热潮,Android 和 iOS App 开发工程师当时非常流行。随后,2015大数据、云计算之年,2016年后大数据时代,2017年被称为人工智能元年,2018年炒得最火的是区块链和币圈。在互联网以这种迅雷不及掩耳之势的发展速度下,作为初学者就很容易被各种技术概念迷惑,找不到自己想要的突破口和深入的领域,即便是计算机从业者有时候也分不清到底如何定位自己未来的技术方向。

    下面,我们先从中国互联网的发展历程说起。

    从1994诞生(加入国际互联网)到现在才短短的24年,就在这24年里,我们经历了4次非同凡响、一次比一次更彻底的发展大高潮。

    第一次互联网大浪潮(1994年—2000年),以四大门户和搜索为代表,能做网站的工程师就可以被称为技术牛人;第二次互联网大浪潮(2001年—2008年),从搜索到 PC 端社交化网络的发展,我们的社交形态发生了根本的变化,从线下交流正转变为线上交流,大量的数据开始生成;第三次互联网大浪潮(2009年—2014年)PC 端互联网到移动互联网,此时各种 App 如雨后春笋般的冒出来,尽管后来有很多 App 都死了,但是移动互联网几乎颠覆了整个中国老百姓个人生活和商业形态,改变着我们每一个人的生活、消费、社交、出行方式等。

    那第四次是什么呢?没错,第四次互联网大浪潮(2015—至今),是在前3次发展基础上,以大数据、云计算为背景发展起来的人工智能技术革命,分布式计算让大数据处理提速,而昔日陨落的巨星深度学习此刻再次被唤醒,并很快在图像和语音方面取得重大突破,但在自然语言方面却显得有些暗淡,突破并不是很大。尽管有很多人都去从事计算机视觉、语音等方面的工作,但随着 AI 的继续发展,NLP 方向正显得越来越重要。

    接着,我们总结一下数据领域成就和挑战。

    有一个不可否认的事实,当前从事互联网的人们已经制造出了海量的数据,未来还将继续持续,其中包括结构化数据、半结构化和非结构化数据。我发现,对于结构化数据而言,在大数据、云计算技术“上下齐心”的大力整合下,其技术基本趋向成熟和稳定,比如关系型数据库以及基于 Hadoop 的 HDFS 分布式文件系统、Hive 数据仓库和非关系型数据库 Hbase,以及 Elasticsearch 集群等数据存储的关系数据库或者 NoSQL,可以用来管理和存储数据;基于 MapReduce、Spark 和 Storm、Flink 等大数据处理框架可以分别处理离线和实时数据等。而半结构化、非结构化的数据,除了以 ELK 为代表的日志处理流程,过去在其它限定领域基于规则和知识库也取得了一定的成果,因其自身的复杂性,未来更多领域应用都具有很大的困难和挑战。

    最后,我们看看国内外人工智能领域的工业现状。

    今年5月19日有幸在北京国家会议中心参加了2018全球人工智能技术大会(GAITC)。在大会上,从中国科学院院士姚期智提出人工智能的新思维开始,其重点讲述了人工神经网络为代表的深度学习以及量子计算机将是未来发展的新思维;紧接着中国工程院院士李德毅分享了路测的学问——无人驾驶的后图灵测试,提出未来无人驾驶挑战应该是让无人驾驶具有司机的认知、思维和情感,而不是当前以 GPS 定位和动力学解决无人驾驶的问题;接下来微软全球资深副总裁王永东向我们展示的微软小冰,大家一起见证了微软小冰在社交互动、唱歌、作诗、节目主持和情感方面不凡的表现,而本人也真实测试了一下,小冰现在的表现已经非常优秀了。然而要达到一个成年自然人的水平,在某些方面还不能完全表现出人的特性。下面这幅图是微软小冰的个人介绍,有兴趣可以在微信公众号关注小冰,进行体验。

    enter image description here

    人工智能产业的快速发展,资本市场大量资金涌入,促使中国人工智能领域投融资热度快速升温,这充分表明资本市场对于人工智能发展前景的认可。《2018年人工智能行业创新企业 Top100》发布,据榜单显示:进入2018年人工智能行业创新企业前十名的企业分别是:百度、阿里云、美图秀秀、华大基因、科大讯飞、微鲸科技、华云数据、爱驰亿维、青云、七牛云。作为人工智能的一个重要组成部分,自然语言处理(NLP)的研究对象是计算机和人类语言的交互,其任务是理解人类语言并将其转换为机器语言。在目前的商业场中,NLP 技术用于分析源自邮件、音频、文件、网页、论坛、社交媒体中的大量半结构化和非结构化数据,市场前景巨大。

    为什么说未来数据领域的珠穆朗玛峰是中文自然语言处理?

    正是基于上面对中国互联网发展的总结,对当前数据领域所面临的挑战以及资本市场对人工智能的认可分析,未来数据领域的重点是自然语言处理技术及其在智能问答、情感分析、语义理解、知识图谱等应用方面的突破。对于我们国内中文来说,如何更好的把前面所说的应用在中文处理上,显得更为重要和急迫,所以我认为未来数据领域的珠穆朗玛峰是中文自然语言处理 。

    作为初学者,我们目前又面临这样的尴尬,网上大部分自然语言处理内容都是英文为基础,大多数人先是学好了英语的处理,回头来再处理中文,却发现有很大的不同,这样不仅让中文自然语言处理学习者走了弯路,也浪费了大量时间和精力。中文的处理比英文复杂的多,网上中文相关资料少之又少,国内纯中文自然语言处理书籍只有理论方面的,却在实战方面比较空缺,这让中文自然语言处理的研究开发工作感到举步维艰,很难下笔。

    关于本达人课

    本课程共包含19节(包括开篇词)。

    各小节之间并没有紧密耦合,但是整个内容还是遵循一定的开发流程。比如,按照中文语料处理的过程,在获取到语料之后开始分词,分词之后可以进行一些统计和关键字提取,并通过数据可视化手段熟悉和了解你的数据。紧接着通过词袋或者词向量,把文本数据转换成计算机可以计算的矩阵向量。后续从机器学习简单的有监督分类和无监督聚类入手,到深度学习中神经网络的应用,以及简易聊天机器人和知识图谱的构建。带你直观深入、高效地了解 NLP 开发的流程,全方位提升你的技术实力与思维方式。

    因此,本达人课,作为中文自然语言处理初学者边学边实战的入门级教程,希望从中文实际出发,针对中文语料以小数据量的“简易版”实例,通过实战带大家快速掌握 NLP 在中文方面开发的基本能力。当然作为读者, 我默认你已经掌握 Python 编程语言和有一定的机器学习理论知识,当然不会也没关系,可以边学边做,还是那句老话:“只要功夫深铁杵磨成针”。

    点击了解更多《中文自然语言处理入门》

    课程寄语

    无论是初入 AI 行业的新人,还是想转行成为 AI 领域的技术工程师,都可以从本场达人课中,收获中文自然语言处理相关知识。因为篇幅原因,本课程无法包含 NLP 的所有知识以及比较前沿的知识,但是我会在讲好每节课的前提下,尽量分享一些比较前沿的知识来作为补充。

    第01课:中文自然语言处理的完整机器处理流程

    2016年全球瞩目的围棋大战中,人类以失败告终,更是激起了各种“机器超越、控制人类”的讨论,然而机器真的懂人类吗?机器能感受到人类的情绪吗?机器能理解人类的语言吗?如果能,那它又是如何做到呢?带着这样好奇心,本文将带领大家熟悉和回顾一个完整的自然语言处理过程,后续所有章节所有示例开发都将遵从这个处理过程。

    首先我们通过一张图(来源:网络)来了解 NLP 所包含的技术知识点,这张图从分析对象和分析内容两个不同的维度来进行表达,个人觉得内容只能作为参考,对于整个 AI 背景下的自然语言处理来说还不够完整。

    enter image description here

    有机器学习相关经验的人都知道,中文自然语言处理的过程和机器学习过程大体一致,但又存在很多细节上的不同点,下面我们就来看看中文自然语言处理的基本过程有哪些呢?

    获取语料

    语料,即语言材料。语料是语言学研究的内容。语料是构成语料库的基本单元。所以,人们简单地用文本作为替代,并把文本中的上下文关系作为现实世界中语言的上下文关系的替代品。我们把一个文本集合称为语料库(Corpus),当有几个这样的文本集合的时候,我们称之为语料库集合(Corpora)。(定义来源:百度百科)按语料来源,我们将语料分为以下两种:

    1.已有语料

    很多业务部门、公司等组织随着业务发展都会积累有大量的纸质或者电子文本资料。那么,对于这些资料,在允许的条件下我们稍加整合,把纸质的文本全部电子化就可以作为我们的语料库。

    2.网上下载、抓取语料

    如果现在个人手里没有数据怎么办呢?这个时候,我们可以选择获取国内外标准开放数据集,比如国内的中文汉语有搜狗语料人民日报语料。国外的因为大都是英文或者外文,这里暂时用不到。也可以选择通过爬虫自己去抓取一些数据,然后来进行后续内容。

    语料预处理

    这里重点介绍一下语料的预处理,在一个完整的中文自然语言处理工程应用中,语料预处理大概会占到整个50%-70%的工作量,所以开发人员大部分时间就在进行语料预处理。下面通过数据洗清、分词、词性标注、去停用词四个大的方面来完成语料的预处理工作。

    1.语料清洗

    数据清洗,顾名思义就是在语料中找到我们感兴趣的东西,把不感兴趣的、视为噪音的内容清洗删除,包括对于原始文本提取标题、摘要、正文等信息,对于爬取的网页内容,去除广告、标签、HTML、JS 等代码和注释等。常见的数据清洗方式有:人工去重、对齐、删除和标注等,或者规则提取内容、正则表达式匹配、根据词性和命名实体提取、编写脚本或者代码批处理等。

    2.分词

    中文语料数据为一批短文本或者长文本,比如:句子,文章摘要,段落或者整篇文章组成的一个集合。一般句子、段落之间的字、词语是连续的,有一定含义。而进行文本挖掘分析时,我们希望文本处理的最小单位粒度是词或者词语,所以这个时候就需要分词来将文本全部进行分词。

    常见的分词算法有:基于字符串匹配的分词方法、基于理解的分词方法、基于统计的分词方法和基于规则的分词方法,每种方法下面对应许多具体的算法。

    当前中文分词算法的主要难点有歧义识别和新词识别,比如:“羽毛球拍卖完了”,这个可以切分成“羽毛 球拍 卖 完 了”,也可切分成“羽毛球 拍卖 完 了”,如果不依赖上下文其他的句子,恐怕很难知道如何去理解。

    3.词性标注

    词性标注,就是给每个词或者词语打词类标签,如形容词、动词、名词等。这样做可以让文本在后面的处理中融入更多有用的语言信息。词性标注是一个经典的序列标注问题,不过对于有些中文自然语言处理来说,词性标注不是非必需的。比如,常见的文本分类就不用关心词性问题,但是类似情感分析、知识推理却是需要的,下图是常见的中文词性整理。

    enter image description here

    常见的词性标注方法可以分为基于规则和基于统计的方法。其中基于统计的方法,如基于最大熵的词性标注、基于统计最大概率输出词性和基于 HMM 的词性标注。

    4.去停用词

    停用词一般指对文本特征没有任何贡献作用的字词,比如标点符号、语气、人称等一些词。所以在一般性的文本处理中,分词之后,接下来一步就是去停用词。但是对于中文来说,去停用词操作不是一成不变的,停用词词典是根据具体场景来决定的,比如在情感分析中,语气词、感叹号是应该保留的,因为他们对表示语气程度、感情色彩有一定的贡献和意义。

    特征工程

    做完语料预处理之后,接下来需要考虑如何把分词之后的字和词语表示成计算机能够计算的类型。显然,如果要计算我们至少需要把中文分词的字符串转换成数字,确切的说应该是数学中的向量。有两种常用的表示模型分别是词袋模型和词向量。

    词袋模型(Bag of Word, BOW),即不考虑词语原本在句子中的顺序,直接将每一个词语或者符号统一放置在一个集合(如 list),然后按照计数的方式对出现的次数进行统计。统计词频这只是最基本的方式,TF-IDF 是词袋模型的一个经典用法。

    词向量是将字、词语转换成向量矩阵的计算模型。目前为止最常用的词表示方法是 One-hot,这种方法把每个词表示为一个很长的向量。这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个维度就代表了当前的词。还有 Google 团队的 Word2Vec,其主要包含两个模型:跳字模型(Skip-Gram)和连续词袋模型(Continuous Bag of Words,简称 CBOW),以及两种高效训练的方法:负采样(Negative Sampling)和层序 Softmax(Hierarchical Softmax)。值得一提的是,Word2Vec 词向量可以较好地表达不同词之间的相似和类比关系。除此之外,还有一些词向量的表示方式,如 Doc2Vec、WordRank 和 FastText 等。

    特征选择

    同数据挖掘一样,在文本挖掘相关问题中,特征工程也是必不可少的。在一个实际问题中,构造好的特征向量,是要选择合适的、表达能力强的特征。文本特征一般都是词语,具有语义信息,使用特征选择能够找出一个特征子集,其仍然可以保留语义信息;但通过特征提取找到的特征子空间,将会丢失部分语义信息。所以特征选择是一个很有挑战的过程,更多的依赖于经验和专业知识,并且有很多现成的算法来进行特征的选择。目前,常见的特征选择方法主要有 DF、 MI、 IG、 CHI、WLLR、WFO 六种。

    模型训练

    在特征向量选择好之后,接下来要做的事情当然就是训练模型,对于不同的应用需求,我们使用不同的模型,传统的有监督和无监督等机器学习模型, 如 KNN、SVM、Naive Bayes、决策树、GBDT、K-means 等模型;深度学习模型比如 CNN、RNN、LSTM、 Seq2Seq、FastText、TextCNN 等。这些模型在后续的分类、聚类、神经序列、情感分析等示例中都会用到,这里不再赘述。下面是在模型训练时需要注意的几个点。

    1.注意过拟合、欠拟合问题,不断提高模型的泛化能力。

    过拟合:模型学习能力太强,以至于把噪声数据的特征也学习到了,导致模型泛化能力下降,在训练集上表现很好,但是在测试集上表现很差。

    常见的解决方法有:

    • 增大数据的训练量;
    • 增加正则化项,如 L1 正则和 L2 正则;
    • 特征选取不合理,人工筛选特征和使用特征选择算法;
    • 采用 Dropout 方法等。

    欠拟合:就是模型不能够很好地拟合数据,表现在模型过于简单。

    常见的解决方法有:

    • 添加其他特征项;
    • 增加模型复杂度,比如神经网络加更多的层、线性模型通过添加多项式使模型泛化能力更强;
    • 减少正则化参数,正则化的目的是用来防止过拟合的,但是现在模型出现了欠拟合,则需要减少正则化参数。

    2.对于神经网络,注意梯度消失和梯度爆炸问题。

    评价指标

    训练好的模型,上线之前要对模型进行必要的评估,目的让模型对语料具备较好的泛化能力。具体有以下这些指标可以参考。

    1.错误率、精度、准确率、精确度、召回率、F1 衡量。

    错误率:是分类错误的样本数占样本总数的比例。对样例集 D,分类错误率计算公式如下:

    enter image description here

    精度:是分类正确的样本数占样本总数的比例。这里的分类正确的样本数指的不仅是正例分类正确的个数还有反例分类正确的个数。对样例集 D,精度计算公式如下:

    enter image description here

    对于二分类问题,可将样例根据其真实类别与学习器预测类别的组合划分为真正例(True Positive)、假正例(False Positive)、真反例(True Negative)、假反例(False Negative)四种情形,令 TP、FP、TN、FN 分别表示其对应的样例数,则显然有 TP+FP++TN+FN=样例总数。分类结果的“混淆矩阵”(Confusion Matrix)如下:

    enter image description here

    准确率,缩写表示用 P。准确率是针对我们预测结果而言的,它表示的是预测为正的样例中有多少是真正的正样例。定义公式如下:

    enter image description here

    精确度,缩写表示用 A。精确度则是分类正确的样本数占样本总数的比例。Accuracy 反应了分类器对整个样本的判定能力(即能将正的判定为正的,负的判定为负的)。定义公式如下:

    enter image description here

    召回率,缩写表示用 R。召回率是针对我们原来的样本而言的,它表示的是样本中的正例有多少被预测正确。定义公式如下:

    enter image description here

    F1 衡量,表达出对查准率/查全率的不同偏好。定义公式如下:

    enter image description here

    2.ROC 曲线、AUC 曲线。

    ROC 全称是“受试者工作特征”(Receiver Operating Characteristic)曲线。我们根据模型的预测结果,把阈值从0变到最大,即刚开始是把每个样本作为正例进行预测,随着阈值的增大,学习器预测正样例数越来越少,直到最后没有一个样本是正样例。在这一过程中,每次计算出两个重要量的值,分别以它们为横、纵坐标作图,就得到了 ROC 曲线。

    ROC 曲线的纵轴是“真正例率”(True Positive Rate, 简称 TPR),横轴是“假正例率”(False Positive Rate,简称FPR),两者分别定义为:

    enter image description here

    enter image description here

    ROC 曲线的意义有以下几点:

    1. ROC 曲线能很容易的查出任意阈值对模型的泛化性能影响;
    2. 有助于选择最佳的阈值;
    3. 可以对不同的模型比较性能,在同一坐标中,靠近左上角的 ROC 曲所代表的学习器准确性最高。

    如果两条 ROC 曲线没有相交,我们可以根据哪条曲线最靠近左上角哪条曲线代表的学习器性能就最好。但是实际任务中,情况很复杂,若两个模型的 ROC 曲线发生交叉,则难以一般性的断言两者孰优孰劣。此时如果一定要进行比较,则比较合理的判断依据是比较 ROC 曲线下的面积,即AUC(Area Under ROC Curve)。

    AUC 就是 ROC 曲线下的面积,衡量学习器优劣的一种性能指标。AUC 是衡量二分类模型优劣的一种评价指标,表示预测的正例排在负例前面的概率。

    前面我们所讲的都是针对二分类问题,那么如果实际需要在多分类问题中用 ROC 曲线的话,一般性的转化为多个“一对多”的问题。即把其中一个当作正例,其余当作负例来看待,画出多个 ROC 曲线。

    模型上线应用

    模型线上应用,目前主流的应用方式就是提供服务或者将模型持久化。

    第一就是线下训练模型,然后将模型做线上部署,发布成接口服务以供业务系统使用。

    第二种就是在线训练,在线训练完成之后把模型 pickle 持久化,然后在线服务接口模板通过读取 pickle 而改变接口服务。

    模型重构(非必须)

    随着时间和变化,可能需要对模型做一定的重构,包括根据业务不同侧重点对上面提到的一至七步骤也进行调整,重新训练模型进行上线。

    参考文献

    1. 周志华《机器学习》
    2. 李航《统计学习方法》
    3. 伊恩·古德费洛《深度学习》

    点击了解更多《中文自然语言处理入门》

    第02课:简单好用的中文分词利器 jieba 和 HanLP

    前言

    从本文开始,我们就要真正进入实战部分。首先,我们按照中文自然语言处理流程的第一步获取语料,然后重点进行中文分词的学习。中文分词有很多种,常见的比如有中科院计算所 NLPIR、哈工大 LTP、清华大学 THULAC 、斯坦福分词器、Hanlp 分词器、jieba 分词、IKAnalyzer 等。这里针对 jieba 和 HanLP 分别介绍不同场景下的中文分词应用。

    jieba 分词

    jieba 安装

    (1)Python 2.x 下 jieba 的三种安装方式,如下:

    • 全自动安装:执行命令 easy_install jieba 或者 pip install jieba / pip3 install jieba,可实现全自动安装。

    • 半自动安装:先下载 jieba,解压后运行 python setup.py install

    • 手动安装:将 jieba 目录放置于当前目录或者 site-packages 目录。

    安装完通过 import jieba 验证安装成功与否。

    (2)Python 3.x 下的安装方式。

    Github 上 jieba 的 Python3.x 版本的路径是:https://github.com/fxsjy/jieba/tree/jieba3k。

    通过 git clone https://github.com/fxsjy/jieba.git 命令下载到本地,然后解压,再通过命令行进入解压目录,执行 python setup.py install 命令,即可安装成功。

    jieba 的分词算法

    主要有以下三种:

    1. 基于统计词典,构造前缀词典,基于前缀词典对句子进行切分,得到所有切分可能,根据切分位置,构造一个有向无环图(DAG);
    2. 基于DAG图,采用动态规划计算最大概率路径(最有可能的分词结果),根据最大概率路径分词;
    3. 对于新词(词库中没有的词),采用有汉字成词能力的 HMM 模型进行切分。

    jieba 分词

    下面我们进行 jieba 分词练习,第一步首先引入 jieba 和语料:

        import jieba    content = "现如今,机器学习和深度学习带动人工智能飞速的发展,并在图片处理、语音识别领域取得巨大成功。"

    (1)精确分词

    精确分词:精确模式试图将句子最精确地切开,精确分词也是默认分词。

    segs_1 = jieba.cut(content, cut_all=False)print("/".join(segs_1))

    其结果为:

    现如今/,/机器/学习/和/深度/学习/带动/人工智能/飞速/的/发展/,/并/在/图片/处理/、/语音/识别/领域/取得/巨大成功/。

    (2)全模式

    全模式分词:把句子中所有的可能是词语的都扫描出来,速度非常快,但不能解决歧义。

        segs_3 = jieba.cut(content, cut_all=True)    print("/".join(segs_3))

    结果为:

    现如今/如今///机器/学习/和/深度/学习/带动/动人/人工/人工智能/智能/飞速/的/发展///并/在/图片/处理///语音/识别/领域/取得/巨大/巨大成功/大成/成功//

    (3)搜索引擎模式

    搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。

        segs_4 = jieba.cut_for_search(content)    print("/".join(segs_4))

    结果为:

    如今/现如今/,/机器/学习/和/深度/学习/带动/人工/智能/人工智能/飞速/的/发展/,/并/在/图片/处理/、/语音/识别/领域/取得/巨大/大成/成功/巨大成功/。

    (4)用 lcut 生成 list

    jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 Generator,可以使用 for 循环来获得分词后得到的每一个词语(Unicode)。jieba.lcut 对 cut 的结果做了封装,l 代表 list,即返回的结果是一个 list 集合。同样的,用 jieba.lcut_for_search 也直接返回 list 集合。

        segs_5 = jieba.lcut(content)    print(segs_5)

    结果为:

    ['现如今', ',', '机器', '学习', '和', '深度', '学习', '带动', '人工智能', '飞速', '的', '发展', ',', '并', '在', '图片', '处理', '、', '语音', '识别', '领域', '取得', '巨大成功', '。']

    (5)获取词性

    jieba 可以很方便地获取中文词性,通过 jieba.posseg 模块实现词性标注。

        import jieba.posseg as psg    print([(x.word,x.flag) for x in psg.lcut(content)])

    结果为:

    [('现如今', 't'), (',', 'x'), ('机器', 'n'), ('学习', 'v'), ('和', 'c'), ('深度', 'ns'), ('学习', 'v'), ('带动', 'v'), ('人工智能', 'n'), ('飞速', 'n'), ('的', 'uj'), ('发展', 'vn'), (',', 'x'), ('并', 'c'), ('在', 'p'), ('图片', 'n'), ('处理', 'v'), ('、', 'x'), ('语音', 'n'), ('识别', 'v'), ('领域', 'n'), ('取得', 'v'), ('巨大成功', 'nr'), ('。', 'x')]

    (6)并行分词

    并行分词原理为文本按行分隔后,分配到多个 Python 进程并行分词,最后归并结果。

    用法:

    jieba.enable_parallel(4) # 开启并行分词模式,参数为并行进程数 。jieba.disable_parallel() # 关闭并行分词模式 。

    注意: 并行分词仅支持默认分词器 jieba.dt 和 jieba.posseg.dt。目前暂不支持 Windows。

    (7)获取分词结果中词列表的 top n

        from collections import Counter    top5= Counter(segs_5).most_common(5)    print(top5)

    结果为:

    [(',', 2), ('学习', 2), ('现如今', 1), ('机器', 1), ('和', 1)]

    (8)自定义添加词和字典

    默认情况下,使用默认分词,是识别不出这句话中的“铁甲网”这个新词,这里使用用户字典提高分词准确性。

        txt = "铁甲网是中国最大的工程机械交易平台。"    print(jieba.lcut(txt))

    结果为:

    ['铁甲', '网是', '中国', '最大', '的', '工程机械', '交易平台', '。']

    如果添加一个词到字典,看结果就不一样了。

        jieba.add_word("铁甲网")    print(jieba.lcut(txt))

    结果为:

    ['铁甲网', '是', '中国', '最大', '的', '工程机械', '交易平台', '。']

    但是,如果要添加很多个词,一个个添加效率就不够高了,这时候可以定义一个文件,然后通过 load_userdict()函数,加载自定义词典,如下:

        jieba.load_userdict('user_dict.txt')    print(jieba.lcut(txt))

    结果为:

    ['铁甲网', '是', '中国', '最大', '的', '工程机械', '交易平台', '。']

    注意事项:

    jieba.cut 方法接受三个输入参数: 需要分词的字符串;cut_all 参数用来控制是否采用全模式;HMM 参数用来控制是否使用 HMM 模型。

    jieba.cut_for_search 方法接受两个参数:需要分词的字符串;是否使用 HMM 模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细。

    HanLP 分词

    pyhanlp 安装

    其为 HanLP 的 Python 接口,支持自动下载与升级 HanLP,兼容 Python2、Python3。

    安装命令为 pip install pyhanlp,使用命令 hanlp 来验证安装。

    pyhanlp 目前使用 jpype1 这个 Python 包来调用 HanLP,如果遇到:

    building '_jpype' extensionerror: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft VisualC++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools

    则推荐利用轻量级的 Miniconda 来下载编译好的 jpype1。

        conda install -c conda-forge jpype1    pip install pyhanlp

    未安装 Java 时会报错

    jpype.jvmfinder.JVMNotFoundException: No JVM shared library file (jvm.dll) found. Try setting up the JAVAHOME environment variable properly.

    HanLP 主项目采用 Java 开发,所以需要 Java 运行环境,请安装 JDK。

    命令行交互式分词模式

    在命令行界面,使用命令 hanlp segment 进入交互分词模式,输入一个句子并回车,HanLP 会输出分词结果:

    enter image description here

    可见,pyhanlp 分词结果是带有词性的。

    服务器模式

    通过 hanlp serve 来启动内置的 HTTP 服务器,默认本地访问地址为:http://localhost:8765 。

    enter image description here

    enter image description here

    也可以访问官网演示页面:http://hanlp.hankcs.com/

    通过工具类 HanLP 调用常用接口

    通过工具类 HanLP 调用常用接口,这种方式应该是我们在项目中最常用的方式。

    (1)分词

        from pyhanlp import *    content = "现如今,机器学习和深度学习带动人工智能飞速的发展,并在图片处理、语音识别领域取得巨大成功。"    print(HanLP.segment(content))

    结果为:

    [现如今/t, ,/w, 机器学习/gi, 和/cc, 深度/n, 学习/v, 带动/v, 人工智能/n, 飞速/d, 的/ude1, 发展/vn, ,/w, 并/cc, 在/p, 图片/n, 处理/vn, 、/w, 语音/n, 识别/vn, 领域/n, 取得/v, 巨大/a, 成功/a, 。/w]

    (2)自定义词典分词

    在没有使用自定义字典时的分词。

        txt = "铁甲网是中国最大的工程机械交易平台。"    print(HanLP.segment(txt))

    结果为:

    [铁甲/n, 网/n, 是/vshi, 中国/ns, 最大/gm, 的/ude1, 工程/n, 机械/n, 交易/vn, 平台/n, 。/w]

    添加自定义新词:

        CustomDictionary.add("铁甲网")    CustomDictionary.insert("工程机械", "nz 1024")    CustomDictionary.add("交易平台", "nz 1024 n 1")    print(HanLP.segment(txt))

    结果为:

    [铁甲网/nz, 是/vshi, 中国/ns, 最大/gm, 的/ude1, 工程机械/nz, 交易平台/nz, 。/w]

    当然了,jieba 和 pyhanlp 能做的事还有很多,关键词提取、自动摘要、依存句法分析、情感分析等,后面章节我们将会讲到,这里不再赘述。

    参考文献:

    1. https://github.com/fxsjy/jieba
    2. https://github.com/hankcs/pyhanlp

    点击了解更多《中文自然语言处理入门》

    第03课:动手实战中文文本中的关键字提取
    第04课:了解数据必备的文本可视化技巧
    第05课:面向非结构化数据转换的词袋和词向量模型
    第06课:动手实战基于 ML 的中文短文本分类
    第07课:动手实战基于 ML 的中文短文本聚类
    第08课:从自然语言处理角度看 HMM 和 CRF
    第09课:一网打尽神经序列模型之 RNN 及其变种 LSTM、GRU
    第10课:动手实战基于 CNN 的电影推荐系统
    第11课:动手实战基于 LSTM 轻松生成各种古诗
    第12课:完全基于情感词典的文本情感分析
    第13课:动手制作自己的简易聊天机器人
    第14课:动手实战中文命名实体提取
    第15课:基于 CRF 的中文命名实体识别模型实现
    第16课:动手实战中文句法依存分析
    第17课:基于 CRF 的中文句法依存分析模型实现
    第18课:模型部署上线的几种服务发布方式
    第19课:知识挖掘与知识图谱概述
    第20课:Neo4j 从入门到构建一个简单知识图谱
    第21课:中文自然语言处理的应用、现状和未来
    Chat:NLP 中文短文本分类项目实践(上)
    NLP 中文短文本分类项目实践(下)

    阅读全文: http://gitbook.cn/gitchat/column/5b10b073aafe4e5a7516708b

    展开全文
  • 给外行能看懂的科普:这就叫自然语言处理如何向文科同学科普自然语言处理(NLP)? 刘知远,NLPer前几年曾经马少平老师的引荐,为某科普图书写过一篇短文介绍自然语言处理。如果只是介绍NLP的概念、任务和挑战,...
  • 自然语言处理(NLP)相关学习资料/资源 书籍推荐 自然语言处理方面 1. 统计自然语言处理(第2版) 作者:宗成庆 出版社:清华大学出版社 出版年:2013 页数:570 内容简介:系统地描述了神经网络之前的基于统计的...
  • 自然语言处理实战入门

    千人学习 2019-03-15 15:21:29
    随着人工智能的快速发展,自然语言处理和机器学习技术的应用愈加广泛。要想快速入门这些前沿技术总是存在着各种各样的困难,本教程力求为同学们对该领域整体概况有一个明晰的认识,并选择网络爬虫,汉语分词,可视化...
  • 文章目录论述自然语言处理的技术范畴(基本全貌) 一、前言二、主要技术范畴1、语音合成(Speech Synthesis)2、语音识别(Speech Recognition)3、中文自动分词4、词性标注5、句法分析7、文本分类7、文本挖掘8、信息抽取9...
  • 从零开始自然语言处理

    千人学习 2019-08-07 14:38:22
    本课程隶属于自然语言处理(NLP)实战系列。自然语言处理(NLP)是数据科学里的一个分支,它的主要覆盖的内容是:以一种智能与高效的方式,对文本数据进行系统化分析、理解与信息提取的过程。通过使用NLP以及它的组件,...
  • 自然语言处理大体包括了自然语言理解和自然语言生成两个部分,实现人机间自然语言通信意味着要使计算机既能理解自然语言文本的意义,也能以自然语言文本来表达给定的意图、思想等,前者称为自然语言理解,后者称为...
  • 自然语言处理入门

    千次阅读 2019-07-28 19:57:36
    自然语言处理入门自然语言处理入门自然语言的概念自然语言的理解自然语言处理的概念自然语言处理的相关技术自然语言处理难点相关学习链接 自然语言处理入门 自然语言的概念 自然语言的理解 自然语言处理(NLP) ...
  • 自然语言处理十大应用

    千次阅读 2020-07-16 12:56:14
    自然语言处理是数据科学领域最热门的课题之一。公司在这一领域投入大量资金进行研究。每个人都在努力了解自然语言处理及其应用,并以此为生。 你知道为什么吗? 因为仅仅在短短几年的时间里,自然语言处理已经...
  • 自然语言处理(NLP)入门

    万次阅读 多人点赞 2017-11-21 20:32:26
    本文简要介绍Python自然语言处理(NLP),使用Python的NLTK库。NLTK是Python的自然语言处理工具包,在NLP领域中,最常使用的一个Python库。什么是NLP?简单来说,自然语言处理(NLP)就是开发能够理解人类语言的应用程序...
  • Tensorflow-自然语言处理

    千人学习 2018-04-01 09:52:29
    课程以Tensorflow作为机器学习的核心武器,基于自然语言处理热点话题进行案例实战。选择当下热门模型,使用真实数据集进行实战演示,通俗讲解整个算法模型并使用tensorflow进行实战,详解其中的原理与代码实现。
  • NPL自然语言处理

    2019-09-08 14:34:24
    一、自然语言处理 自然语言处理(natural language processing,NLP)也称自然语言理解(natural language understanding,NLU),从人工智能研发的一开始,它就作为这一学科的重要研究内容探索人类理解自然语言这一...
  • 自然语言处理定义: 自然语言处理是一门计算机科学、人工智能以及语言学的交叉学科。虽然语言只是人工智能的一部分(人工智能还包括计算机视觉等),但它是非常独特的一部分。这个星球上有许多生物拥有超过人类的...
  • 自然语言处理专题

    千次阅读 多人点赞 2019-01-21 11:49:28
    NLP,全名 Natural Language Processing(自然语言处理)。从 1949 年的机器翻译设计方案到如今比尔盖茨认为“自然语言理解是人工智能皇冠上的明珠” ,NLP 成为了人工智能领域的重要战略目标。有读者曾留言问道...
  • 自然语言处理Word2Vec视频学习教程

    万人学习 2017-06-21 22:39:12
    自然语言处理Word2Vec视频培训课程:自然语言处理中重要的算法,word2vec原理,词向量模型。教程从语言模型入手,详解词向量构造原理与求解算法。理论与实战结合,使用深度学习框架Tensorflow从零开始打造word2vec词...
  • 什么是自然语言处理自然语言处理(NLP)是指机器理解并解释人类写作、说话方式的能力。 NLP的目标是让计算机/机器在理解语言上像人类一样智能。最终目标是弥补人类交流(自然语言)和计算机理解(机器语言)之间...
  • Python自然语言处理-BERT模型实战

    千人学习 2019-10-21 21:54:40
    通俗讲解BERT模型中所涉及的核心知识点(Transformer,self-attention等),基于google开源BERT项目从零开始讲解如何搭建自然语言处理通用框架,通过debug源码详细解读其中每一核心代码模块的功能与作用。最后基于...
  • 自然语言处理实战——LSTM情感分析

    千人学习 2018-06-22 16:26:12
    自然语言处理实战视频教程,自然语言处理中重要的算法,词向量模型。本课程从语言模型入手,详解词向量构造原理与求解算法。理论与实战结合, 基于深度学习主流框架Tensorflow实例演示如何用深度学习来进行文本分类...
  • 自然语言处理简介

    千次阅读 2018-01-08 20:29:13
    自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门融语言学、计算机科学、数学于一体的科学。(百度百科定义)...
  • 自然语言处理综述

    千次阅读 2018-12-25 11:08:16
    本文从两篇论文出发先简要介绍了自然语言处理的基本分类和基本概念,再向读者展示了深度学习中的 NLP。这两篇论文都是很好的综述性入门论文,希望详细了解自然语言处理的读者可以进一步阅读这两篇论文。 第一部分...
  • 自然语言处理标记工具汇总

    万次阅读 2019-07-03 14:22:09
    自然语言处理标记工具汇总 整理了一些比较好用的自然语言处理标记工具,如有遗漏欢迎补充。 名称 年份 描述 协议 官网 github doccano 2019 doccano is an open source text annotation tool for human. It...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,132
精华内容 13,252
关键字:

自然语言处理