慕课网课程入门(自然语言处理入门课程与实战)

首页常识更新时间:2023-08-24 03:30:13

导读:随着人工智能的快速发展,自然语言处理和机器学习应用愈加广泛。但是对于初学者入门还是有一定难度,对于该领域整体概况不能明晰。本章主要从发展历程、研究现状、应用前景等角度整体介绍自然语言处理和机器学习,让读者对该技术领域有个系统而全面的认识。最后,结合一个模拟案例,阐述如何学习自然语言处理这门课程。

快速了解自然语言处理

什么是自然语言处理

自然语言

我们要对自然语言进行理解,其实就是我们日常使用的语言(书面文字和语音视频等)。简言之,汉语、日语、韩语、英语、法语等语言都属于此范畴。而自然语言处理是对自然语言处理的一种技术,就是通过我们的语音文字与计算机进行通信,我们称之为“人机交互”。

自然语言处理

自然语言处理(英语:Natural Language Processing,简称NLP)是人工智能和语言学领域的分支学科。此领域探讨如何处理及运用自然语言;自然语言认知则是指让电脑“懂”人类的语言。自然语言生成系统把计算机数据转化为自然语言。自然语言理解系统把自然语言转化为计算机程序更易于处理的形式。

自然语言处理发展历史和背景

自然语言处理发展背景

自然语言处理相关研究,最早是从机器翻译系统的研究开始的。20世纪60年代,国外对机器翻译曾有大规模的研究工作,投入了大量的人力物力财力。但是,受的客观历史因素的限制,当时人们低估了自然语言的复杂性,语言处理的理论和技术均不成热,所以进展并不大。其主要的做法是存储两种语言的单词、短语对应译法的大辞典,翻译时一一对应,技术上只是调整语言的同条顺序。但日常生活中语言的翻译远不是如此简单,很多时候还要参考某句话前后的意思。

我国机器翻译的起步较晚,是继美国、前苏联、英国之后世界上第四个开展机器翻译研究的国家。早在20世纪50年代机器翻译就被列入我国科学研究的发展规划。一些研究人员还进行了俄汉机器翻译实验,取得了一定的研究成果,但60年代的有关研究很快因“文革”而完全停顿。我国机器翻译研究的全面展开始于80年代中期以后,特别是90年代以来,一批机器翻译系统相继问世,其中影响力较大的有:中软总公司开发的汉英-汉日翻译系统(1993);中科院计算所研制的IMTEC英汉翻译系统(1992)等。

自然语言处理发展历史

思考?

基于规则的方法和基于统计的方法孰优孰劣?

自然语言处理涉及的学科领域

自然语言处理技术体系

![](https://i.imgur.com/BRZKLYB.png)

自然语言处理就业与发展前景

招聘网站:

![](https://i.imgur.com/jA843mB.png)

发展前景

思考:如何学习自然语言处理的问题?

- 综述了解,整体技术框架掌握 - 侧重方向,多看论文和会议文章 - 知其原理,重在实际应用 - 归纳总结,提高研究效率 - 资料检索,高效学习效率

基础知识介绍

NLP与数学

线性数学

自然语言处理是以计算机科学、统计学、数学和信息论等多个领域交叉的学科。线性代数又是数学的一个重要分支,对自然语言处理有着很直接的影响。诸如:算法建模、参数设置、验证策略、识别欠拟合和过拟合等等。读者往往知道线性代数很有用,常常全书通读。造成时间不足和效率较低。归因于对线性代数在机器学习中的重点和用途不明。本章主要以简明的方式介绍最常用的线性代数知识,并使读者知道线性代数常用于哪些方面。

概率论

由于基于规则方法向基于统计方法的转型,概率就显得尤为重要,诸如一些随机事件、独立假设、条件概率、完全概率等等。然后对贝叶斯模型进行案例式介绍,旨在读者深度理解。

NLP与统计学

在数据科学中,统计地位尤为显著。其在数据分析的基础上,研究如何测定、收集、整理、归纳和分析反映数据规律,以便给出正确消息的科学。通过揭示数据背后的规律和隐藏信息,给相关角色提供参照价值,做出相应的决策。这在数据挖掘、自然语言处理、机器学习都广泛应用。

百度EChart:http://echarts.baidu.com/examples/

地图案例应用场景

适合的场景

不适合的场景

统计可视化

图5-9 iphone销量地图

NLP与机器学习

什么是机器学习

机器学习就是指“计算机利用经验自动改善系统自身性能的行为”。简言之,机器学习是指通过计算机学习数据中的内在规律性信息,获得新的经验和知识,以提高计算机的智能性,使计算机能够像人那样去决策。机器解决问题能力的增强主要表现在:初始状态下,对于问题Q,机器给出结果A,该机器在解决问题{Q1,Q2,… ,Qn}后,再次遇到问题Q时给出结果A1,而结果 A1比结果A更精确,我们就说机器解决问题的能力得到了增强。

机器学习发展简史

自然语言处理和机器学习的联系

语言是人类区别其他动物的本质特性。在所有生物中,只有人类才具有语言能力。人类的多种智能都与语言有着密切的关系。人类的逻辑思维以语言为形式,人类的绝大部分知识也是以语言文字的形式记载和流传下来的。因而,它也是人工智能(机器学习和深度学习为代表的人工智能)的一个重要,甚至核心部分。

用自然语言与计算机进行通信,这是人们长期以来所追求的。因为它既有明显的实际意义和理论意义。实现人机间自然语言通信意味着要使计算机既能理解自然语言文本的意义,也能以自然语言文本来表达给定的意图、思想等。前者称为自然语言理解,后者称为自然语言生成。因此,自然语言处理大体包括了自然语言理解和自然语言生成两个部分。无论实现自然语言理解,还是自然语言生成,都远不如人们原来想象的那么简单,而是十分困难的。从现有的理论和技术现状看,通用的、高质量的自然语言处理系统,仍然是较长期的努力目标,但是针对一定应用,具有相当自然语言处理能力的实用系统已经出现,有些已商品化,甚至开始产业化。典型的例子有:多语种数据库和专家系统的自然语言接口、各种机器翻译系统、全文信息检索系统、自动文摘系统等。

现代NLP算法是基于机器学习,特别是统计机器学习。机器学习范式是不同于一般之前的尝试语言处理。语言处理任务的实现,通常涉及直接用手的大套规则编码。许多不同类的机器学习算法已应用于自然语言处理任务。

案例:NLP技术实现预测天气冷暖感知度

机器学习算法中KNN属于比较简单的典型算法,既可以做聚类又可以做分类使用。通过一个模拟的实际案例进行讲解。整个流程包括:采集数据、数据格式化处理、数据分析、数据归一化处理、构造算法模型、评估算法模型和算法模型的应用。

案例需求

需求描述

现在你来了一个新的任务,任务其实非常简单,就是根据吃冰淇淋和喝水的数量判断成都天气冷热程度。你现在要做的就是去成都春熙路街头采访记录一些游客吃了多少冰淇淋,又喝了几瓶水,他觉得成都天气怎么样(这里只考虑二分类问题,假设只有‘非常热’和‘一般热’)。其中特征向量包括两个分别是冰激凌数t1和喝水数t2,标签类别分别是非常热A和一般热B。

数据准备

创建模拟数据集

现在我们开始行动,随机采访4个游客(暂时不考虑样本数量问题),询问每个游客吃多少冰淇淋、喝多少水、户外活动小时数等(两个整型的特征向量,一个文本向量,不考虑特征重要程度),并记录下他们口中的成都天气感受(非常热A与一般热B)。然后通过采访数据训练一个KNN分类器,新的游客只需要说出特征向量自动判别成都天气冷热程度。创建模拟数据集代码如下:

'''KNN创建数据源,返回数据集和标签''' def create_dataset(): group = array([[8,4,2],[7,1,1],[1,4,4],[3,0,5]]) labels = ['非常热','非常热','一般热','一般热'] # 标签 return group,labels

运行查看数据集的特征向量和分类标签:

'''1 KNN模拟数据分类算法''' dataset,labels = create_dataset() print('特征集: ' str(dataset)) print('标签集: ' str(labels))

运行结果:

特征集: [[8 4 2] [7 1 1] [1 4 4] [3 0 5]] 标签集: ['非常热', '非常热', '一般热', '一般热'] 耗时:0.0010 s

分析解读:

本段代码没有实际意义,只是帮助读者理解特征向量和分类标签。可以这么理解,A代表非常热,B代表一般热,属性1代表吃冰淇淋数量,属性2代表喝水的数量。那么样本数据可以解读为:

思考:

计算机是不能直接处理自然语言,往往需要将自然语言转化成特征向量,再通过计算机处理。比如这里不是吃喝看天气情况了,而是垃圾邮件自动识别,我们就需要对邮件转化成数值型特征向量再输入计算机进行处理。

数据可视化

基于matplotlib的可视化分析

我们对数据处理后,很不容易进行数据分析。毕竟密密麻麻的数字略显冰冷无趣。我们可以将其可视化展示出来,进而查看数据稀疏程度,离散程度等等。我们查看’玩游戏所耗时间百分比’,'每周消耗在冰淇淋的公升数’两个属性的散点图,实现代码如下:

''' 散列表分析数据: dataset:数据集 datingLabels:标签集 Title:列表,标题、横坐标标题、纵坐标标题。 ''' def analyze_data_plot(dataset,datingLabels,Title): fig = plt.figure() # 将画布划分为1行1列1块 ax = fig.add_subplot(111) ax.scatter(dataset[:,0],dataset[:,1]) # 设置散点图标题和横纵坐标标题 plt.title(Title[0],fontsize=25,fontname='宋体',fontproperties=myfont) plt.xlabel(Title[1],fontsize=15,fontname='宋体',fontproperties=myfont) plt.ylabel(Title[2],fontsize=15,fontname='宋体',fontproperties=myfont) # 设置刻度标记大小,axis='both'参数影响横纵坐标,labelsize刻度大小 plt.tick_params(axis='both',which='major',labelsize=10) # 截图保存图片 # plt.savefig('datasets_plot.png',bbox_inches='tight') # 显示图形 plt.show()

这里注意一个问题,横纵坐标是乱码显示,解决这个问题,添加如下代码:

#加入中文显示 import matplotlib.font_manager as fm # 解决中文乱码,本案例使用宋体字 myfont=fm.FontProperties(fname=r"C:\Windows\Fonts\simsun.ttc")

调用可视化数据分析方法如下:

'''2 文件数据图形化分析数据 ''' title = ['游客冷热感知散列点','天热吃冰淇淋数目','天热喝水数目'] analyze_data_plot(dataset,labels,title)

游戏占比与冰淇淋公升数关系散点图可视化:

![](https://i.imgur.com/fEQlGLo.png) 图2-2 游戏占比与冰淇淋公升数关系散点图

扩展:

更多matplotlib可视化实现效果图参考文章 70个注意的Python小Notes:完整的matplotlib可视化

基于Echart的可视化分析

我们上面采用的matplotlib可视化效果,采用该方式主要是结合python数据分析绑定比较方便。有些时候我们为了取得更加漂亮的可视化效果,可以选择百度echart进行分析,百度Echart使用简单且文档规范容易上手。我们对原数据进行分析并转化为json代码:

'''array数据转化json''' def norm_Json(dataset): number1 = np.around(dataset[:,0], decimals=4) # 获取数据集第二列 number2 = np.around(dataset[:,1], decimals=4) # 获取数据集第三列 returnMat=zeros((dataset.shape[0],2)) # 二维矩阵 returnMat[:,0] = number1 returnMat[:,1] = number2 file_path = os.path.abspath(r"./test.json") json.dump(returnMat.tolist(), codecs.open(file_path, 'w', encoding='utf-8'), separators=(',', ':'), sort_keys=True, indent=4)

生成json数据保存在指定文件中,打开文件查看数据如下:

[ [ 8.0, 4.0 ], [ 7.0, 1.0 ], [ 1.0, 4.0 ], [ 3.0, 0.0 ] ]

从百度Echart实例中选择一种散点图并绑定json文件,其html代码如下:

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>图案例</title> <script src="//img.anhuiqq.cn/https://cdn.bootcss.com/jquery/2.2.0/jquery.min.js"></script> <script type="text/javascript" src="//img.anhuiqq.cn/./js/echarts.js"></script> <script type="text/javascript" src="//img.anhuiqq.cn/./js/dark.js"></script> </head> <body> <div id="chartmain" style="width:800px; height: 400px; margin:auto; "> </div> <script type="text/javascript"> //初始化echarts实例 var myChart = echarts.init(document.getElementById('chartmain')); var option = { title: { text: '天热吃冰淇淋数目和天热喝水数目数据分析', left: 'center', top: 0 }, visualMap: { min: 0, max: 1, dimension: 1, orient: 'vertical', right: 10, top: 'center', text: ['非常热', '一般热'], calculable: true, inRange: { color: ['#f2c31a', '#24b7f2'] } }, tooltip: { trigger: 'item', axisPointer: { type: 'cross' } }, xAxis: {}, yAxis: {}, series: [{ name: '冰淇淋-喝水', type: 'scatter', symbolSize:15, data: [[8.0,4.0], [7.0, 1.0],[ 1.0, 4.0 ],[ 3.0, 0.0 ]] }] }; myChart.setOption(option); </script> </body> </html>

json文件读取需要在web运行环境中,单纯的运行效果如下图所示:

数据转化工具

本文采用自己构建的方式进行json文件生成,此外我们也可以采用现有的数据转化工具进行处理。比如百度的表格数据转化工具(2.2节已经介绍了)。

另一个便是在线json验证格式工具:http://www.bejson.com/

选择算法模型及其原理

什么是KNN?

k-近邻(kNN,k-NearestNeighbor)算法是一种基本分类与回归方法,我们这里只讨论分类问题中的 k-近邻算法。k-近邻算法的输入为实例的特征向量,对应于特征空间的点;输出为实例的类别,可以取多类。k-邻算法假设给定一个训练数据集,其中的实例类别已定。分类时,对新的实例,根据其 k 个最近邻的训练实例的类别,通过多数表决等方式进行预测。因此,k近邻算法不具有显式的学习过程即属于有监督学习范畴。k近邻算法实际上利用训练数据集对特征向量空间进行划分,并作为其分类的“模型”。k值的选择、距离度量以及分类决策规则是k近邻算法的三个基本要素。

KNN算法思想

1 计算已知类别中数据集的点与当前点的距离。[即计算所有样本点跟待分类样本之间的距离] 2 按照距离递增次序排序。[计算完样本距离进行排序] 3 选取与当前点距离最小的k个点。[选取距离样本最近的k个点] 4 确定前k个点所在类别的出现频率。[针对这k个点,统计下各个类别分别有多少个] 5 返回前k个点出现频率最高的类别作为当前点的预测分类。[k个点中某个类别最多,就将样本划归改点]

KNN工作原理

1 假设有一个带有标签的样本数据集(训练样本集),其中包含每条数据与所属分类的对应关系。 2 输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较。 3 计算新数据与样本数据集中每条数据的距离。 4 对求得的所有距离进行排序(从小到大,越小表示越相似)。 5 取前 k (k 一般小于等于 20 )个样本数据对应的分类标签。 6 求 k 个数据中出现次数最多的分类标签作为新数据的分类。

KNN算法流程

1 搜集数据:数据采集过程,其分为非结构化数据,半结构化数据和数据化数据。诸如:网络爬取,数据库,文件等。 2 准备数据:格式化处理,对不同类别的数据进行统一的格式化处理。诸如:将pdf,word,excel,sql等等统一转化为txt文本。 3 分析数据:主要看看数据特点,有没有缺失值,数据连续性还是离散型,进而选择不同模型。诸如:可视化数据分析 4 训练数据:不适用于KNN,但是在其他一些监督学习中会经常遇到,诸如:朴素贝叶斯分类等。 5 测试算法:评价指标,如计算错误率,准确率,召回率,F度量值等。 6 应用算法:针对完善的模型进行封装重构,然后进行实际应用。

KNN优缺点

优点:精度高、对异常值不敏感、无数据输入假定 缺点:计算复杂度高、空间复杂度好 适用数据范围:数值型和标称型

算法模型构建与实现

通过数据分析,我们查看数据样本是否偏态分别,数据规模情况等等。针对性进行数据预处理后,编写具体算法模型。本文主要是KNN分类器,其代码如下:

''' 构造KNN分类器 vecX:输入向量,待测数据 filename: 特征集文件路径 isnorm:是否进行归一化处理 k:k值的选择,默认选择3 ''' def knn_classifier(vecX,dataset,labels,k=3): dataSetSize = dataset.shape[0] # tile方法是在列向量vecX,datasetSize次,行向量vecX1次叠加 diffMat = tile(vecX,(dataSetSize,1)) - dataset sqDiffMat = diffMat ** 2 sqDistances = sqDiffMat.sum(axis=1) # axis=0 是列相加,axis=1是行相加 distances = sqDistances**0.5 # print('vecX向量到数据集各点距离: ' str(distances)) sortedDistIndexs = distances.argsort(axis=0) # 距离排序,升序 # print(sortedDistIndicies) classCount = {} # 统计前k个类别出现频率 for i in range(k): votelabel = labels[sortedDistIndexs[i]] classCount[votelabel] = classCount.get(votelabel,0) 1 #统计键值 # 类别频率出现最高的点,itemgetter(0)按照key排序,itemgetter(1)按照value排序 sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) # print(str(vecX) 'KNN的投票决策结果: ' str(sortedClassCount[0][0])) return sortedClassCount[0][0]

算法优化与应用

knn分类器应用

经过如上的改进最终形成实际应用的算法模型API开发给外部程序使用,调用knn算法代码如下:

'''调用可用算法''' def show_classifyPerson(): iceCream = float(input('Q:请问你今天吃了几个冰淇淋? ')) drinkWater = float(input('Q:请问你今天喝了几瓶水? ')) palyAct = float(input('Q:请问你今天在户外活动几个小时? ')) dataset,labels = create_dataset() # 数据格式化处理 inArr = array([iceCream,drinkWater,palyAct]) classifierResult = knn_classifier(inArr,dataset,labels,3) # 数据归一化并进行分类 print("该访客认为成都天气是:" classifierResult)

运行结果如下:

Q:请问你今天吃了几个冰淇淋? 5 Q:请问你今天喝了几瓶水? 3 Q:请问你今天在户外活动几个小时? 1 该访客认为成都天气是:非常热 耗时:8.1050 s

寄语

机器学习比较偏底层和理论,机器学习本身不够炫酷,结合了具体的自然语言处理以及数据挖掘的问题才能炫酷。机器学习好像内力一样,是一个武者的基础,而自然语言和数据挖掘的东西都是招式。如果你内功足够深厚,招式对你来说都是小意思。但机器学习同时也要求很高的数学基础,现在如果我们只讲工程实现,有很多开源工具可以使用,你所需要的只是知道这些工具都是干嘛用的就好,很多中国本科生对机器学习特别特别特别的狂热,但对矩阵,概率论又有着老子早不想念这门课了,终于过了的思想。我一直觉得,如果你真的矩阵,概率,微积分学的不好,早日勤动手,多编程,对日后找工作很有利!!!一定不要舍本逐末的放弃了程序员最基础的编程功夫。

后面会出数据预处理、数据分析、常见机器学习、深度学习等实战课程,有兴趣的同学可以来关注,如果是有什么需求或者是建议,也可以在评论区评论,我们会考虑加进去…之类的话

作者:伏草惟存

来源:慕课网

本文原创发布于慕课网 ,转载请注明出处,谢谢合作

,
展开阅读全文
推荐内容
热门内容
热门文章

© 2007-2022 http://www.anhuiqq.cn,All Rights Reserved.