![3fea9ebf5042eaa1638f5d31c267402d.gif](https://i-blog.csdnimg.cn/blog_migrate/e9b2e15e5fac2629bed0d0a6e098f636.gif)
![f3d9f549c72526986d45bc95e5856544.png](https://i-blog.csdnimg.cn/blog_migrate/e377fb35c49f8a18df2ff972e478f094.png)
![036b67d2e2ab8e6e22e86cee7394b1f8.gif](https://i-blog.csdnimg.cn/blog_migrate/03ba4a31ad5d144007d9f66f477f7654.gif)
注意: 文本分析涉及到的方向有很多,比如: 分词 、 特征提取、实体提取 、 意图判断 、 多轮对话(建立在前两个基础之上) 、 知识图谱 、 情感分析 等等。由于篇幅限制, 我们在这里只讲共有部分, 即分词和基本的特征提取的基本原理和使用,无论做什么工作(毕竟文本分析的本质只是在算概率大小而已),这两部分都是必须的。入门之后, 请感兴趣的读者自行展开。
准备: 理解文本分析流程![8247a38c3087fc02a45b4200dff3d239.png](https://i-blog.csdnimg.cn/blog_migrate/567f94efd9256c2a898f2607eaefbfb8.png)
![036b67d2e2ab8e6e22e86cee7394b1f8.gif](https://i-blog.csdnimg.cn/blog_migrate/03ba4a31ad5d144007d9f66f477f7654.gif)
这家店真好吃,环境优雅,菜品新鲜。
第一步是分词, 只有分了词才能进行向量化。而分词的前提是必须得有一个词库, 这是为什么? 巧妇难为无米之炊啊!计算机再机灵, 也得你告诉它你的喜好嘛!词库的作用就规定了:哪些词才辨识为有用的词,哪些词可以扔掉。 假设词库里只有以下词: 这家,店,真,不好吃,好吃,环境优雅,菜品新鲜,下次,再来,不来了。 在最简单情况下,直接采用字符串匹配来进行分词, 结果是:![036b67d2e2ab8e6e22e86cee7394b1f8.gif](https://i-blog.csdnimg.cn/blog_migrate/03ba4a31ad5d144007d9f66f477f7654.gif)
这家 | 店 | 真 | 好吃 | 环境优雅 | 菜品新鲜.
既然我们最终的目的是文本数据转换为数字,采用最简单的词频来表示特征,所以以上最终词频为:![2b5fd19f9bbc95c722f2f1f266e79754.gif](https://i-blog.csdnimg.cn/blog_migrate/5e94bb54e7da851d051f5326dc05c1d0.gif)
![036b67d2e2ab8e6e22e86cee7394b1f8.gif](https://i-blog.csdnimg.cn/blog_migrate/03ba4a31ad5d144007d9f66f477f7654.gif)
这家店真好吃,环境优雅,菜品新鲜。
来解释。这里,我们使用了逗号进行分割,消除了存在歧义的可能性。为了说明问题,这时候我们把标点符号换个位置,变成:![036b67d2e2ab8e6e22e86cee7394b1f8.gif](https://i-blog.csdnimg.cn/blog_migrate/03ba4a31ad5d144007d9f66f477f7654.gif)
这家店真,好吃环境,优雅菜,品新鲜。
这句话理解起来可不是这么轻松了。可见,逗号的位置影响了对语句的理解。逗号是给人看的,计算机可不认识逗号。这时候, 就需要分词了。分词的作用也是为了消除歧义, 即让计算机理解。 中文分词的基本思路是: 使得切分后这个句子出现的概率最大的切分方式就认为是最优的。这里怎么理解出现的概率最大的切分方式呢?翻译过来等价于:说人话的句子!正常人常用的能理解的语言!这种切分在人类使用的语言中出现的概率足够大。例如上面的例子中,第一句话出现的概率是: P(这家店, 真, 好吃, 环境优雅, 菜品新鲜) = 0.8;第二句话出现的概率是: P(这家店真, 好吃环境, 优雅菜, 品新鲜) = 0.1。那么, 合理的分词就应该是第一句话的分词。这样, 我们就解决了词语歧义的问题。为了高效找到最优分词的结果, 往往会用"动态规划"的思路以及Viterbi算法。感兴趣的读者可以自行查阅。![036b67d2e2ab8e6e22e86cee7394b1f8.gif](https://i-blog.csdnimg.cn/blog_migrate/03ba4a31ad5d144007d9f66f477f7654.gif)
注意,只有中文(其实应该说是亚洲语言)才需要分词。英文(其实应该说是罗马体系的语言)由于天然有空格作为分割,就不需要中文这样较为复杂的分词方式。当然以上说法其实并不完全准确,只是为了说明问题。分词与否还需要看具体的应用场景,比如英文手写字体也需要用到分词的思路, 这里就不深究了。
另一个值得注意的地方是, 在分词前最好能够先过滤停用词。 还是上面政委说的话:![036b67d2e2ab8e6e22e86cee7394b1f8.gif](https://i-blog.csdnimg.cn/blog_migrate/03ba4a31ad5d144007d9f66f477f7654.gif)
这家店好吃的很,环境优雅的很,菜品新鲜的很。
"的很"是个"虚词"(学语言的少年请绕道...), 通常情况下没什么意义, 我们更希望把冗余信息去掉, 这时候就需要在分词前过滤停用词。![036b67d2e2ab8e6e22e86cee7394b1f8.gif](https://i-blog.csdnimg.cn/blog_migrate/03ba4a31ad5d144007d9f66f477f7654.gif)
停用词, 简单理解是人为认为不重要的词, 过滤对结果不影响或有提升作用的词。
换言之, 停用词是"数据噪音", 过滤停用词可以理解为数据清洗的过程。 2.特征提取![2b5fd19f9bbc95c722f2f1f266e79754.gif](https://i-blog.csdnimg.cn/blog_migrate/5e94bb54e7da851d051f5326dc05c1d0.gif)
1.思路
最简单粗暴的办法:不管什么词库,分词完后,某个单词出现一次就加1,计数完成后直接放入所需要的模型中训练。 设想两个人说的话: 政委一号:![036b67d2e2ab8e6e22e86cee7394b1f8.gif](https://i-blog.csdnimg.cn/blog_migrate/03ba4a31ad5d144007d9f66f477f7654.gif)
这家店真好吃, 环境优雅, 菜品新鲜。
政委二号:
![036b67d2e2ab8e6e22e86cee7394b1f8.gif](https://i-blog.csdnimg.cn/blog_migrate/03ba4a31ad5d144007d9f66f477f7654.gif)
这家店真好吃,环境真优雅,菜品真新鲜。
最终:
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.优缺点
这样做的优点: 将文本数据很方便就转换成向量进行表示, 看起来也比较直观. 这样做的缺点: 由于忽略了文本的语法和语序,这部分信息就被很大程度上忽略了, 对于一些依赖上下文的文本而言, 这样处理可能并不合适.比如:
政委一号:
![036b67d2e2ab8e6e22e86cee7394b1f8.gif](https://i-blog.csdnimg.cn/blog_migrate/03ba4a31ad5d144007d9f66f477f7654.gif)
这家店真好吃,环境优雅,菜品新鲜,态度差。
政委三号:
![036b67d2e2ab8e6e22e86cee7394b1f8.gif](https://i-blog.csdnimg.cn/blog_migrate/03ba4a31ad5d144007d9f66f477f7654.gif)
这家店真好吃,环境优雅,菜品新鲜。但是态度差。
如果用词袋模型表示, 由于忽略了文本之间的语序, "真好吃"中的"真"字可以形容"好吃", 也可以形容"差", 即会出现"真好吃"和"真差"两种可能。如果只考虑情感的正负性, 那影响可能不会很大, 但是, 如果考虑到情感的程度, 这影响可就大了。"差"和"真差", "好吃"和"真好吃", 差别可不小!因此, 用词袋模型编码就损失了一部分信息。1.思路
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号政委一起出场了.(铺垫了很久, 垫了很久, 很久, 久)![036b67d2e2ab8e6e22e86cee7394b1f8.gif](https://i-blog.csdnimg.cn/blog_migrate/03ba4a31ad5d144007d9f66f477f7654.gif)
政委一号: 这家店真好吃,环境优雅。
政委二号: 这家店真好吃,环境优雅,菜品新鲜。态度真不错。
政委三号: 这家店真好吃。环境优雅,菜品新鲜。但是态度真差。
这3位政委对这家店的评价就当做是3篇文档, 这3篇文档就是我们的总文档个数。总词库里的词有: 真好吃, 环境优雅, 菜品新鲜, 态度, 真差, 真。TF1, IDF1分别代表第一篇文档的TF和IDF。以第一篇文档为例
![036b67d2e2ab8e6e22e86cee7394b1f8.gif](https://i-blog.csdnimg.cn/blog_migrate/03ba4a31ad5d144007d9f66f477f7654.gif)
政委一号: 这家店真好吃,环境优雅,菜品新鲜。
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
![09988b28f9e96252d9bf3999c5fd233f.png](https://i-blog.csdnimg.cn/blog_migrate/b06f7ef70af573671d3b4190d60d3b16.jpeg)