大家好,基于Python的数据科学实践课程又到来了,大家尽情学习吧。本期内容主要由智亿同学与政委联合推出。本次将会学习利用Python处理文本数据。在正式开始之前, 需要明确一点:计算机无法真正意义上理解像人一样理解自然语言。事实上,直到上个世纪70年代,主流研究者希望以规则(语法)的形式帮助计算机理解自然语言。然而,有限的规则无法处理无限的语言。因此,之后的研究重心转向了利用统计模型来处理自然语言。自此,文字和数字,最后殊途同归。为什么要说这些历史呢,是因为不少同学一开始接触文本的时候会产生不小的恐惧:计算机不是只认识数字吗? 文本怎么处理啊? 这怎么扔进去....其实,大可不必惊慌,文本分析的流程和分析数字大概是差不多的。只是多了一步而已:把文本类型的数据转换成合适的数字类型即可,之后的流程几乎是一样的。文本分析的流程大致分为:分词,生成相应feature,根据不同需求扔到模型里跑。
注意: 文本分析涉及到的方向有很多,比如: 分词 、 特征提取、实体提取 、 意图判断 、 多轮对话(建立在前两个基础之上) 、 知识图谱 、 情感分析 等等。由于篇幅限制, 我们在这里只讲共有部分, 即分词和基本的特征提取的基本原理和使用,无论做什么工作(毕竟文本分析的本质只是在算概率大小而已),这两部分都是必须的。入门之后, 请感兴趣的读者自行展开。
准备: 理解文本分析流程接下来,我们通过一个小例子来具体熟悉一下。现在的场景为:政委对一家火锅的评论是:
这家店真好吃,环境优雅,菜品新鲜。
第一步是分词, 只有分了词才能进行向量化。而分词的前提是必须得有一个词库, 这是为什么? 巧妇难为无米之炊啊!计算机再机灵, 也得你告诉它你的喜好嘛!词库的作用就规定了:哪些词才辨识为有用的词,哪些词可以扔掉。假设词库里只有以下词: 这家,店,真,不好吃,好吃,环境优雅,菜品新鲜,下次,再来,不来了。在最简单情况下,直接采用字符串匹配来进行分词, 结果是:
这家 | 店 | 真 | 好吃 | 环境优雅 | 菜品新鲜.
既然我们最终的目的是文本数据转换为数字,采用最简单的词频来表示特征,所以以上最终词频为:
这样,我们就得到了最简单的文本向量。政委的评价的文本向量为: [1 1 1 0 1 1 1 0 0 0]。假设,这家火锅店有N个顾客进行了评价, 我们就得到了多条评论。向量化后就应该类似如下
这样,只需以"评价情感"这列作为y,所有的评价向量作为x,扔进模型训练即可。总结一下: 文本分析和数字类型的分析并没有多大区别, 只需将文本数据先进行向量化即可。例如:一条文本数据的特征可理解为其所包含的词在整体词库所包出现的词频、概率等等。
1.分词为什么需要分词呢? 还是用上面政委的那句话:
这家店真好吃,环境优雅,菜品新鲜。
来解释。这里,我们使用了逗号进行分割,消除了存在歧义的可能性。为了说明问题,这时候我们把标点符号换个位置,变成:
这家店真,好吃环境,优雅菜,品新鲜。
这句话理解起来可不是这么轻松了。可见,逗号的位置影响了对语句的理解。逗号是给人看的,计算机可不认识逗号。这时候, 就需要分词了。分词的作用也是为了消除歧义, 即让计算机理解。中文分词的基本思路是: 使得切分后这个句子出现的概率最大的切分方式就认为是最优的。这里怎么理解出现的概率最大的切分方式呢?翻译过来等价于:说人话的句子!正常人常用的能理解的语言!这种切分在人类使用的语言中出现的概率足够大。例如上面的例子中,第一句话出现的概率是: P(这家店, 真, 好吃, 环境优雅, 菜品新鲜) = 0.8;第二句话出现的概率是: P(这家店真, 好吃环境, 优雅菜, 品新鲜) = 0.1。那么, 合理的分词就应该是第一句话的分词。这样, 我们就解决了词语歧义的问题。为了高效找到最优分词的结果, 往往会用"动态规划"的思路以及Viterbi算法。感兴趣的读者可以自行查阅。
注意,只有中文(其实应该说是亚洲语言)才需要分词。英文(其实应该说是罗马体系的语言)由于天然有空格作为分割,就不需要中文这样较为复杂的分词方式。当然以上说法其实并不完全准确,只是为了说明问题。分词与否还需要看具体的应用场景,比如英文手写字体也需要用到分词的思路, 这里就不深究了。
另一个值得注意的地方是, 在分词前最好能够先过滤停用词。还是上面政委说的话:
这家店好吃的很,环境优雅的很,菜品新鲜的很。
"的很"是个"虚词"(学语言的少年请绕道...), 通常情况下没什么意义, 我们更希望把冗余信息去掉, 这时候就需要在分词前过滤停用词。
停用词, 简单理解是人为认为不重要的词, 过滤对结果不影响或有提升作用的词。
换言之, 停用词是"数据噪音", 过滤停用词可以理解为数据清洗的过程。
2.特征提取● 词频1.思路
最简单粗暴的办法:不管什么词库,分词完后,某个单词出现一次就加1,计数完成后直接放入所需要的模型中训练。设想两个人说的话:政委一号:
这家店真好吃, 环境优雅, 菜品新鲜。
政委二号:
这家店真好吃,环境真优雅,菜品真新鲜。
最终:
2.优缺点
优点: 不用考虑维护什么词库, 只以训练样本出现的词作为词库。
缺点: 只考虑了出现词作为文本特征, 但是并未考虑未出现的词。未出现也是一种特征啊!而且大量的词必然是未出现的(词库这么大, 怎能一句话全塞下)。当然应该纳入考量因素中。为了克服这个缺点, 可以考虑下面的词袋模型。
● 词袋模型1.思路
词袋模型的思路是:该模型忽略掉文本的语法和语序等要素,将其仅仅看作是若干个词汇的集合,文档中每个单词的出现都是独立的。为词库中所有词准备一个坑,一段文本中,每个词都去词库中找。现在, 词库有7个词, 那就准备7个坑.这家: [1 0 0 0 0 0 0]店: [0 1 0 0 0 0 0]真: [0 0 1 0 0 0 0]环境优雅: [0 0 0 1 0 0 0]下次: [0 0 0 0 1 0 0]再来:[0 0 0 0 0 1 0]不来了: [0 0 0 0 0 0 1]然后再扔进模型里跑即可。
2.优缺点
这样做的优点: 将文本数据很方便就转换成向量进行表示, 看起来也比较直观.这样做的缺点: 由于忽略了文本的语法和语序,这部分信息就被很大程度上忽略了, 对于一些依赖上下文的文本而言, 这样处理可能并不合适.
比如:
政委一号:
这家店真好吃,环境优雅,菜品新鲜,态度差。
政委三号:
这家店真好吃,环境优雅,菜品新鲜。但是态度差。
如果用词袋模型表示, 由于忽略了文本之间的语序, "真好吃"中的"真"字可以形容"好吃", 也可以形容"差", 即会出现"真好吃"和"真差"两种可能。如果只考虑情感的正负性, 那影响可能不会很大, 但是, 如果考虑到情感的程度, 这影响可就大了。"差"和"真差", "好吃"和"真好吃", 差别可不小!因此, 用词袋模型编码就损失了一部分信息。
为了进一步减少编码过程中信息的损失,可以考虑使用TF-IDF进行编码。
● TF-IDF1.思路
TF-IDF是两个合成词的缩写: TF代表 词频(Term Frequencey), 即某个词在该文档中出现的频率;IDF代表逆文档频率(Inverse Document Frequency), 用于衡量某个词在所有词库中的重要程度。TF = 当前词在该文档中出现的次数 / 文档中词的总数IDF = log(总文档个数+1 / (当前词出现的文档个数+1))注意, 在分母中+1是为了防止出现分母为0的情况。在分子中+1是为了IDF始终≥0。本章出现的log默认以e为底。TF-IDF = TF * IDF现在1 2 3号政委一起出场了.(铺垫了很久, 垫了很久, 很久, 久)
政委一号: 这家店真好吃,环境优雅。
政委二号: 这家店真好吃,环境优雅,菜品新鲜。态度真不错。
政委三号: 这家店真好吃。环境优雅,菜品新鲜。但是态度真差。
这3位政委对这家店的评价就当做是3篇文档, 这3篇文档就是我们的总文档个数。总词库里的词有: 真好吃, 环境优雅, 菜品新鲜, 态度, 真差, 真。TF1, IDF1分别代表第一篇文档的TF和IDF。
以第一篇文档为例
政委一号: 这家店真好吃,环境优雅,菜品新鲜。
未出现的词有: "态度"和"真差", 这些TF*IDF都为0. "真", "真好吃", "环境优雅"在每篇文档都出现过, TF都是1/6, 经过IDF的调整后, 最终TF*IDF都为0。也就是说, 在越多篇文章都出现过的词的权重更低, 这也很符合常理, 比如一篇文章中出现次数最多的词一定是"的"。通过比较TF-IDF的大小,我们就找到了哪些属于文章特有的"关键词"。通过上面的例子, TF*IDF的基本思路也不难理解了: 认为出现次数多的词更不重要, 出现次数少的词更重要。这种思路也非常符合日常生活: 日常对话中, 出现最多的词是"的"这类虚词, 这对模型并没有什么帮助。TF-IDF的处理能把这类词的-IDF降到很低。
2.优缺点
优点: TF-IDF能有效度量哪些词更加重要.缺点: 虽然TF-IDF非常有效, 但是, 仍然无法有效解决上下文依赖的问题。比如"真好吃"中的"真"字也可能出现在"态度真差"中。要想深入了解如何进一步改进TF-IDF,读者可以仔细去搜索word2vec。由于其原理相对复杂,本书先不做介绍。偷偷告诉大家狗熊会的其它丛书会仔细讲解哦。好了,今天就讲到这里。大家应该感觉到无比轻松,那是因为没有一行代码哈哈哈。下次将进入实践环节。本次无作业。▼往期精彩回顾▼初步搭建数据科学工作环境
Conda的使用
Spyder入门
Jupyter入门
Markdown
简单读写数据
数据类型
数据结构
控制流
函数与模块
Numpy
pandas1
pandas2
pandas3
pandas4
绘图模块1
绘图模块2
绘图模块3
绘图模块4
统计建模1
统计建模2
统计建模3
统计建模4
机器学习模块1
机器学习模块2
下载本系列相关数据