# 电影数据集关联规则挖掘:
关联规则挖掘在生活中有很多使用场景,不仅是商品的捆绑销售,甚至在挑选演员决策上,你也能通过关联规则挖掘看出来某个导演选择演员的倾向。
### 如何使用Apriori工具包
Apriori虽然是十大算法之一,不过在sklearn工具包中并没有它,也没有FP-Growth算法。这里教你个方法,来选择Python中可以使用的工具包,你可以通过<https://pypi.org/> 搜索工具包。
![img](assets/76a3b34beccbe7b69a11951b4efd80c7.png)
这个网站提供的工具包都是Python语言的,你能找到8个Python语言的Apriori工具包,具体选择哪个呢?建议你使用第二个工具包,即efficient-apriori。后面我会讲到为什么推荐这个工具包。
首先你需要通过pip install efficient-apriori 安装这个工具包。
然后看下如何使用它,核心的代码就是这一行:
```
itemsets, rules = apriori(data, min_support, min_confidence)
```
其中data是我们要提供的数据集,它是一个list数组类型。min_support参数为最小支持度,在efficient-apriori工具包中用0到1的数值代表百分比,比如0.5代表最小支持度为50%。min_confidence是最小置信度,数值也代表百分比,比如1代表100%。
关于支持度、置信度和提升度,我们再来简单回忆下。
支持度指的是某个商品组合出现的次数与总次数之间的比例。支持度越高,代表这个组合出现的概率越大。
置信度是一个条件概念,就是在A发生的情况下,B发生的概率是多少。
提升度代表的是“商品A的出现,对商品B的出现概率提升了多少”。
接下来我们用这个工具包,跑一下上节课中讲到的超市购物的例子。下面是客户购买的商品列表:
![img](assets/a48f4a2961c3be811431418eb84aeaa6.png)
具体实现的代码如下:
```
from efficient_apriori import apriori
# 设置数据集
data = [('牛奶','面包','尿布'),
('可乐','面包', '尿布', '啤酒'),
('牛奶','尿布', '啤酒', '鸡蛋'),
('面包', '牛奶', '尿布', '啤酒'),
('面包', '牛奶', '尿布', '可乐')]
# 挖掘频繁项集和频繁规则
itemsets, rules = apriori(data, min_support=0.5, min_confidence=1)
print(itemsets)
print(rules)
```
运行结果:
```
{1: {('啤酒',): 3, ('尿布',): 5, ('牛奶',): 4, ('面包',): 4}, 2: {('啤酒', '尿布'): 3, ('尿布', '牛奶'): 4, ('尿布', '面包'): 4, ('牛奶', '面包'): 3}, 3: {('尿布', '牛奶', '面包'): 3}}
[{啤酒} -> {尿布}, {牛奶} -> {尿布}, {面包} -> {尿布}, {牛奶, 面包} -> {尿布}]
```
你能从代码中看出来,data是个List数组类型,其中每个值都可以是一个集合。实际上你也可以把data数组中的每个值设置为List数组类型,比如:
```
data = [['牛奶','面包','尿布'],
['可乐','面包', '尿布', '啤酒'],
['牛奶','尿布', '啤酒', '鸡蛋'],
['面包', '牛奶', '尿布', '啤酒'],
['面包', '牛奶', '尿布', '可乐']]
```
两者的运行结果是一样的,efficient-apriori 工具包把每一条数据集里的项式都放到了一个集合中进行运算,并没有考虑它们之间的先后顺序。因为实际情况下,同一个购物篮中的物品也不需要考虑购买的先后顺序。
而其他的Apriori算法可能会因为考虑了先后顺序,出现计算频繁项集结果不对的情况。所以这里采用的是efficient-apriori这个工具包。
### 挖掘导演是如何选择演员的
在实际工作中,数据集是需要自己来准备的,比如今天我们要挖掘导演是如何选择演员的数据情况,但是并没有公开的数据集可以直接使用。因此我们需要使用之前讲到的Python爬虫进行数据采集。
不同导演选择演员的规则是不同的,因此我们需要先指定导演。数据源我们选用豆瓣电影。
先来梳理下采集的工作流程。
首先我们先在<https://movie.douban.com>搜索框中输入导演姓名,比如“宁浩”。
![img](assets/eaba9861825a38b6fbd5af1bff7194ef.png)
页面会呈现出来导演之前的所有电影,然后对页面进行观察,你能观察到以下几个现象:
1. 页面默认是15条数据反馈,第一页会返回16条。因为第一条数据实际上这个导演的概览,你可以理解为是一条广告的插入,下面才是真正的返回结果。
2. 每条数据的最后一行是电影的演出人员的信息,第一个人员是导演,其余为演员姓名。姓名之间用“/”分割。
有了这些观察之后,我们就可以编写抓取程序了。在代码讲解中你能看出这两点观察的作用。抓取程序的目的是为了生成宁浩导演(你也可以抓取其他导演)的数据集,结果会保存在csv文件中。完整的抓取代码如下:
```python
# -*- coding: utf-8 -*-
from efficient_apriori import apriori
from lxml import etree
import time
from selenium import webdriver
import csv
driver = webdriver.Chrome()
# 设置想要下载的导演 数据集
director = u'宁浩'
# 写CSV文件
file_name = './' + director + '.csv'
base_url = 'https://movie.douban.com/subject_search?search_text='+director+'&cat=1002&start='
out = open(file_name,'w', newline='', encoding='utf-8-sig')
csv_write = csv.writer(out, dialect='excel')
# 下载指定页面的数据
def download(request_url):
driver.get(request_url)
time.sleep(1)
html = driver.find_element_by_xpath("//*").get_attribute("outerHTML")
html = etree.HTML(html)
# 设置电影名称,导演演员 的XPATH
movie_lists = html.xpath("/html/body/div[@id='wrapper']/div[@id='root']/div[1]//div[@class='item-root']/div[@class='detail']/div[@class='title']/a[@class='title-text']")
name_lists = html.xpath("/html/body/div[@id='wrapper']/div[@id='root']/div[1]//div[@class='item-root']/div[@class='detail']/div[@class='meta abstract_2']")
# 获取返回的数据个数
num = len(movie_lists)
if num > 15: #第一页会有16条数据
# 默认第一个不是,所以需要去掉
movie_lists = movie_lists[1:]
name_lists = name_lists[1:]
for (movie, name_list) in zip(movie_lists, name_lists):
# 会存在数据为空的情况
if name_list.text is None:
continue
# 显示下演员名称
print(name_list.text)
names = name_list.text.split('/')
# 判断导演是否为指定的director
if names[0].strip() == director:
# 将第一个字段设置为电影名称
names[0] = movie.text
csv_write.writerow(names)
print('OK') # 代表这页数据下载成功
if num >= 15:
# 继续下一页
return True
else:
# 没有下一页
return False
# 开始的ID为0,每页增加15
start = 0
while start<10000: #最多抽取1万部电影
request_url = base_url + str(start)
# 下载数据,并返回是否有下一页
flag = download(request_url)
if flag:
start = start + 15
else:
break
out.close()
print('finished')
```
代码中涉及到了几个模块,我简单讲解下这几个模块。
在引用包这一段,我们使用csv工具包读写CSV文件,用efficient_apriori完成Apriori算法,用lxml进行XPath解析,time工具包可以让我们在模拟后有个适当停留,代码中我设置为1秒钟,等HTML数据完全返回后再进行HTML内容的获取。使用selenium的webdriver来模拟浏览器的行为。
在读写文件这一块,我们需要事先告诉python的open函数,文件的编码是utf-8-sig(对应代码:encoding=‘utf-8-sig’),这是因为我们会用到中文,为了避免编码混乱。
编写download函数,参�
博士僧小星
- 粉丝: 2394
- 资源: 5995
最新资源
- 4wb030-社区讯息服务小程序_springboot+vue+uniapp.zip
- 基于Scrapy的Python3分布式淘宝爬虫源码.zip
- 机械设计瓦楞纸板数码打印机sw16项目全套技术资料.zip
- MATLAB实现基于STAR-RIS辅助的MISO系统安全速率分割方案
- JavaScript课程设计实训大作业:购物网站(源码+文档说明)高分项目
- fpga uart串口verilog波特率 奇偶 校验 可配置rs232 rs422 rs485代码 资料包C利: 1.uart-test:串口 Verilog altera工程代码,支持:波特率、校
- 机械设计小型整流器sw20可编辑项目全套技术资料.zip
- 汇川H5U搭配汇川IT7070系列案例程序,可做为模板程序使用 PL程序可以直接与触摸屏进行离线仿真PLC为H5U 功能齐全、分类清晰PLC只需写动作,其他统一调用功能块 完整的模块化程序,人性化设计
- 基于labview的双通道波形发生器报告可以生成正弦波、方波、三角波、锯齿波、白噪声等基本波形,可将两个信号在同一个波形图上显示 代码是成品
- 基于springboot的可盈保险合同管理系统的设计与实现源码(java毕业设计完整源码+LW).zip
- Carsim Simulink联合仿真基于LQR 模糊PID 滑模控制的横摆稳定性控制系统 综合跟随理想横摆角速度的方法和抑制汽车质心侧偏角的汽车稳定性控制方法,以线性二自由度车辆操纵特性模型为控制目
- 基于springboot的校园失物招领系统源码(java毕业设计完整源码+LW).zip
- 基于springboot的江理工文档管理系统的设计与实现源码(java毕业设计完整源码+LW).zip
- 基于Python Turtle库构建经典贪吃蛇游戏
- Realtek Driver progam Guide
- 基于springboot的智慧图书管理系统设计与实现源码(java毕业设计完整源码+LW).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
- 4
前往页