Python数据预处理技术与实践
1. 概述
-
数据预处理:
- 数据清理
- 数据集成
- 数据规约
- 数据变换(按照预先设计好的规则对抽取的数据进行转换,如把数据压缩到0.0~1.0区间)
- 数据降维
-
原始数据存在数据不完整、数据偏态、数据噪声、数据特征维度高、数据缺失值、数据错误值等问题
-
搜索引擎是中文分词的一个应用
-
相关度排序:把最相关的结果排在最前面。受中文分词的准确度影响。
2. Python科学计算工具
- NumPy
- SciPy
- Pandas
3. 数据采集与存储
-
数据形式:
-
结构化数据:存储和排列有规律,但扩展性差。
-
半结构化数据:
- 扩展性很好
- 邮件系统、档案系统、新闻 站等
- 络爬虫、数据解析等方式采集。
-
非结构化数据:
-
文档、图片、音视频等,存储为二进制的数据格式
-
图片识别、人脸识别、医疗影像、文本分析等
-
络爬虫、数据存档等方式采集。
-
-
-
Scrapy:一个为爬取 络数据、提取结构化数据而设计的应用程序框架。
-
- 获取文章的数据有两种方式:基于xpath和CSS。
4. 文本信息抽取
- 文本抽取形式:将采集到的不同类型文档统一处理成文本信息或者特征矩阵,得到高质量的数据集,然后将数据集放进算法模型中来挖掘其背后的价值。
- Pywin32:从Python访问Windows API的功能。
- 文本批量编码:UTF-8
5. 文本数据清洗
-
正则表达式:被用来检索、替换那些匹配某个模式的文本。
-
设计思想:用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,就认为它“匹配”了
-
清洗文本数据、处理HTML 页数据
-
-
简繁字体转换:zhtools工具包
6. 中文分词技术
-
关于统计模型的中文分词方法:
-
基于字符串匹配的分词方法:基于词典匹配,将待分词的中文文本根据一定的规则切分和调整,然后跟词典中的词语进行匹配,匹配成功则按照词典的词进行分词,匹配失败则调整或者重新选择,如此反复循环即可。代表方法:基于正向最大匹配和基于逆向最大匹配以及双向匹配法。
-
基于理解的分词方法:通过专家系统或者机器学习神经 络模拟人的理解能力。
前者是通过专家对分词规则的 逻辑推理并总结形成特征规则,不断迭代完善规则,其受到资源消耗大和算法复杂度高的制约。
后者通过机器模拟人类理解的方式,虽可以去的不错的效果,但是依旧受训练时间长和过度拟合的那个因素困扰。
-
基于统计的分词方法:
-
基于隐马尔可夫模型的中文分词方法:通过文本作为观测序列去确定隐藏序列的过程。
该方法采用Viterbi算法对新词的识别效果不错,但是具有生成式模型的特点,需要计算联合概率,因此随着文本的增大存在计算量大的问题。
-
基于最大熵模型的中文分词方法:学习概率模型时,在可能的概率分布模型中,以熵最大的进行切分。
该法可以避免生成模型的不足,但是存在偏移量问题。
-
需要大量训练语料,而训练和解码又非常耗时。
-
关于词典和规则的方法其分词速度较快,但是在不同领域取得的效果差异很大,还存在构造费时费力、算法复杂度高、移植性差等缺点。基于统计的痛次,虽然相较于规则的方法能取得不错的效果,但也依然存在模型训练时间长、分词速度慢等问题。
-
-
结巴分词:基于Python的中文分词工具。
-
特征:
- 三种分词模式:可以实现自定义调整词典、关键词提取、词性标注和句法分析等功能。
- 全模式分词:把所有可以成词的词语都扫描出来,速度非常快,但不能解决歧义。
- 精确模式分词:试图将句子最精确地切开,适合文本分析。
- 搜索引擎模式分词:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
- 支持繁体分词
- 支持自定义词典
- MIT授权协议
- 三种分词模式:可以实现自定义调整词典、关键词提取、词性标注和句法分析等功能。
-
核心方法:
- jieba.cut方法:可接受三个输入参数,分词的字符串、cut_all参数(用来控制是否采用全模式)和HMM参数(用来控制是否使用HMM模型(隐马尔可夫模型))
- jieba.cut_for_search:接收两个参数,一是需要分词的字符串,二是是否使用HMM模型(该方法使用于搜索引擎构建倒排索引的分词,粒度比较细)
- 待处理的字符串:unicode、UFTF-8、GBK编码格式。不建议直接输入GBK字符串,可能会出现无法预料的错误——解码成UFTF_8。
- 这两个方法返回的结构都是一个可迭代的generator,可以使用for循环来获得分词后得到的每一个词语(Unicode编码)
- 两个方法直接返回列表(List)
- 可以使用jieba.Tokenizer(dictionary=DEFAULT_DICT)新建自定义分词器,用于同时使用不同的词典。jieba.dt 为默认的分词器,所有全局分词相关的函数都是该分词器的映射。
-
自定义调整词典:使用add_word(word, freq=None, tag=None)在程序中动态修改词典。
-
关键词提取:extract_tags 三个参数:待处理的字符串、提取前n个词和是否根据权重设置。
-
词性标注:
-
-
HanLP分词是由Java语言开发的分词工具,Python想调用该分词工具,需要借助JPype1包。JPype1是Python调用Java库文件的模块。
pip install jpype1
错:
解决:
修改hanlp.properties文件,将目录改为 root=/Users/hxh/Desktop/hxh/practice/sublime
(data和当前python文件存放在同一个目录下)
-
NLTK:收集大量公开数据集,模型上提供了全面易用的借口,覆盖了分词、词性标注、命名实体识别、句法分析等功能,广泛应用于经验语言学、认知科学、人工智能、信息检索和机器学习领域。
-
错:ImportError: No module named nltk
python文件名不能为nltk.py
-
7. 文本特征向量化
目的是将文本数据向量化,便于算法模型对数据进行处理。
-
解析数据文件
-
缺失值处理方法:
- 删除元组
- 不处理
- 数据补齐:
- 人工填写
- 特殊值填充
- 平均值填充
- 热卡填充
- K最近距离邻法
- 组合完整化方法
- 回归
- 期望值最大化方法
- 多重填补
-
均值法处理数据缺失值:
-
加载数据集:loadDataSet(fileName, delim=’’)
fileName待处理文件路径,必须参数。delim是每行文本信息分隔符,属于可选参数,默认为制表符。
-
NaN替换成平均值函数:
找到每列数据非0、非NAN数据的均值,然后对缺少的数据进行均值填充。
-
-
Pandas处理缺失值
- 均值填充法
- 标量值替换法:采用一个对数据结果影响不大的标量值填充到缺失值里面
- 向前和向后填充法:向前使用的是哪只函数fillna,并将参数设为pad;向后将参数设为backfill。
- 忽略无效值法
-
数据的归一化处理
归一化是把需要处理的数据经过处理后限制在0~1之间的统计的概率分布。目的是让算法收敛的更快,以提升模型拟合过程的计算效率。
- 好处:
- 归一化后加快了梯度下降求最优解的速度。
- 归一化有可能提高精度。
- 归一化原理:newValue = (oldValue – min) / (max – min)
- 优点:
- 对数据的数值范围进行特定缩放,不改变其数据分布
- 提高迭代求解的收敛速度
- 提高迭代求解的精度
- 0/1取值的数据特征不需要归一化处理,归一化会破坏它的稀疏性。决策树和基于平方损失的最小二乘法也不需要。
- 好处:
-
特征词转文本向量
- 对该文档进行数据清洗、分词及停用词处理
- 统计所有文档的特征词集即包含所有文档的不重复特征词
- 统计词频
-
词频—逆词频(TF-IDF)
有些情况下,单独以词频判断词特征权重不合理,引入词频—逆词频(TF-IDF)
词频TF = 某个词在文章中的出现次数 / 文章总词数
逆文档词频IDF = log(语料库的文档总数 / (包含该词的文档总数 + 1) )
- 应用:信息检索、提取关键字、文章相似度查重、自动文摘
-
词集模型与词袋模型
- 词集模型:遍历每个文档中的所有词,如果出现了词汇表中的词,则将输出文档向量中的对应值设为1。
- 词袋模型:词汇集就像一个装词汇的袋子
8. Gensim文本向量化
-
Gensim是一款非结构化文本处理工具包,可以便捷地构建语料库,其内置的子模块可以高效地生成TF-IDF向量,并支持大数据文本批量处理。同时,其内置的多种主题模型可以满足多任务需求,大大节约了数据预处理训练的时间。
-
开源的第三方Python工具包,用于从原始的非结构化文本中有效地自动抽取语义主题。
-
支持语料处理、LSA(Latent Semantic Analysis,潜在语义分析)、LDA(Latent Dirichlet Allocation,隐含狄利克雷分布)、RP(Random Projection,随即映射)、TF-IDF、word2vec和paragraph2vec等多种模型算法,支持流式训练,并提供了诸如相似度计算和信息检索等一些常用任务的API接口。
-
Gensim特性:
- 内存独立。对于训练语料来说,没必要将这个那个语料都驻留在内存中。
- 有效地实现了许多流行的向量空间算法。包括tf-idf、分布式LSA、分布式LDA以及RP,并且很容易添加新算法。
- 对流行的数据格式进行了IO封装和转换
- 在其语义表达中,可以相似查询
- 可以实现主题建模的可扩展软件框架
-
涉及的核心概念:
- 语料(Corpus):文档的集合,用于模型训练学习,也成训练语料
- 向量(vector):由一组文本特征构成的列表,是一段文本在Gensim中的内部表达
- 稀疏向量(Sparse Vector):可以略去向量中多余的0元素,此时,向量中的每一个元素是一个(key, value)的元组
- 模型(Model):定义了两个向量空间的变换(即从文本的一种向量表达变换为另一种向量的表达)
-
Gensim构建语料词典
训练语料的预处理是指将文档中原始的字符文本转换成Gensim模型所能理解的稀疏向量的过程。
-
Gensim统计词频特征
-
计算TF-IDF
-
使用以下命令自定义语料模块加载数据集与标签集
-
进行特征词频—逆词频处理,并实现本地序列化存储
首先对语料进行Dictionary词典化处理,然后处理成词袋模型(即特征向量化处理)。接着调用models的TfidfModel方法逐个列表进行词频—逆词频计算。最后,将各个类别的词频—逆词频计算结果进行本地序列化存储,其中调用序列化方法serialize并提供各个类别的保存路径、词频—逆词频计算结果和词典。
-
-
Gensim实现主题模型
主题模型可理解为一种在大量文档中发现其主题的无监督式学习技术。这些主题本质上十分抽象,即彼此相关联的词语构成一个主题,同样,在单个文档中可以有多个主题。
将相似和相关的词语聚集成簇,称为主题。这些主题在文档中具有特定的分布,每个主题都根据它包含的不同词的比例来定义。
主题建模有助于挖掘海量文本数据、查找词簇、文本之间的相似度以及发现抽象主题。也可用于搜索引擎,判断搜索字段与结果的匹配程度。
-
潜在语义分析(LSA):也叫潜在语义索引(Latent Semantic Indexing,LSI)一种用于只是获取和展示的计算理论和方法,出发点是文本中的词与词之间存在某种联系,即存在某种潜在的语义结构。上下文。
-
解决歧义词。一词多义或一义多词。弄清词语背后的隐藏概念或主题。
(LSA可以处理向量空间模型无法解决的一义多词(synonymy)问题,但不能解决一词多义(polysemy)问题。因为LSA将每一个词映射为潜在语义空间中的一个点,也就是说一个词的多个意思在空间中对于的是同一个点,并没有被区分。)
-
技术原理:假设有m篇文档,其中包含n个唯一词项(词),假设希望从所有文档的文本数据中提取出k个主题(k为主题书,k的取值根据实际需求由用户设置),则这个那个技术实现的流程如下:
-
生成m x n维文档-词矩阵,其中矩阵元素为TF-IDF
(加载文档集合,建立词汇-文本矩阵A,主要是实现将原始语料的词袋模型转化,最终生成TF-IDF矩阵)
-
使用奇异值分解(SVD)把上述矩阵的维度降到k维
(直接调用Gensim的models.LsiModel模块来实现)
-
使用降维后的矩阵构建潜在语义空间
(存储在本地磁盘中,以备后续使用。目的:一次模型训练将来多次复用,提高算法性能)
-
SVD为数据中的每篇文档和每个词都提供了向量,每个向量的长度均为k。
可以使用余弦相似度的方法通过这些向量找到相似的词和文档
-
-
优点:
- 可以更好地刻画文本的真实含义
- 分析词条与文本之间的相似关系时比传统的向量空间模型具有更好的灵活性
- 对于原始的词条——文本矩阵,通过LSA分析提取出k维语义空间,在保留大部分信息的同时使得K
- 通过对大量的文本分析,LSA可以自动地模拟人类的知识获取能力,甚至分类、预测的能力
- 低维空间表示可以刻画同义词,同义词会对应着相同或相似的主题
-
缺点:
- 它是线性模型,在具有非线性依赖性的数据集上可能效果不佳
- LSA假设文本中的词服从正态分布,不适用于所有问题
- LSA设计SVD,它是计算密集型的,当新数据出现时难以更新
- 没有刻画term出现次数的概率模型
- LSA具有词袋模型的缺点,即在一篇文章或者一个句子中忽略了词语的先后顺序
-
-
隐含狄利克雷分布(LDA)
LDA是一种无监督式学习算法,在训练时不需要手工标注的训练集,需要的仅仅是文档集以及指定主题的数量k。可以将文档集中的每篇文档的主题按照概率分布的形式给出。对于每一个主题均可找出一些词语来描述它。
文本主题识别、文本分类、文本相似度计算和文章相似推荐等方面
推荐系统、邮件分类和关键词提取等业务场景
LDA是一种典型的词袋模型,即它认为一篇文档是由一组词构成的一个集合,词与词之间没有顺序和先后的关系。一篇文档可以包含多个主题,文档中每一个词都由其中的一个主题生成。
-
LDA模型中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!
-
-