# 电影推荐
## 1.关于电影推荐的自然语言处理
### 1.1 语料库的建立
进行语料处理时我们会遇到的主要问题之一就是如何将大的数据集读入内存当中然后进行相应的处理。
![](https://www.writebug.com/myres/static/uploads/2021/12/14/8041e14759d726802646d1ed036eb265.writebug)
(图中所示的数据集是豆瓣网上 5000 部电影描述信息的分词结果,每一行的数据是一部电影的所有信息。不过从数据大小上看,该数据集属于小的数据集,大的数据集从容量上讲就是以 GB 甚至以 TB 为单位)
### 1.1.1Linecache 模块
对于大的数据,python 提供了很多的功能进行读取,其中之一就是 linecache 模块。Linecache 模块功能非常强大,其中包含了多种函数进行调用 linecache.getlines(filename)可以读取文件中的所有内容。linecache.getline(filename,lineno)可以读取文件中的任意行。另外,普通的文件读取方式都是类似于:m=open("F:Programming…,在 python 语言当中,这样的文件读取方式是非常不适合大型数据的读取的,因为一旦采用这种形式进行数据的读取,就会导致所读文件整体被写入内存当中,如果文件过大,内存就无法存储,读取一定会失败。不过,linecache 模块的读取是一种类似于迭代器形式的读取,从而可以使得在读取大的文件的时候不会将所有的文件一次性全部读入,导致因为内存不够产生的程序错误。
## 1.1.2Corpora 函数
如上图所示,将语料读入程序的数据结构中后,我们就要进行语料库的建立。语料库中所容纳的数据基本可以概括为出现的词的编号以及该词出现的次数。这个工作看似简单,但是如果让研究人员单独编写仍然会耗费非常多的时间,因此,python 其中的一个支持库 gensim 中专门提供了语料库的建立工具 gensim.corpora 函数对语料进行转换。
![](https://www.writebug.com/myres/static/uploads/2021/12/14/8a9ebef8985e14f821e945d71eed2c3b.writebug)
用 gensim.corpora 函数后进行语料转换后的结果如图所示。每个括号当中的值代表的就是一个词的信息,第一个值是该词的编号,第二个词是这个词在一条电影评论中出现的次数。词语的编号是按照整个语料库中的词语进行编制的.
### 1.2TF-IDF
#### 1.2.1TF_IDF 简介
语料库建立完毕之后就需要进行对语料中词语的进一步分析。在我们的生活当中,一篇文章,一条说说,一句评语当中的词语的价值并不相同。我们说任何话一般都会用到”的”,因此像”的”这种词语对于区分不同类型的语句的价值就几乎为 0 了,但是加入一句话中出现一个词“吕克贝松“,我们可以立马分析得到这句话很有可能和某一部电影有关。因此,在进行语料的具体分析之前,我们需要对语料中词语的重要性进行分析,这就诞生了 tf-idf 方法。
#### 1.2.2TF_IDF 应用
tf-idf 的主要思想是:如果某个词或短语在一篇文章中出现的频率(TF)很高,并且在其他文章或者评论中出现很少,则认为此词或者短语具有很好的类别区分能力,适合用来分类。很多人或许会困惑 tf 和 idf 两个词的实际意义,TF 表示的是词频(TermFrequency),词频比较好理解,即是某个词在整个文档中出现的频率。然而,光用词频来表示词在整个数据集当中的重要程度是不够科学的,比如前文中提到的“的“这个词语,出现的频率会在素有的电影评论中出现非常高,虽然高,但很明显不具有什么区分能力。因此,还需要引入另外一个概念,即 IDF。IDF 表示的含义是越少的文档(本项目中代表的是一条电影的描述信息)包含这个词,说明这个词有更好的信息区分能力。
![](https://www.writebug.com/myres/static/uploads/2021/12/14/41119e6501bfe241d10b7b517e2f710a.writebug)
上图所示的是用 tf-idf 对语料库进行进一步分析后的结果矩阵的一部分
### 1.3LDA 矩阵
#### 1.3.1LDA 模型的介绍
LDA 模型的全称是隐含狄利克雷分配(LDA,LatentDirichletAllocation)。是一种今年来发展起来的一种非常重要的离散数据集合的建模方法。其主要的功能就是可以生成文本的主题分布向量,分析然后挖掘出文本的潜在知识。是一种非常优秀的文本聚类的预处理方法。
对于一般的语料分析:“今天下雨了”和“我今天琳湿了”一定是几乎没有相似点的两句话,然而在实际的生活当中,这两句话很有可能表示的是几乎相同的意思。这就需要引入 LDA 模型进行。其基本的思想就是先对类似的文本进行聚类,确定每个文本的隐含主题,然后进行分析。其主要的优点在于会考虑潜在的语义信息,不单纯从词频角度进行分析,还可以映射至内部的隐含主题,过滤噪音。
#### 1.3.2LDA 语料处理的实现
![](https://www.writebug.com/myres/static/uploads/2021/12/14/a49a560544a4ec60948de1b309668da5.writebug)
如上图所示是利用 lda 模型对语料进行分析的结果,所得结果的数值的含义是。每一个列表中所有的数值组成了一条电影信息的向量。每条向量都唯一标识了一条电影的信息的各个特征。在本次实训当中,我们一共有近 5000 条电影信息,因此共生成 5000 条向量标识各个电影信息。
#### 1.3.3LDA 模型语料的查询
建立好 LDA 矩阵后,我们就可以利用查询的语句的生成的 LDA 模型对应的向量和系统中原先就计算好的 LDA 模型中的向量进行比较。选择出和查询语句距离最小的前 10 个向量。过匹配得到的向量,利用实现编写好的 mapping 函数就可以找出这些向量对应的电影编号,最终找出匹配的电影。
#### 1.3.4Lda 模型在使用中遇到的问题
![](https://www.writebug.com/myres/static/uploads/2021/12/14/49e7135712d6463163668d15d5216b71.writebug)
上图所示的 LDA 矩阵有一个非常明显的特点,就是非常稀疏,矩阵中的向量绝大都是以 0 为元素的,这就会导致一个非常严重的问题。维度灾难。随着维度的增加,高维空间的体积成几何倍增长,空间非常巨大。因此,对于高维空间的数据,并且向量的差异程度较小(很多维的数据都是 0),那么就会导致这些向量非常非常相似。很难以进行区分。因此,最终分析得到的结果就不容乐观了。关于优化的方法可以有各类型的降维方法。
### 1.4LSI 矩阵
#### 1.4.1LSI 模型的介绍
LSI 模型的英文全称是:LatentSemanticIndexing,中文意译是潜在语义索引,主要指的是通过海量文献(整个语料集)找出词汇之间的关系从而进行分析。当两个词或一组词大量出现在一条评论,介绍信息或者文档中时,这些词之间就可以被认为是语义相联系的,从而我们可以通过词语和词语之间的联系来建立评论向量,描述每条语句的隐含主题。
#### 1.4.2LSI 模型语料处理的实现
![](https://www.writebug.com/myres/static/uploads/2021/12/14/746ad4aa9d3331c3ebf803d699c0a829.writebug)
上图是利用 LSI 模型进行语料处理后生成的矩阵,从该矩阵中我们可以发现,不同于 LDA 矩阵,该矩阵不是一种稀疏矩阵,因而每条向量直接的相似度更加低,最后处理的结果也更加好。
下图是通过描述电影风暴最后搜索得到的结果:
![](https://www.writebug.com/myres/static/uploads/2021/12/14/ab6ac7a84706f26171518cdb2cf575ef.writebug)
可见利用 lsi 进行语料分析最终得到的结果准确度还是非常不错的。
### 1.5 数据可视化
#### 1.5.1 扇形图
利用 python 进行数据处理的一个很大的�
- 1
- 2
前往页