如何用 Python 中的 NLTK 对中文进行分析和处理

Python011

如何用 Python 中的 NLTK 对中文进行分析和处理,第1张

最近正在用nltk 对中文网络商品评论进行褒贬情感分类,计算评论的信息熵(entropy)、互信息(point mutual information)和困惑值(perplexity)等(不过这些概念我其实也还理解不深...只是nltk 提供了相应方法)。

我感觉用nltk 处理中文是完全可用的。其重点在于中文分词和文本表达的形式。

中文和英文主要的不同之处是中文需要分词。因为nltk 的处理粒度一般是词,所以必须要先对文本进行分词然后再用nltk 来处理(不需要用nltk 来做分词,直接用分词包就可以了。严重推荐结巴分词,非常好用)。

文分词之后,文本就是一个由每个词组成的长数组:[word1, word2, word3…… wordn]。之后就可以使用nltk

里面的各种方法来处理这个文本了。比如用FreqDist 统计文本词频,用bigrams 把文本变成双词组的形式:[(word1, word2),

(word2, word3), (word3, word4)……(wordn-1, wordn)]。

再之后就可以用这些来计算文本词语的信息熵、互信息等。

再之后可以用这些来选择机器学习的特征,构建分类器,对文本进行分类(商品评论是由多个独立评论组成的多维数组,网上有很多情感分类的实现例子用的就是nltk 中的商品评论语料库,不过是英文的。但整个思想是可以一致的)。

另外还有一个困扰很多人的Python 中文编码问题。多次失败后我总结出一些经验。

Python 解决中文编码问题基本可以用以下逻辑:

utf8(输入) ——>unicode(处理) ——>(输出)utf8

Python 里面处理的字符都是都是unicode 编码,因此解决编码问题的方法是把输入的文本(无论是什么编码)解码为(decode)unicode编码,然后输出时再编码(encode)成所需编码。

于处理的一般为txt 文档,所以最简单的方法,是把txt 文档另存为utf-8 编码,然后使用Python

处理的时候解码为unicode(sometexts.decode('utf8')),输出结果回txt 的时候再编码成utf8(直接用str()

函数就可以了)。

决策树是一种非参数有监督的机器学习方法,可以用于解决回归问题和分类问题。通过学习已有的数据,计算得出一系列推断规则来预测目标变量的值,并用类似流程图的形式进行展示。决策树模型可以进行可视化,具有很强的可解释性,算法容易理解,以决策树为基础的各种集成算法在很多领域都有广泛的应用。

熵的概念最早起源于物理学,用于度量一个热力学系统的无序程度。在信息论里面,信息熵代表着一个事件或一个变量等所含有的信息量。 在信息世界,熵越高,则能传输越多的信息,熵越低,则意味着传输的信息越少。

发生概率低的事件比发生概率高的事件具有更大的不确定性,需要更多的信息去描述他们,信息熵更高。

我们可以用计算事件发生的概率来计算事件的信息,又称“香农信息”( Shannon Information )。一个离散事件x的信息可以表示为:

h(x) = -log(p(x))

p() 代表事件x发生的概率, log() 为以二为底的对数函数,即一个事件的信息量就是这个事件发生的概率的负对数。选择以二为底的对数函数代表计算信息的单位是二进制。因为概率p(x)小于1,所以负号就保证了信息熵永远不为负数。当事件的概率为1时,也就是当某事件百分之百发生时,信息为0。

熵( entropy ),又称“香农熵”( Shannon entropy ),表示一个随机变量的分布所需要的平均比特数。一个随机变量的信息熵可以表示为:

H(x) = -sum(each k in K p(k)log(p(k)))

K表示变量x所可能具有的所有状态(所有事件),将发生特定事件的概率和该事件的信息相乘,最后加和,即可得到该变量的信息熵。可以理解为,信息熵就是平均而言发生一个事件我们得到的信息量大小。所以数学上,信息熵其实是事件信息量的期望。

当组成该随机变量的一个事件的概率为1时信息熵最小,为0, 即该事件必然发生。当组成该随机变量的所有事件发生的概率相等时,信息熵最大,即完全不能判断那一个事件更容易发生,不确定性最大。

当一个事件主导时,比如偏态分布( Skewed Probability Distribution ),不确定性减小,信息熵较低(low entropy);当所有事件发生概率相同时,比如均衡分布( Balanced Probability Distribution ),不确定性极大,信息熵较高(high entropy)。

由以上的香农信息公式可知,信息熵主要有三条性质:

- 单调性 。发生概率越高的事件,其所携带的信息熵越低。比如一个真理的不确定性是极低的,那么它所携带的信息熵就极低。

- 非负性 。信息熵不能为负。单纯从逻辑层面理解,如果得知了某个信息后,却增加了不确定性,这也是不合逻辑的。

- 可加性 。即多随机事件同时发生存在的总不确定性的量度是可以表示为各事件不确定性的量度的和。

若两事件A和B同时发生,两个事件相互独立。 p(X=A,Y=B) = p(X = A)*p(Y=B) , 那么信息熵为 H(A,B) = H(A) + H(B) 。但若两事件不相互独立,那么 H(A,B) = H(A) + H(B) - I(A,B) 。其中 I(A,B) 是互信息( mutual information,MI ),即一个随机变量包含另一个随机变量信息量的度量。即已知X的情况下,Y的分布是否会改变。

可以理解为,两个随机变量的互信息度量了两个变量间相互依赖的程度。X 和 Y的互信息可以表示为:

I(XY) = H(X) - H(X|Y)

H(X)是X的信息熵,H(X|Y)是已知Y的情况下,X的信息熵。结果的单位是比特。

简单来说,互信息的性质为:

- I(XY)>=0 互信息永远不可能为负

- H(X) - H(X|Y) = I(XY) = I (YX) = H(Y) - H(Y|X) 互信息是对称的

-当X,Y独立的时候, I(XY) = 0 互信息值越大,两变量相关性越强。

-当X,Y知道一个就能推断另一个的时候, I(XY) = H(Y) = H(X)

在数据科学中,互信息常用于特征筛选。在通信系统中互信息也应用广泛。在一个点到点的通信系统中,发送信号为X,通过信道后,接收端接收到的信号为Y,那么信息通过信道传递的信息量就是互信息 I(X,Y) 。根据这个概念,香农推导出信道容量(即临界通信传输速率的值)。

信息增益( Information Gain )是用来按照一定规则划分数据集后,衡量信息熵减少量的指数。

那数据集的信息熵又是怎么计算的呢?比如一个常见的0,1二分类问题,我们可以计算它的熵为:

Entropy = -(p(0) * log(P(0)) + p(1)\ * log(P(1)))

当该数据集为50/50的数据集时,它的信息熵是最大的(1bit)。而10/90的数据集将会大大减少结果的不确定性,减小数据集的信息熵(约为0.469bit)。

这样来说,信息熵可以用来表示数据集的纯度( purity )。信息熵为0就表示该数据集只含有一个类别,纯度最高。而较高的信息熵则代表较为平衡的数据集和较低的纯度。

信息增益是提供了一种可以使用信息熵计算数据集经过一定的规则(比如决策树中的一系列规则)进行数据集分割后信息熵的变化的方法。

IG(S,a) = H(S) - H(S|a)

其中,H(s) 是原数据集S的信息熵(在做任何改变之前),H(S|a)是经过变量a的一定分割规则。所以信息增益描述的是数据集S变换后所节省的比特数。

信息增益可以用做决策树的分枝判断方法。比如最常用CART树( Classification and Regression Tree )中的分枝方法,只要在python中设置参数 criterion 为 “entropy” 即可。

信息增益也可以用作建模前的特征筛选。在这种场景下,信息增益和互信息表达的含义相同,会被用来计算两变量之间的独立性。比如scikit-learn 中的函数 mutual_info_classiif()

信息增益在面对类别较少的离散数据时效果较好,但是面对取值较多的特征时效果会有 偏向性 。因为当特征的取值较多时,根据此特征划分得到的子集纯度有更大的可能性会更高(对比与取值较少的特征),因此划分之后的熵更低,由于划分前的熵是一定的,因此信息增益更大,因此信息增益比较偏向取值较多的特征。举一个极端的例子来说,如果一个特征为身份证号,当把每一个身份证号不同的样本都分到不同的子节点时,熵会变为0,意味着信息增益最大,从而该特征会被算法选择。但这种分法显然没有任何实际意义。

这种时候,信息增益率就起到了很重要的作用。

gR(D,A)=g(D,A)/HA(D)

HA(D) 又叫做特征A的内部信息,HA(D)其实像是一个衡量以特征AA的不同取值将数据集D分类后的不确定性的度量。如果特征A的取值越多,那么不确定性通常会更大,那么HA(D)的值也会越大,而1/HA(D)的值也会越小。这相当于是在信息增益的基础上乘上了一个惩罚系数。即 gR(D,A)=g(D,A)∗惩罚系数 。

在CART算法中,基尼不纯度表示一个随机选中的样本被分错类别的可能性,即这个样本被选中的概率乘以它被分错的概率。当一个节点中所有样本均为一种时(没有被分错的样本),基尼不纯度达到最低值0。

举例来说,如果有绿色和蓝色两类数据点,各占一半(蓝色50%,绿色50%)。那么我们随机分类,有以下四种情况:

-分为蓝色,但实际上是绿色(❌),概率25%

-分为蓝色,实际上也是蓝色(✔️),概率25%

-分为绿色,实际上也是绿色(✔️),概率25%

-分为绿色,但实际上是蓝色(❌),概率25%

那么将任意一个数据点分错的概率为25%+25% = 50%。基尼不纯度为0.5。

在特征选择中,我们可以选择加入后使数据不纯度减少最多的特征。

噪音数据简单来说就是会对模型造成误导的数据。分为类别噪声( class noise 或 label noise )和 变量噪声( attribute noise )。类别噪声指的的是被错误标记的错误数据,比如两个相同的样本具有不同的标签等情况。变量噪声指的是有问题的变量,比如缺失值、异常值和无关值等。

决策树其实是一种图结构,由节点和边构成。

-根节点:只有出边没有入边。包含样本全集,表示一个对样本最初的判断。

-内部节点:一个入边多个出边。表示一个特征或是属性。每个内部节点都是一个判断条件,包含数据集中从根节点到该节点所有满足条件的数据的集合。

-叶节点:一个入边无出边。表示一个类,对应于决策结果。

决策树的生成主要分为三个步骤:

1. 节点的分裂 :当一个节点不够纯(单一分类占比不够大或者说信息熵较大)时,则选择将这一节点进行分裂。

2. 决策边界的确定 :选择正确的决策边界( Decision Boundary ),使分出的节点尽量纯,信息增益(熵减少的值)尽可能大。

3. 重复及停止生长 :重复1,2步骤,直到纯度为0或树达到最大深度。为避免过拟合,决策树算法一般需要制定树分裂的最大深度。到达这一深度后,即使熵不等于0,树也不会继续进行分裂。

下面以超级知名的鸢尾花数据集举例来说明。

这个数据集含有四个特征:花瓣的长度( petal length )、花瓣的宽度( petal width )、花萼的长度( sepal length )和花萼的宽度( sepal width )。预测目标是鸢尾花的种类 iris setosa, iris versicolor 和 iris virginica 。

建立决策树模型的目标是根据特征尽可能正确地将样本划分到三个不同的“阵营”中。

根结点的选择基于全部数据集,使用了贪婪算法:遍历所有的特征,选择可以使信息熵降到最低、基尼不纯度最低的特征。

如上图,根节点的决策边界为' petal width = 0.8cm '。那么这个决策边界是怎么决定的呢?

-遍历所有可能的决策边界(需要注意的是,所有可能的决策边界代表的是该子集中该特征所有的值,不是以固定增幅遍历一个区间内的所有值!那样很没有必要的~)

-计算新建的两个子集的基尼不纯度。

-选择可以使新的子集达到最小基尼不纯度的分割阈值。这个“最小”可以指两个子集的基尼不纯度的和或平均值。

ID3是最早提出的决策树算法。ID3算法的核心是在决策树各个节点上根据 信息增益 来选择进行划分的特征,然后递归地构建决策树。

- 缺点

(1)没有剪枝

(2)只能用于处理离散特征

(3)采用信息增益作为选择最优划分特征的标准,然而信息增益会偏向那些取值较多的特征(例如,如果存在唯一标识属性身份证号,则ID3会选择它作为分裂属性,这样虽然使得划分充分纯净,但这种划分对分类几乎毫无用处。)

C4.5 与ID3相似,但对ID3进行了改进:

-引入“悲观剪枝”策略进行后剪枝

-信息增益率作为划分标准

-将连续特征离散化,假设 n 个样本的连续特征 A 有 m 个取值,C4.5 将其排序并取相邻两样本值的平均数共 m-1 个划分点,分别计算以该划分点作为二元分类点时的信息增益,并选择信息增益最大的点作为该连续特征的二元离散分类点;

-可以处理缺失值

对于缺失值的处理可以分为两个子问题:

(1)在特征值缺失的情况下进行划分特征的选择?(即如何计算特征的信息增益率)

C4.5 中对于具有缺失值特征,用没有缺失的样本子集所占比重来折算;

(2)选定该划分特征,对于缺失该特征值的样本如何处理?(即到底把这个样本划分到哪个结点里)

C4.5 的做法是将样本同时划分到所有子节点,不过要调整样本的权重值,其实也就是以不同概率划分到不同节点中。

(1)剪枝策略可以再优化;

(2)C4.5 用的是多叉树,用二叉树效率更高;

(3)C4.5 只能用于分类;

(4)C4.5 使用的熵模型拥有大量耗时的对数运算,连续值还有排序运算;

(5)C4.5 在构造树的过程中,对数值属性值需要按照其大小进行排序,从中选择一个分割点,所以只适合于能够驻留于内存的数据集,当训练集大得无法在内存容纳时,程序无法运行。

可以用于分类,也可以用于回归问题。CART 算法使用了基尼系数取代了信息熵模型,计算复杂度更低。

CART 包含的基本过程有 分裂,剪枝和树选择

分裂 :分裂过程是一个二叉递归划分过程,其输入和预测特征既可以是连续型的也可以是离散型的,CART 没有停止准则,会一直生长下去;

剪枝 :采用“代价复杂度”剪枝,从最大树开始,每次选择训练数据熵对整体性能贡献最小的那个分裂节点作为下一个剪枝对象,直到只剩下根节点。CART 会产生一系列嵌套的剪枝树,需要从中选出一颗最优的决策树;

树选择 :用单独的测试集评估每棵剪枝树的预测性能(也可以用交叉验证)。

(1)C4.5 为多叉树,运算速度慢,CART 为二叉树,运算速度快;

(2)C4.5 只能分类,CART 既可以分类也可以回归;

(3)CART 使用 Gini 系数作为变量的不纯度量,减少了大量的对数运算;

(4)CART 采用代理测试来估计缺失值,而 C4.5 以不同概率划分到不同节点中;

(5)CART 采用“基于代价复杂度剪枝”方法进行剪枝,而 C4.5 采用悲观剪枝方法。

(1)决策树易于理解和解释,可以可视化分析,容易提取出规则

(2)可以同时处理分类型和数值型数据

(3)可以处理缺失值

(4)运行速度比较快(使用Gini的快于使用信息熵,因为信息熵算法有log)

(1)容易发生过拟合(集成算法如随机森林可以很大程度上减少过拟合)

(2)容易忽略数据集中属性的相互关联;

(3)对于那些各类别样本数量不一致的数据,在决策树中,进行属性划分时,不同的判定准则会带来不同的属性选择倾向。

写在后面:这个专辑主要是本小白在机器学习算法学习过程中的一些总结笔记和心得,如有不对之处还请各位大神多多指正!(关于决策树的剪枝还有很多没有搞懂,之后弄明白了会再单独出一篇总结哒)

参考资料链接:

1. https://machinelearningmastery.com/what-is-information-entropy/

2. https://zhuanlan.zhihu.com/p/29679277

3. https://machinelearningmastery.com/information-gain-and-mutual-information/

4. https://victorzhou.com/blog/gini-impurity/

5. https://sci2s.ugr.es/noisydata

6. https://towardsdatascience.com/understanding-decision-trees-once-and-for-all-2d891b1be579

7. https://blog.csdn.net/weixin_36586536/article/details/80468426

8. https://zhuanlan.zhihu.com/p/85731206

因为不知道所学的数学知识到底有什么用。对于IT公司的研发人员来说,他们在进入大数据相关岗位前,总是觉得要先学点数学,但是茫茫的数学世界,哪里才是数据技术的尽头?一谈到数据技术,很多人首先想到的是数学,大概是因为数字在数学体系中稳固的位置吧,这也是理所当然的。本文对数据技术的数学基础这个问题进行一些探讨。(推荐学习:Python视频教程)

我们知道数学的三大分支,即代数、几何与分析,每个分支随着研究的发展延伸出来很多小分支。在这个数学体系中,与大数据技术有密切关系的数学基础主要有以下几类。(关于这些数学方法在大数据技术中的应用参见《互联网大数据处理技术与应用》一书, 2017,清华大学出版社)

(1)概率论与数理统计

这部分与大数据技术开发的关系非常密切,条件概率、独立性等基本概念、随机变量及其分布、多维随机变量及其分布、方差分析及回归分析、随机过程(特别是Markov)、参数估计、Bayes理论等在大数据建模、挖掘中就很重要。大数据具有天然的高维特征,在高维空间中进行数据模型的设计分析就需要一定的多维随机变量及其分布方面的基础。Bayes定理更是分类器构建的基础之一。除了这些这些基础知识外,条件随机场CRF、隐Markov模型、n-gram等在大数据分析中可用于对词汇、文本的分析,可以用于构建预测分类模型。

当然以概率论为基础的信息论在大数据分析中也有一定作用,比如信息增益、互信息等用于特征分析的方法都是信息论里面的概念。

(2)线性代数

这部分的数学知识与数据技术开发的关系也很密切,矩阵、转置、秩 分块矩阵、向量、正交矩阵、向量空间、特征值与特征向量等在大数据建模、分析中也是常用的技术手段。

在互联网大数据中,许多应用场景的分析对象都可以抽象成为矩阵表示,大量Web页面及其关系、微博用户及其关系、文本集中文本与词汇的关系等等都可以用矩阵表示。比如对于Web页面及其关系用矩阵表示时,矩阵元素就代表了页面a与另一个页面b的关系,这种关系可以是指向关系,1表示a和b之间有超链接,0表示a,b之间没有超链接。著名的PageRank算法就是基于这种矩阵进行页面重要性的量化,并证明其收敛性。

以矩阵为基础的各种运算,如矩阵分解则是分析对象特征提取的途径,因为矩阵代表了某种变换或映射,因此分解后得到的矩阵就代表了分析对象在新空间中的一些新特征。所以,奇异值分解SVD、PCA、NMF、MF等在大数据分析中的应用是很广泛的。

(3)最优化方法

模型学习训练是很多分析挖掘模型用于求解参数的途径,基本问题是:给定一个函数f:A→R,寻找一个元素a0∈A,使得对于所有A中的a,f(a0)≤f(a)(最小化);或者f(a0)≥f(a)(最大化)。优化方法取决于函数的形式,从目前看,最优化方法通常是基于微分、导数的方法,例如梯度下降、爬山法、最小二乘法、共轭分布法等。

(4)离散数学

离散数学的重要性就不言而喻了,它是所有计算机科学分支的基础,自然也是数据技术的重要基础。这里就不展开了。

最后,需要提的是,很多人认为自己数学不好,数据技术开发应用也做不好,其实不然。要想清楚自己在大数据开发应用中充当什么角色。参考以下的大数据技术研究应用的切入点,上述数学知识主要体现在数据挖掘与模型层上,这些数学知识和方法就需要掌握了。

当然其他层次上,使用这些数学方法对于改进算法也是非常有意义的,例如在数据获取层,可以利用概率模型估计爬虫采集页面的价值,从而能做出更好的判断。在大数据计算与存储层,利用矩阵分块计算实现并行计算。

更多Python相关技术文章,请访问Python教程栏目进行学习!以上就是小编分享的关于Python数据分析要学什么数学的详细内容希望对大家有所帮助,更多有关python教程请关注环球青藤其它相关文章!