开发者学堂课程【高校精品课-华东师范大学 - Python 数据科学基础与实践:文本相似性实验1】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1067/detail/15504
文本相似性实验1
第四个实验是做词和文本相似性的实验。如果要做相似性计算,我们需要把文本进行量化表示,量化表示有很多方法,数学方法为主,现在老师选两个给大家讲一下,一个是tfidf——词频和力文档频率,另一个是词向量技术,分布式表示的词向量技术。
下面就来看一下词向量,基于词向量的词的相似性计算,图示的数据和代码里面就包括了实验的数据。
先加载一下这些包,word2vec是在gensim包里,用的时候要安装一下;jieba是做词特征处理的分词;下面数据目录里面有一个text8语料,这是一个英文语料,包括了很多英文的新闻报道,大约有九十几兆的语料。下面就是用word2vec,已经从gensim里面导(import)出来了,用它里面带的函数word2vec去构造词向量,把在语料里面加载的sentences作为word2vec的输入,大小是200,就是一个词的向量大小是200;后面有一个函数叫text8Corpus,这是word2vec用来处理英文语料的,就是它里面带着这个功能。我们运行一下,它需要一点时间,因为它里面有九十几兆的英文语料,还要这个语料去训练,然后来构建词向量。
运行中老师给大家讲一下这个软件需要注意的地方,在单元格的左边,星号表示它一直在运行,如果你的星号很长时间都出不来,有可能是电脑卡住了;还有右上角实心的圆圈,也表示它正在运行,当实心圆圈变成空的圆圈时运行结束,所以在等待时要注意观察这些信号的提示,以便知道目前的状况。
目前是在训练词向量,相关底下的语言规律已经运行好了,单元格左边的星号已经没有了,右上角也变成空心圆圈,已经运行好了。看语言规律,我们构建的是词向量,每一个词是200位的向量。
既然是向量就可以做计算,比如一个词的向量和另外一个词的向量可以做加减的计算,这就是它强大的地方,本质上我们要做文本挖掘,把这些文本要变成量化的数字,然后用这些数字进行运算,充分发挥计算机强大的计算能力。
接下来看这个例子,先看一下词向量是什么样子,比如我们刚刚运行的词向量是model,然后model里面插一下woman,它的词向量是什么样子?插一下man,它的词向量是什么样子?运行一下,每一个都是200个元素的词向量,每一个值代表什么意思是需要计算的,不像tfidf一个特征就一个值,这里的一个特征有一个向量值。
接下来有了向量就可以计算了,模块里面带了一个most_similar最相似的函数,这个函数里面的参数大家注意,它可以有两个参数,一个是正的,可以加在一起的;一个是负的,可以减去的。
下面要加起来计算,要加在一起的是woman和king,再减去man的向量。然后要找到最相似的第一条记录,换一句表达就是:要找这样一个单词,它和king很像的,场景很像、上下文很像;但是它要加上woman(女人),还要减掉man(男人);它是女性,要去掉男性。它应该是女王queen,函数返回的结果就是queen,它和计算要求的概率最高。
这个是它自己算出来的,我们并没有给它做任何指定、没有做监督、没有给它打标签、没有告诉它什么内容;它完全就是通过上下文学出来的、完全通过词向量计算出来的,它是很强大的。
这个例子是2012年,谷歌把word2vec开放出来以后就提供了这个案例,很多人用了以后,轰动了整个业界,可以这样来做文本、判断文本的相似性,在2012年之前还做不到这点,谷歌公司确实很伟大。
接下来看这个例子是找相似的词,这个词是和father很像,但是要加上girl,要减掉boy,然后要找到最近的、概率最高的三个词。找到的结果是mother、grandmother、wife;这是它自己找到的,这也是它强大的地方。
下面看这个例子是更神奇的,我们需要数据[”he his she ”,”bi bigger bad”,”going went being”]做一个循环,再用每一个循环里面的example,然后在split里默认按照空格切开来,等于这里面的每一个词有三个,所以用三个变量给它接收,然后下面再用most
_similar,前面两个放的是[x,b],我们要找的是跟she像的,但是要加上his,然后是要被he做处理的,后面是一样的,看一下执行结果。这里是做了一个格式化的输出,格式化输出%s可以用后面内容去替换。
它是he is to his,然后要找一个单词跟它们是很相似的,对she来说它找到的是her,就是这一组he和his,然后找一个和she这种概念很相似的,它找到一个her。
下面是一样的,bigger和big,然后找一个和bad很相似的worse。那我们找一个和going went很相似的being,它找到了was,文本相似性的语义能力非常强大,可以做这样的计算。
下面还有一个叫doesn't_match——不匹配的,就是在这一组单词里面,split就是分成一个个单词,然后一组单词里面它要找到那个单词和其它不相似的。
它做完的结果是cereal,谷物的意思,上面是早餐、中餐、晚餐,当然这个和它们是不相似的。
顺便提一下,这种功能有什么作用呢?它的功能作用是强大的,如果很多人在一个公司要做它的词库、词表,如果自己去找穷尽,可能要花巨大代价。
举个例子:比如我们要找近三年所有发生过的台风,自己要查很多资料,假如自己找到很多新闻报道,已经知道有十个台风,并且找到一大批的新闻报道的语料,然后就用这个语料去训练词向量,把这十个台风给它输进去most_similar,然后它可以找到相似的更多的台风,它就可以自动帮我们去扩展词库。这个很功能很强大,大家要理解这种意思。