🌈 个人主页:十二月的猫-CSDN博客
🔥 系列专栏:🏀山东大学期末速通专用_十二月的猫的博客-CSDN博客💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光
目录
10. 第十一章 语言模型(统计语言模型、神经网络语言模型)
1. 第二章 网络爬虫
爬虫的三个任务:
- 输入URL,爬取网页内容(HTML)
- 网页解析(从HTML中获得想要的东西)
- 数据存储
1.1 爬虫基础知识
- 爬虫定义:一种自动获取网页内容的程序,通过解析HTML源码获得想要的内容。
- 爬虫过程:1.选择一个或多个URL作为seed url;2.获取URL中的文档内容;3.解析文档内容,判重后选择性保留;4.提取文档中指向其他网页的URL,在判重后选择性放入队列中;5.从队列中持续选择URL并重复2.3.4步骤。
- 判重技术(URL判重、文档判重):1.文档指纹:每一个文档生成一个指纹用来快速判重吗,例如MinHash,SimHash算法;2. URL判重:建立散列存放访问过的网址。例如MD5等散列函数。
- 爬虫必须具有的功能:礼貌性(显式和隐式礼貌、robots协议)、鲁棒性、性能和效率、分布式、新鲜度、功能可拓展性
- 性能和效率:性能考虑充分利用系统资源的程度;效率考虑是否优先爬取“有用的网页”。爬取网页的方式分为BFS和DFS。
- BFS爬取网页优于DFS:可以在有限时间内爬取更重要的网页(我们认为一个网站的首页最重要)。
- DFS爬取网页优于BFS:避免握手次数太多,提升性能(一个网站一般只用一个服务器搭建,如果一直在该网站深度爬取,则只要握手一次)。
- 分布式(意味着多台机器一起爬虫,那他们的哈希表就要共享)带来的问题:1、分布式后有很多机器,用于判重的哈希表太大一台服务器放不下;2、每台下载服务器都要维护一张哈希表,通信就成了分布式系统的瓶颈。
- 分布式问题解决:1、明确下载服务器的分工,看到某个URL就知道要交给哪台服务器执行;2、批量处理,减少通信次数。
1.2 爬虫分类
- 基于整个web的信息采集(门户搜索引擎和大型web服务提供商才会去干)
- 增量式web信息采集
- 用户个性化Web信息采集
- 主题Web信息采集
1.3 开源工具 Nutch
Nutch是一个基于整合Web的信息采集工具:
- 多线程
- 宽度优先
- 遵循机器人协议
- 采用socket连接
- 边爬取边解析
- 页面评分
2. 第三章 网页分析
爬虫包括:选择URL、获取网页、网页分析、数据存储。
网页分析:基于网页HTML文档格式,从每个HTML中抽取相关信息。角度有三个:1.将HTML看作字符流,使用正则表达式从字符中提取信息;2.将HTML看作树结构,使用DOM树来提取信息;3.使用外部工具来提取信息
2.1 正则表达式
定义:正则表达式是对字符串操作的一种逻辑公式。就是用实现定义好的一些特定字符进行组合,根据自己想要提取的字符串特点按照逻辑定义好一个“规则字符串”,用来表达对字符串的一种过滤逻辑。
如何使用正则表达式:用多种元字符与运算符将小的表达式结合在一起来创建更大的表达式。
基于正则表达式的网页分析:
- 获取数据前(网页分析)去除无用部分
- 提取网页内的链接
- 提取网页标题
- 提取网页内的文本
正则表达式匹配的特点:
- 正则表达式匹配速度快。
- 表达能力弱,只有正规文法的表达能力。
- 在网页内容信噪比要求不高的情况下可以使用基于正则表达式的网页分析。网络噪声:导航元素、广告、用户交互模块、无关文本块。
2.2 DOM模型
DOM是什么:
- DOM(文档对象模型)是处理结构化文档的一个模型,其可以将文档转化为树结构存储,从而实现任意处理该对象,这称为“随机访问”机制。
- DOM将HTML处理为树状结构,然后所有的元素以及他们的文字和属性都可以通过DOM树来操作和访问。
DOM与正则表达式比较:
- 正则表达式匹配速度快,但表达能力弱,相当于正规文法。
- DOM在解析HTML时速度慢,但其表达能力相当于上下文无关文法。
- 正则表达式适用于信噪比要求不高时;网页自动分类等需要进行网页去噪处理时用DOM树。
jsoup、HTMLParser等HTML解析器用于解析树,是DOM模型的一部分。
2.3 Beautiful Soup工具
定义:是一个工具箱,为用户解析文档得到想要抓取的数据提供工具。
主要工具如下:
- 从HTML文档构造DOM树
- 构造DOM树可以选择解析器:1.自带的html.parser(速度慢但通用);2.HTML5Lib(不规范html文本不行);3.lxml(python解析库;适用于html和xml解析;解析效率高;只会局部遍历);
编码方式:
- 中文操作系统默认:ANSI编码
- Unicode:国际通用编码
- utf8:是Unicode编码在网络传输的一个变体,节约数据量
Beautiful Soup工具优缺点:
- 操作简单,使用方便。
- 在操作过程中,会将整个文档树都进行加载,然后再查询匹配,因此消耗资源较多。
2.4 Scrapy框架
Scrapy是一个快速、高层次的屏幕抓取和Web抓取框架;框架意味着整个或部分系统以及思想都是可以复用的,仅仅需要修改/编写部分代码即可实现爬虫。
- 引擎:负责数据和信号在不同模块间传递(总指挥)。
- 调度器:一个队列,存放引擎发过来的request请求。
- 下载器:处理引擎发送过来的request请求(其实是调度器发来的),并将结果返回给引擎。
- 爬虫:处理引擎发送过来的respond(其实是下载器发来的),并将结果返回给引擎。
- 管道:接受引擎传过来的数据(其实是爬虫处理的结果)。
- 下载中间件:自定义下载拓展。
- 爬虫中间件:自定义respond和request请求的过滤。
Scrapy实现了底层多线程请求,异步网络框架处理网络通讯。
制作Scrapy爬虫需要四步:
- 新建项目:新建爬虫项目(scrapy genspider 爬虫名 域名)
- 明确目标:编写items.py,明确要抓取的目标
- 制作爬虫:制作爬虫开始爬取网页
- 存储内容:创建管道存储爬取的内容
我们需要手动写的只有Item和spider:
用户关心的只有自己想要爬什么东西,这些东西怎么存下来,其他的部分都不关心。
一、CSV文件
特别的,CSV文件是目前比较流行的一种文件存储格式(以逗号为间隔)
二、yield返回
yield是一种特殊的return方法。两者都会返回后面的值但是存在下面不同:
- return一次性返回所有的值,并销毁局部变量;yield返回的是一个迭代器,里面包括所有yield的值。
- return后程序停止运行;yield后程序继续运行。
三、meta字典使用
若解析的数据不在同一张页面中,可以通过meta参数来传递数据。在向下一页发起请求的时候,将本层数据以meta形式传入,那么下一页的返回response中就会有meta字典的数据。
2.5 不同爬虫工具比较
爬虫包括以下几个方面:
- 页面信息获取
- 页面信息解析
- 数据存储
前面介绍了几个不同的爬虫工具,不同工具在上面三个方面存在不同。包括:
- 利用request直接获取页面,然后使用正则表达式解析html获取想要的东西,存储数据。
- 利用request获取页面,使用bs4来解析html建立DOM树,直接获得想要的东西。
- 利用scrapy框架获取信息,解析信息,存储信息。
request和bs4:
- 页面级爬虫,功能库
- 并行性考虑不足,性能较差
- 初学容易上手
- 大型开发比较麻烦,需要自己造轮子
- 重点在于页面下载
scrapy:
- 网站级爬虫,框架
- 并行性考虑好,性能高
- 初学比较麻烦
- 大型开发比较容易,很多轮子和功能都是已经封装好的
- 重点在于爬虫结构
2.6 元搜索引擎
通过一个统一的用户界面帮助用户在多个搜索引擎中选择和利用合适的搜索引擎来实现检索,是对分布于网络的多种检索工具的全局控制机制。
- 元搜索引擎 == 一个搜索引擎包含多个搜索引擎
- 结果合并 和 结果筛选/处理
3. 第四章 爬虫与网站的博弈
反爬虫策略:希望能够在用户面前正常显示,同时不给爬虫显示。
后端策略:
- user-agent检测
- referer检测
- cookie检测和账号密码检测
- IP限制批次
前端策略:
- 懒加载
- FONT-FACE拼凑式:对于数字不直接展示,而是需要查询字符集才能识别数据
3.1 Robot协议
- 也称为爬虫协议、机器人协议等
- 网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不可以抓取
3.2 User-agent
简称UA,是HTTP请求头的一部分,向网站提供访问者的信息,包括:浏览器类型、语言、操作系统、CPU类型等等。每次请求都会发送给服务器,通过这个标识,服务器能够提供不同排版适应不同的浏览器给用户更好的体验。
3.3 IP屏蔽
网站策略:
- 同一个IP频繁访问,封IP
- 限制某些IP访问
爬虫策略:
- 多IP并行
- 使用IP代理池
- 增大爬取时间间隔
- 代理池:从各大网站上爬取可用IP,定期检查是否可用。
3.4 用户账号密码登录与cookie验证
流程:
- 通过第一个网页提交用户名和口令。
- 后端接受请求后生成cookie,和其他信息一起发给用户。
- 用户保存cookie,从文件中读取,在访问其他页面时携带cookie信息。
工具:
- cookiejar
Cookie:
- 记录了用户ID、密码、浏览过的网页、停留的时间等信息
- 小文本文件,服务器在HTTP响应头中发送给用户浏览器,浏览器保存在本地,用于维护客户端与服务端的状态。
3.5 模拟浏览器
- selenium:模拟用户进行交互,登录输入,键盘动作,鼠标动作,ajax响应等等。
- ajax:传统网页如果需要更新就要加载整个页面,使用AJAX可以异步加载页面。
这就导致了爬虫程序并不知道元素何时加载。因此如果还未加载就去定位爬取则会出现问题,selenium提供了三种等待方式:强制、显式、隐式等待:
3.6 懒加载
定义:为了避免页面一次性向服务器发送大量请求导致问题,可以采用预加载和懒加载。懒加载是指在对象需要时再加载,可以提升前端性能也可以反爬虫
实现原理:
爬虫策略:
- 简单方法:寻找data、src2等暂存器属性。
- 模拟浏览器方法:通过selenium去模拟浏览器页面上下滑动,然后获取src。
Selenium优点:
- 模拟浏览器操作,可以直接获得渲染后真正的网页代码。
- 绕过Ajax和一些JavaScript逻辑。
Selenium缺点:
- 速度太慢。
- 经常会更新。
- 太老的东西了,很多网站有针对Selenium的反爬。
3.7 验证码
图片识别验证码:
- 获取图片:Selenium可以通过尺寸坐标定位到图片。然后截图获取。
- 图片处理:Pillow和PIL模块可以对图片做很多处理,方便下面的OCR。
- OCR:光学字符识别,将图像中的文字转化为文本。
滑动验证码:
- 判断验证码什么时候出现。
- 验证码出现时,判断何时加载完成。
- 自动识别出鼠标拖拽的初始位置和终止位置。
- 模拟鼠标拖动。
- 检验是否成功。
Selenium获取初始位置和终止位置的方法:
- 获取不带缺口的图片,再获取带缺口的图片。比较两种图片各个坐标的灰度值,找到初始位置和终止位置,进行滑动。
- 滑动不能过于匀速,同时要伴随y轴上下抖动。 由于selenium是在后台完成的滑动,而有些平台会检测鼠标光标未移动,可以使用PyAutoGUI。
- 假如不能获得不带缺口的图片,则可以将缺口图片和滑块进行图像匹配。
4. 第五章 数据抽取与包装器
信息抽取:把文本里包含的信息进行结构化处理,变成表格一样的组织形式。输入是原始文本;输出是固定格式的信息。
信息抽取包括:实体抽取、关系抽取、事件抽取(多元关系)。
4.1 信息抽取
实体抽取NER:
- NER是NLP中一项非常基础的任务。NER是信息抽取、问答系统、句法分析等众多NLP任务的重要基础工具。
- 从狭义来说实体是指现实世界中的具体或抽象实体;广义来说包含时间、数量表达式。
- NER是一种序列标注问题。
关系抽取:
- 句法分析
事件抽取:
- 知识获取
4.1 Web信息抽取
Web信息抽取是将Web作为信息源的一类信息抽取,就是从半结构化的Web文档中抽取信息。其核心:
- 将分散Internet上的半结构化的HTML页面中隐含的的信息点抽取出来。
- 并将其转化为更加结构化语义更清晰的形式表示。
- 为用户在Web中查询数据,应用程序直接利用Web中的数据提供便利。
通常包括一下几个步骤:
- 将Web网页进行预处理
- 用一组信息模式描述所要抽取的信息
- 使用模式匹配方法识别指定的信息模式的各个部分
- 对文本进行合理的词法、句法及语义分析
- 进行上下文分析和推理,确定信息的最终形式
- 将结果输出成结构化的描述形式以便于查询分析
4.2 Web数据抽取
基本前提:包含数据的页面是通过页面模板生成的。
4.2.1 Web数据抽取定义
Web数据抽取是指从页面中将用户感兴趣的数据利用程序自动抽取到本地的过程。为了能够保证抽取的准确性,必须能够识别页面模板:
- T是页面模板。W=T(d),W为页面,d为数据。
- C是相似页面之间不变的部分,包括导航、版权声明等。
- L是页面的格式规范(数据的格式规范)。
- S是从页面数据中观察到的数据模式。
4.2.2 Web页面定义
- Web数据抽取问题可以转化为从已知的W中逆向推导出T,然后还原出D的部分。
4.3 包装器
包装器是一个软件过程。过程:工程开发中的最佳实践称为过程。
- 这个过程使用已经定义好的信息抽取规则,将Web页面中的信息数据抽取出来,转化为结构化的格式去描述。
- 因为是最佳实践,因此一个包装器一般仅仅针对某一种数据源中的一类页面。
- 包装器运用规则执行程序对实际要抽取的数据源进行抽取。
- 包装器的核心是抽取规则。抽取规则的定义取决于你怎么看待HTML文档。
4.3.1 基于分界符规则
角度:将HTML文档看作字符流
方法:给出数据项的起始和结束分界符,将其中的数据抽取出来
例如:某一个数据项的起始规则是"SkipTo<i>“,结束规则是"SkipTo</i>”。意味着从文档的起始忽略所有的字符直至找到HTML标签 <i>,接着,忽略所有字符直至 </i>,中间部分即所需的字符串。
另外:基于正则表达式的网页分析。
4.3.2 基于树路径规则
角度:将HTML文档看作树结构
方法:将文档看作树结构,将所抽取的数据存储在树节点中
- 首先根据HTML标签将文档分析成树结构,如DOM树
- 然后通过规则中的路径在树中搜索相应的节点
- 最终找得到所需数据
4.3.3 包装器分类
爬虫分为三步骤:
- 下载页面
- 页面数据提取
- 数据存储
手工方法:爬虫
包装器归纳:使用机器学习的方法产生抽取规则,属于有监督学习:
- 网页清洗:有些页面结构不规范,例如前后标签不对称,没有结束标签等。
- 网页标注:给网页中的某个位置打上特殊标签表明这是要抽取的数据。
- 包装器空间生成:对标注数据生成XPath集成空间(候选规则);对生成的规则进行归纳,形成若干个子集;归纳的规则是在子集中XPath能够覆盖多个标注的数据项。
自动抽取:通过挖掘多个数据记录中的重复模式来寻找这些模板,是无监督模型,步骤:
- 包装器训练:将一组网页通过聚类将相似的网页分成若干组;每组的页面获得不同的包装器。
- 包装器应用:将需要抽取的网页和之前聚类后的网页进行比较;在某个分类组下则使用该分类下的包装器来获取网页中的信息。
4.2 Web数据抽取方法
Web数据抽取目的是获得页面数据,需要借助一个或多个页面的逆向推导得到页面模板T。
按照自动化程度来区分可以分为:
1. 人工抽取:
- 人工分析出页面模板(XPATH、正则表达式)(页面模板+抽取规则=包装器)。
- 针对具体问题生成具体的包装器(人工包装途径容易采纳,在具体问题上可以得到满意的结果)。
- 只适合小规模的即时的数据抽取,不适合大规模的数据抽取。
2. 半自动抽取:
- 由计算机页面模板抽取数据生成具体的包装器,但页面模板分析还需要人工参与。
- 设计一个描述页面模板的概念模型和一套用来描述抽取意图的规则语言,用户通过一定的辅助工具利用概念模型分析出页面模板,使用规则语言表面抽取意图。
- 计算机根据分析出的页面模板和抽取意图,生成包装器,完成抽取。
- 这种途径比手工包装更加系统化,能大大减少工作量。
3. 自动抽取:
- 仅仅需要很少的人工参与或者完全不需要人工参与。
- 更加适合大规模、系统化、持续性的Web数据抽取。
- 自动抽取工作中,页面模板的分析通过序列匹配、树匹配或利用可视化信息完成,并且直接给出抽取结果。
4.3 Web数据抽取评价标准
- 召回率:抽取到的正确结果和要抽取页面的全部结果的比,即 R=|Ra| / |R|。
- 准确率:指抽取到的正确结果和抽取到的全部结果的比,即 P=|Ra| / |A|。
- F 值:召回率R和查准率P的加权调和平均值,综合考虑了二者
- 抽取的自动化程度:这项标准用来衡量用户在抽取过程中的参与程度,分为手工、半自动和全自动三类。
- 适应性:指在该页面的内容和结构有较小变化的情况下,该抽取方法或工具有自适应能力,仍然能够正常工作。
- 修正率:其含义是需要手工调整使得准确率和召回率达到100%的Web数据库数量。
5. 第六章 包装器页面抽取方法
第五章本质上是在带大家入门一下数据抽取的概念,以及包装器的概念。然后简单说了包装器按自动化程度分为人工编写、半自动化编写、全自动化编写;按实现方法分为人工编写、包装器归纳、自动生成。本章我们会真正来带大家看看如何用包装器来实现页面抽取。首先从人工编写(爬虫)方法生成包装器完成数据抽取和信息抽取开始!!!
5.1 网页分类
想要实现手工编写,我们首先要对网页进行一个分类,不同类型的网页使用不同的包装器方法去提取信息和数据。
按照页面内数据组织形式的不同分为:
1.单记录页面(页面中仅仅嵌入一个记录):
- 详情页 A Authority
- 每一页只关注一个特定对象,也有其他相关和无关信息
2.多记录页面(页面嵌入多个记录):
- 同结构的记录在页面内重复排列出现。
- 列表页 H。列表在页内的特定位置。每一页有多个数据记录。
按照页面内容的不同分为:
1.数据型页面(页面内容是数据):
- 页面中嵌入了一个或多个结构化的数据记录。
- 页面展示的是带有属性标签和数据值的信息。
- 数据记录按照一定的格式规范和属性次序被载入在页面中。
2.文档型页面(页面内容是文档):
- 页面嵌入的是半结构化文档内容或文档标题。
- 页面展示的是文本型信息。
两个不同角度的分类合起来总共有四种页面类型:
- 单记录数据型页面
- 多记录数据型页面
- 单记录文档型页面
- 多记录文档型页面
5.2 多记录数据型页面的抽取方法
多记录数据型页面是指页面由多条结构相同的数据记录组成,抽取方法:
- 首先从网页中识别数据记录边界,抽取数据记录
- 从数据记录中抽取数据项
1. 数据记录抽取 == 抽取数据 == 获得页面模板 == 逆推导
2. 数据记录抽取 == 抽取数据 == 直接抽取数据
章节逻辑:
5.2.1 数据记录抽取
人工处理包装器也就是爬虫。主要有两个角度的思路:1.看成字符流用正则表达式;2.看成树结构用DOM树完成。这里我们想要从树结构角度去看看怎么抽取数据记录。抽取数据记录步骤如下:
- 确定数据区域:比较DOM树算法、语义块算法
- 计算数据记录的边界:利用规则得到数据记录
确定数据区域:
方法1·比较DOM树算法:从两颗DOM树根节点开始递归深度遍历,如果两个节点相同则递归下一层,否则标记为不同子树返回上一层。
方法2·语义块算法:
语义块:HTML文档的片段,是逻辑上满足模式定义的一个HTML文档子集。一个语义块可以进一步划分为最小语义块。最小语义块是包装器在生成和维护中的最基本抽取单位。
方法:计算数据记录边界本质上就是确定语义块所在的层次。首先初始化DOM树的路径组;从DOM树根开始逐棵子树去考察,不断将树比较结果划分到各个路组;直到发现某一层次存在语义块集合(需要设定好阈值M)
规则1、2:关键字频率+共同路径【关键字频率多那就是数据记录的共同路径,可以下一层去找;如果少了很多那就说明进入数据项内部了;回溯确定语义块层次】
计算数据记录边界:
方法:利用规则3、4、5来划分数据记录边界
5.2.2 数据项抽取
数据项边界–指的就是判断一个数据项应该覆盖HTML树结构上的多少个节点。
数据项识别:
规则6:位置相同,标签序列相同就是不同数据记录的同一个字段。
数据项匹配:
除了直接使用规则6来判断数据项是否是同一个字段。还可以使用两个数据项之间的相似性来判断是否是同一个字段:
- 出现路径规则:来自不同语义块的两个数据项如果具有相同的角色,则它们具有相同的出现路径。
- 视觉规则:来自不同数据记录的两个数据项如果是相同角色(是相同字段),则它们有相同的视觉信息。
- 上下文规则:来自不同数据记录的两个数据项如果是相同角色,则它们具有相同的上下文信息。
- 文本特征规则:来自不同数据记录的两个数据项如果是相同角色,则它们具有相似的文本特征。
5.3 单记录数据型页抽取方法
增量式抽取:以增量方式推导网页模板。
连续性数据抽取最好的办法就是确定页面模板,然后根据页面模板+页面来逆推导页面数据。
页面模板存在变化的可能性。虽然单记录数据型页面仅仅有一个记录,页面模板相对固定,但是也有变化的可能性,因此引入部分树对齐算法(增量推导网页模板):
- 首先选择一棵树作为对齐开始的种子
- 接下来,将剩下的树逐个和种子进行对齐
- 首先处理其中一棵树T2。T2无法和种子T1对齐,属于歧义情况。于是跳过T2.
- 接下来T1和T3对齐,也就是通过T1和T3的网页模板,我们推导出了一个新的网页模板。
- 用新生成的网页模板和T2继续对齐
- 如果还剩下跳过的页面,就继续对齐,直到不能生成新的页面模式为止。
- 部分树对齐后,会产生唯一页面模式,用来抽取数据
5.4 单文档型页面抽取方法
抽取页面中的文本信息(只有一个记录的文本信息)
结合视觉信息的抽取方法:
- 基于一个观察结果:网站中正文普遍占据绝大部分位置,文本块长度最长
存在问题:
- 短正文没法很好的提取到
- 包含大量评论的页面没法很好提取到
抽取路径学习:
1. 抽取路径学习:除了使用种子点seedElement找出正文内容外,在内容返回前,还将正文的抽取路径保存到数据库中。
2. 按照基于视觉信息的抽取抽取出的路径与数据库比对,一致时就没问题,不一致就需要进行选择(如果页面发生变化则选择基于视觉信息;如果是短正文/评论页则选择基于数据库信息)
改进的自适应数据抽取方法:
- 本质是抽取路径法中的数据库信息和视觉信息的自动选择,基于贝叶斯最优决策的方法
- 所用的特征包括:
- 最终决策公式为:
6. 第七章 Web数据存储
6.1 爬取数据存储
结构化文件存储:
- 结构化文件:Excel、CSV、JSON、XML、PICKLE
- CSV:以逗号相隔、存储容量少
- JSON:是存储和交换文本信息的语法,比XML小在数据交换中起到载体的作用
- XML:用来交换数据而不是展示数据
- PICKLE:用于序列化和反序列化python对象。pickle是二进制序列化格式,json是文本序列化。JSON可读,pickle不可读。JSON可互操作,PICKLE仅仅在python中使用。
结构化数据库:
- Sqlite:python内置的一个轻量型关系数据库。
- MySQL
- MongoDB
非结构化文件存储:
- txt文件
- JPG文件
- Hbase等非结构化数据库
7. 第八章 Web数据预处理
7.1 结构化数据处理
数据清洗
- 缺失值处理:直接删除/填充新值
- 噪声处理:识别、直接删除、极值处理到一个正常区间
- 不一致处理:删除再填充新值
结构化数据应用
- 数据集成,展示
- 用机器学习处理数据,展示结果
特征工程
- 特征:在观测现象中一种独立、可测量属性
- 特征工程:把原始数据变成特征的过程,目的是为了更好的训练数据
方法包括:特征选择、特征提取、特征组合、特征构造
- 主成分分析法(PCA):无监督学习,将互相相关的特征,通过线性组合,使得数据变换到新的空间,可能最大程度保持原来的信息,并且特征之间互相不相关。
机器学习的数据预处理
- 归一化:把数据特征转化为相同尺度的方法。最近邻分类器就是尺度敏感的,尺度大的特征起主导作用,也有尺度不变性算法。线性分类器尺度不变。【加速收敛、统一尺度、减少冗余信息、提高泛化能力、不能直接解决过拟合问题】
- 标准化:Z-score,让每一个特征均值为0,方差为1
- 白化:消除不同特征之间的相关性;降低输入数据特征之间的冗余性;输入数据经过白化处理后,特征之间的相关性较低,并且特征具有相同的方差;白化的一个主要方法就是PCA。【特征去相关+方差归一化】
连续值和离散值
- 离散值:类别特征编码(标签编码、独热编码)
- 连续值:二值化、分箱、聚类、熵、决策树
7.2 非结构化数据处理
文本数据
- SQL查询
- NLP文本特征:分词、预处理、向量描述
文本特征:
- IR:IR模型、倒排表、搜索引擎
- 文本处理:文本分类、文本聚类、情感分析
非结构化数据特征描述:
- 图像数据——图像特征——图像识别、检索
- 文本+图片特征——跨模态检索、文本生成图片
8. 第九章 文本预处理
- 语言是具有组合性的,只有组合在一起语言才有意义。
- 预处理:将文档拆解成单词以便计算机程序能够解释。
步骤:
- 文档解析:移除文档中不必要的格式,比如HTML标签。
- 句子分割:从文档拆成句子。
- 分词(词条化):句子变为单词【基于词典的分词、基于统计的分词、基于理解的分词】。
- 词规范化:归一化(不同表达方式归一化)、词干还原(去除单词两端词缀的过程)。
- 去停用词:删除不需要的词(冠词、介词、代词等)。
8.1 基于词典的分词(字符串匹配)
步骤:
- 按照一定策略拿出汉字串,然后与“词典”中的词条进行匹配
- 如果匹配成功,那么这个汉字串就是一个词
- 遇到不认识的字串就分割
策略:
- 正向匹配和逆向匹配
- 最大匹配和最小匹配
8.2 基于统计的分词方法
思想:如果相连的字在不同的文本中出现的次数越多,就证明这相连的字很可能就是一个词。因此,我们只要判断各个字组合出现的频度就可以判定是否为一个词。
主要统计模型有:
- N元文法模型
- 隐马尔可夫模型
- 条件随机场模型
- 深度学习模型
实现上,会将字符串匹配和统计模型结合起来使用:
8.2.1 基于HMM的分词
马尔可夫过程:未来只与现在有关与过去无关;具有无后效性特点的过程称为马尔可夫过程。
举一个例子:天气预测可以认为就是一个马尔可夫过程(今天的天气不会影响后天,只会影响明天)
HMM:Hidden Markov Model 隐马尔可夫过程(状态隐藏马尔可夫过程)
举个例子:
模型:
模型涉及的两个问题:
- 概率计算问题:模型AB矩阵 + 观察值(输入) + 状态值(输入) ——》 观察值概率。
- 模型训练:梯度下降最大化观察值概率
- 模型使用:观察值+模型AB矩阵 ——》 状态值
本质上:模型在通过学习明白观察值和状态值之间的联系,然后我们给出观测值模型就能够预测出状态值。
概率计算问题:
给定 HMM,即,求某个观察序列的概率。
例如:给定一个天气的隐马尔可夫模型,包括第一天的天气概率分布,天气转移概率矩阵,特定天气下树叶的湿度概率分布。求第一天湿度为 1,第二天湿度为 2,第三天湿度为 3 的概率。
找到所有状态序列,得到各状态概率,得到每种状态概率对应的观察概率,求和。
模型训练:
给定一个观察序列,得到一个隐马尔可夫模型。
已知第一天湿度为 1,第二天湿度为 2,第三天湿度为 3。求得一个天气的隐马尔可夫模型,包括第一天的天气,天气转移概率矩阵,特定天气下树叶的湿度概率分布。
如果产生观察序列 O 的状态已知(即存在大量标注的样本), 可以用最大似然估计来计算 的参数:Baum-Welch 算法(前向后向算法)描述
如果不存在大量标注的样本:期望值最大化算法(Expectation-Maximization, EM)
模型使用:
- 在模型已经训练好的前提下,观测值和状态值已经得到绑定。
- 通过AB矩阵将状态值和观测值在向量空间中相当靠近
- 对于分词任务:观察值为所有的汉字;状态值为BMES(begin\middle\end\single)。
HMM分词:
Viterbi算法如下:
本质就是动态规划算法,计算得到最优的路径,也就是状态值集合。具体可以看博客:
(11 封私信) 隐马尔科夫模型(HMM) — 维特比算法(Viterbi ) - 知乎
动态规划算法:带有记忆功能不会重复计算子问题的穷举法
9. 第十章 文本表示
前一章,我们学习了文本预处理。文本预处理包括:
- 文档解析
- 句子分割
- 分词
- 词规范化
- 去停用词
在预处理后,我们得到这个文档处理后非常干净的一堆词语。但是这些词语仍然不能被模型直接使用,因此本章来学习文本表示,把词语转化为可以被模型使用的表示形式。
9.1 文本向量化
- 把字词处理成向量或矩阵,以便计算机能进行处理。
- 上一章预处理的结果:词条集合、词条序列。
- 文本向量化:文档——词条集合——无语序信息;文档——词条序列——有语序信息
离散表示文本(词袋模型、TF-IDF):
- 对于给定文本。
- 忽略单词出现的顺序和语法等因素。
- 将其视为词汇的简单集合。
- 文档中每个单词的出现属于独立关系。
分布式表示文本:
- 使用低维向量来表示文本。
- 每一维表示一个词的语义或主题信息
9.2 隐语义分析LSA
离散文本表示有:词袋模型和TF-IDF模型
分布式文本表示有:LSA、主题模型、文档哈希
LSA:对文本进行降维,仅仅考虑其中主要的语义,因此称为隐语义分析。
步骤:
- 建立词频矩阵(为每一个文档,建立一个初始向量)。
- 计算词频矩阵的奇异值分解。
- 对于每一个文档,进行提取部分特征值后形成的新向量代替原有向量。
- 使用转化后的新向量表示文档进行后续计算
使用新的A来表示各个文档的向量
优点:
- 文章和单词都能映射到一个语义空间
- 语义空间的维度能够明显少于原向量空间,缓解了词袋法造成稀疏矩阵的问题
缺点:
- 无法解决多义词问题。
- 特征向量语义空间等没有对应的物理解释。
- LSA和词袋模型一样没有考虑词语的先后顺序,也没有考虑句子/词语的相似关系。
- SVD计算复杂度高。
9.3 主题模型
pLSA主题模型:
LSA是纯粹从数学矩阵分解保证最小损失的角度去处理,而pLSA则是从统计学/概率学的角度去看待LSA。
- 根据文档-单词信息训练出单词-主题信息+主题-文档信息。
- 我们想要实现的是文档的主题划分(模型)。也就是主题-文档信息,但是手头只有单词-文档信息(数据),缺少单词-主题信息(不完整)。因此需要EM算法在E步估计单词-主题信息(伪标签)。
可以把EM理解为深度学习中的伪标签。他们都是处理数据信息不完整的问题。
- LSA隐含高斯分布假设,pLSA多分布假设更符合文本特性。
- 不再是人为限制r的数量,而是从统计学去学习。
- 在数据不充足的情况下,没有引入先验经验,而是直接用模型估计。受初始值影响大。
LDA主题模型:
LDA和PLSA思想一致,仅仅是将S改为D,也就是引入先验分布(狄利克雷分布,Beta分布)
9.4 文档哈希
思想:把任意长度的输入(文字、图像)转化为固定长度的输出。
目标:哈希码的相似程度能够直接反映输入内容的相似程度
文档哈希判断重复:
- 文本预处理(文档理解、句子分割、分词、词规范化、去停用词)
- 文本表示(特征表示)
- 将高维特征向量映射成指纹
- 通过比较两篇文章的f-bit指纹的汉明距离来判断是否重复
shingle算法(PPT未讲)
局部敏感哈希LSH:
- MinHash
- Simhash
Simhash算法:
- 分词:将语句分词;计算词的特征向量;为每一个特征向量设置权重。
- hash:选择simhash的位数;通过hash函数为每一个特征向量计算hash值。
- 加权:在hash值基础上给特征向量加权;遇到1则hash值直接乘权重,遇到0则取-1乘权重。
- 合并:将上述各个特征向量的加权结果累加,变成一个序列串。
- 降维:对于合并后的结果,如果大于0则置1,否则置0.
10. 第十一章 语言模型(统计语言模型、神经网络语言模型)
对于文本这个非结构化数据,我们前面几章研究的算是比较透彻了。从一开始文本预处理(文档解析、句子分割、分词(基于词典的匹配算法、基于统计的方法)、词规范化、去停用词)到文本表示(文本向量化、LSA、Plsa、LDA、主题模型、文档哈希)。
接下去,我们来学习语言模型,算是文本表示之后的应用部分。在我们得到文本的向量表示之后,可以利用这个信息来训练一个语言模型。它能够反馈一个句子的可信度,也可以生成新的句子(看具体任务)。
n-gram语言模型:
- 根据大数定理,只要统计量足够,相对频度就等于概率。
- 但是当句子长了之后,w1,w2.....wn组合实在太多了会导致概率几乎为0。
- 解决办法:1.增加数据量;2.平滑技术(降低已出现的概率,从而使未出现的非0);3.神经网络模型
提出n-gram语言模型:
- 理论上n越大越好。
- 经验上,trigram用的最多。
- 尽管如此能用bigram绝不使用trigram。
神经网络语言模型NNLM:
- N-gram模型无法建模更远的依赖关系。
- N-gram模型无法建模出词之间的相似度。
- N-gram模型泛化能力不够强。
最早神经网络模型结构:
1.线性Embedding层:
2.中间层:
3.输出层:
优点:
- 词语之间的相似性可以通过词向量来体现。
- 自带平滑功能。
11. 第十二章 词嵌入和文档嵌入
文字在经过预处理的五个阶段,然后利用比较合适的方法进行文本表示。之后想要使用这些文本进行应用,因此设计语言模型。当然,在语言模型中延申出更好的文字表示(词向量)。语言模型分为:统计语言模型(n-gram语言模型)、指数语言模型、神经网络语言模型(nnlm,word2vec)。
其实文本表示章节就是在研究怎么把文本这个非结构数据表示为向量。但是无论我们用什么办法,都无法很准确的描述(向量表达能力不够,例如无法表达相似关系)。直到深度学习的出现,其在应用的过程中,首先就会将事物映射为相当复杂的向量,然后再做处理(特征提取)。可以这么说:
- 深度学习 = 特征提取+特征使用
- 深度学习模型 = 特征提取+特征使用
- 特征提取就是转化为合适的向量
- 特征使用就是利用这些特征完成具体的任务(分类、目标检测、自然语言生成等)
对预测任务的理解:
- 材料罐 = 特征(铁矿石/木炭/石英)
- 炼金炉 = 模型(不同配方函数)
- 每个材料提炼后的精华 = 模型特征提取
- 精华的融合 = 模型特征使用
- 改进炼丹炉 = 反向传播训练模型
- 从初级升到高级炼丹炉 = 换模型
- 温度控制 = 学习率
- 目标产物 = 预测值(黄金)
人类说话本质上:
- 输入是前面说过的话
- 输出是要说的下一个字
- 例如”我要去“,通过前面这三个字大脑这个模型就会输出我心中最想去的地方作为输出,”拉萨“!那如果我去过”拉萨“了,我的大脑模型就变了,我会输出”云南“!
NNLM存在的问题:需要对词典中所有word都算一遍概率,训练、推理速度都太慢。
- 前半部分训练词语的特征向量。
- 后半部分通过词向量训练神经网络语言模型。
word2vec:
- CBOW模型:利用周围词来计算中心词概率,特征融合方法采用点对点加法。
- Skip-Gram模型:根据某个词来计算周围词的概率。用成对单词进行训练(input word,output word)输出是概率分布。引入层次和负采样来解决NNLM计算词典所有word的问题。
Doc2Vec:
不仅能学习单词得向量,还能学习文本的向量表示。用于聚类、分类。训练过程时,同时训练词向量和段落向量。词向量随滑动窗口的改变而改变,而段落向量只要在本段就不会改变。
Glove:
改进了word2vec只能利用窗口中的局部信息的缺陷,成功利用全语料库的信息。词共现矩阵,表示了两词不同文档出共现次数。
词嵌入:使用深度学习来进行文本表示(将文本转化为词向量,同时尽可能减少信息损失)
不同方法本质都在想办法尽可能保留下文本信息。
12. 第十三章 文本分类
12.1 文本分类
定义:用计算机对文本(或其他实体)按照一定的分类体系或标准进行自动分类标记。
应用:
- 情感分析:积极、消极、中性
- 主题分析:金融、体育、军事
- 意图识别:天气查询、歌曲搜索
- 问答任务:是、否
- 自然语言推理:导出、矛盾、中立
基本结构:
- 特征表示:词袋模型、TF-IDF、统计语言模型(n-gram模型)、神经网络语言模型(nnlm等词嵌入)。
- 分类模型:浅层深度学习(参数较少,在小规模上效果好)、深度学习模型(结构复杂,对数据依赖性强)
Doc2Vec文本分类:
- 数据预处理
- 训练Doc2Vec模型,得到文档嵌入向量
- 创建文档向量并划分数据集
- 训练分类器
Word2Vec文本分类:
- 方法流程同Doc2Vec类似,区别在于是对文档中所有单词的嵌入向量加权平均得到文档向量。
12.2 fastText
Word2Vec的局限性:
- Word2Vec需要为每一个单词创建嵌入,它不能处理任何在训练中没有遇到过的单词。
- 对于词根相同的单词如eating、eat和eaten,这些单词应该彼此有联系,存在参数共享。
fastCNN(改进的是特征提取这一块):
- 找特征向量的时候以字符级去确定特征向量,而不是整个单词。
- 在训练中,由于利用n-gram提取单词中子部分特征,因此存在许多共享的部分(eat和eating存在共享)。因此训练速度更快。
- 存储空间更大了,因为需要存储更多词向量。
12.3 TextCNN
- 将计算机视觉中用于图像识别的CNN迁移到自然语言领域。(改进的是特征使用这一块)。
- 准备不同大小的卷积核,提取不同的信息,然后利用池化层和全连接层来使用这些信息。
- TextCNN的卷积核只能在序列方向移动。
12.4 大语言模型中的Token化
前面我们对文字这个非结构数据的处理流程是:文本预处理、文本表示、文本应用。
文本预处理里面提到分词,从基于词典模型 到 基于统计模型(HMM模型)
但是这一类的模型仍然存在问题:
- 词典依赖性。
- 形态处理能力不足。
- 歧义处理能力弱。
- 跨语言适配差。
于是 分词中的全新流派——Token出现了!!!
从此以后我们是按照Token去分词,而不是按照词去分词~~
Token的优点:
- 自由把词组合或拆分作为Token单位
- 开放词汇表
- 形态处理能力强
- 跨语言适配性强
BPE:
- 初始化词汇表
- 统计所有单词及其字符的出现频率
- 迭代合并高频字符对
- 终止条件
本质就是在 考虑字符 和 考虑词符 之间去找了一个平衡点。
核心思想:
- 出现频率高+相邻则合并有两个目的:1.参考哈夫曼树的思想;2.相邻意味着是一个词本身就要合并。
- 需要Token细粒化到什么程度由预设词汇量决定。
优点:
- 从字符层级去考虑分词。变为开放词汇表同时提高了形态处理能力。
- 进行了有效压缩,减少了全局分词的弊端。
13. 第十四章 Web图片数据
前面好多章,我们一直在讲非结构数据中的文本部分。本章开始,我们就来讲讲图片这个非结构数据。
13.1 web图像
图片分类:
- 矢量图形
- SVG图片:基于XML;可以用代码来画图;随时插入到HTML中;文字保留可编辑可搜寻状态
- 位图图像(Bitmap):使用颜色网格(像素,bit)来表现图像。JPEG和GIF格式都是位图。
13.2 图像特征
从特征抽象程度来分:
- 低层特征
- 语义特征
从特征来源来分:
- 局部特征
- 全局特征
图像常见特征有:
- 颜色特征
- 纹理特征
- 形状特征
- CNN特征
13.3 颜色特征
- 颜色是彩色图像最底层、最直观的物理特征
- 通常对噪声,图像质量的退化、尺寸、分辨率等变化有很强的鲁棒性。
- 全局特征
颜色空间:用数字表现颜色的抽象数学模型
- RGB空间:三种原色光描述自然界所有颜色,用相互垂直的坐标轴来表示,是一个加光模式。并不是完全符合人类对颜色相似性的视觉感知。
- HSV空间:人类视觉对亮度的敏感度大于色相的敏感度,因此分为三种分量:色相、饱和度、亮度。
- 转化公式:RGB向HSV的转化公式
颜色直方图:在颜色空间中采用一定的量化方法对颜色进行量化,然后统计每一个量化通道在整个图像中所占的比重。
- 描述的是不同色彩在整幅图像中所占比例。
- 描述分布特性。
- 具有平移、尺度、旋转不变性。
- 适合描述那些难以自动分割的图像。
- 任何图像都有唯一一个直方图,但是可能不同图像有相同的颜色分布直方图(可以分割承子图像,建立索引来区分)。
颜色矩:在颜色直方图的基础上计算出每个颜色的矩估计。 直方图是各个像素颜色的统计数据,颜色矩是各个像素颜色的统计摘要(用特征来表示)。前者是全部说出来,后者是把颜色统计信息转为数学特征去表示。
- 一阶矩(均值):
- 二阶矩(方差):
- 三阶矩(斜度):
- 四阶矩(峰态):
使用这些特征量,代替颜色的统计值从而代表一张图片。可以减少特征量(三个颜色分量,每一个使用三个低阶矩3*3=9就可以表示),减少存储空间。
13.4 纹理特征
纹理特征:指在图像中反复出现的局部模式和它们的排列规则,描述了图像或者图像区域所对应的景物的表面性质。并不反映本质属性,随分辨率变化有较大偏差,受光照反射等影响,造成误导。
- 不是基于像素点的特征,而是基于像素区域的特征。
- 是一种统计特征,具有旋转不变性,但是平移会发生改变。
基于信号处理方法描述纹理特征:
- 对图像信号的频率和方向进行选择性滤波。
- 基于信号处理的方法也称为滤波方法。
- 常见的图像滤波方法有傅里叶变换和Gabor滤波器。
LBP特征:局部二值模式。结合了纹理图像结构和像素统计关系的纹理特征描述方法。
- 一种有效的纹理描述算子
- 对光照具有不变性
- 具有旋转不变性
- 灰度不变性
- 一般不用LBP图谱作为特征向量用于分类识别,而是采用它的统计直方图作为特征向量。
- 图谱和位置有很大关系,会因为位置没有对准产生很大误差,可以将图片划分为若干个子区域,为每一个子区域建立LBP统计直方图。
13.5 形状特征
- 低级图像特征主要有颜色、纹理和形状。
- 低级图像特征包括局部特征和全局特征:全局特征是基于整幅图像提取的;局部特征是基于图像的某个区域提取的。
- 局部形状特征:LBP、HOG、SIFT
HOG特征(方向梯度直方图):计算和统计图像局部区域的梯度方向直方图来构成特征
- 梯度概念就是像素值变换最快的方向。
- 在一幅图像中,局部目标的表象和形状能够被梯度或边缘的方向密度分布很好的描述
HOG步骤:
- 灰度化:将图像看作(灰度)三维图像。
- 采用Gamma矫正法对输入图像进行颜色空间标准化:减少噪音、局部阴影等干扰。
- 计算图像每个像素的梯度
- 将图像划分为小Cell
- 统计每个cell的梯度直方图:为每一个局部区域保留一个编码,充分考虑局部信息。
- 将每几个cell组成一个block,得到该block的HOG特征表述:从局部信息中提炼稍大一点的全局信息(非完全全局)。
- 将图像内所有block的HOG特征描述串联起来得到该图像的HOG特征。
HOG优点:
- 由于HOG是在图像的局部方格单元上操作,所以它对图像几何的和光学的形变都能保持比较好的不变性,因为这两种形变只会出现在更大的空间领域上。
- 在粗的空域抽样、精细的方向抽样以及较强的局部光学归一化等条件下,只要行人大体上能够保持直立的姿 势,可以容许行人有一些细微的肢体动作,这些细微的动作可以被忽略而不影响检测效果。特别适合人体图像检测。
SIFT特征:
- 尺度不变特征转换。
- 在空间尺度中寻找极值点,提取出其位置、尺度、旋转不变量。
- 应用:机器人地图感知导航。
- 尺度是客观存在的,尺度空间的获取要用高斯模糊来实现。高斯卷积是表现尺度空间的一种形式。
SIFT算法步骤:
- 建立尺度空间(高斯差分金字塔)。
- 在不同尺度空间中检测极值点,进行精准定位和筛选。
- 特征点方向赋值(位置、尺度、方向等)
- 计算特征描述子
14. 总结
终于更新完了,不得不说Web数据管理的知识体量还是大的,比数据可视化大多了。希望这篇博客能够给未来的学弟学妹们一点帮助。
如果想持续关注系列文章,可以订阅: