Python小白逆袭大神-结营心得
赶在五一前结束的Python小白逆袭大神7天打卡营结束了,经过了7天的练习,我觉得收获还是很多的。经过整理总结,进行分享。
1. 本期培训重点
本期集训营主要是一些库的使用,爬虫的主要技巧,图片绘制技巧等。如想全部消化还是需课下多花时间和精力。
- 第一天开营:1、7日打卡营课程安排 2、Python与人工智能的关系,Python的特点和应用。
实战1: 百度AI开放平台体验-人像漫画,视频内容分析,文本纠错,端语言识别 。
实战2: Python实践-1分钟统计文件名。 - 第二天:1、AI Studio使用与操作。2、Linux命令在AIStudio上的使用。3、Python的进阶用法。
实战: 用Python轻松get《青春有你2》成员剧照。 - 第三天:人工智能应用中最常用的Python库。
实战: 冠军Pick谁?《青春有你2》小姐姐单人助力榜数据大揭秘。 - 第四天: 1、深度学习欲训练模型管理工具PaddleHub的使用。2、深度学习在CV领域的应用内:颜值打分。3、以小姐姐颜值打分为例讲解深度学习主要步骤。
实战: 自制数据集,利用PaddleHub颜值打分。 - 第五天: 1、深度学习在NLP领域的应用:情感分析。 2、深度学习平台EasyDL介绍及使用体验。
实战: 《青春有你2》评论调取,词频统计、绘制词云、自制数据集、利用PaddleHub进行评论情感分析。 - 第六天: 学员完成全部实践,助教答疑。
- 第七天: 结营讲解,经验分享,优秀学员颁奖。
每天的任务总结起来,实际上就是day5的大作业,贯穿整个7天打卡营的内容就是numpy库,pandas库,matplotlab库,python自带OS库,爬虫方法,paddleHub工具使用和EasyDL工具。
其中最重要的是三大库和爬虫技巧。
2. 培训内容概括
整个集训营包括8个课节,但不是每个课间的重要程度都是一样。我自己按照难易程度和重要程度做了一个划分。
总体前瞻
⭐课节1:前置课程 对于有集训经验的同学,直接跳过。 ⭐课节2:Day1–人工智能概述与入门基础
讲的是python中几个典型的数据结构与结合张量进行示范。 ⭐⭐课节3:Day2–Python进阶 Python数据结构;
Python面向对象;Python JSON;Python 异常处理;常见Linux命令。
⭐⭐⭐课节4:Day3–深度学习常用Python库介绍
Python被大量应用在数据挖掘和深度学习领域,其中使用极其广泛的是Numpy、pandas、Matplotlib、PIL等库。
⭐⭐⭐课节5:Day4–PaddleHub体验与应用
用口罩检测教你使用PaddleHub工具,也就是不用自己动手搭神经网络框架了,只要准备数据+训练就行。
⭐⭐⭐⭐⭐课节6:Day5-EasyDL体验与作业发布 就是结合前4天内容的大作业,相当于一个总结。
⭐⭐⭐课节7:Day6-PaddleHub创意赛发布发布了创意赛和作业答疑,因为第5天的作业比较有难度。
⭐⭐⭐⭐课节8:Day7-课程结营 课程总结,赛事发布。
课节2:Day1–人工智能概述与入门基础
#1.基础操作
age = 20 # 声明一个变量age 用来存储一个数字 20
1+1 # 基础数学加法
print('Hello World!') # 打印Hello World!
#2.条件判断if
if 1 == 2: # 如果 if 跟随的条件为 假 那么不执行属于if 的语句,然后寻找 else
print("假的")
else: # 寻找到 else 之后 执行属于else中的语句
print("1==2是假的")
#3.循环操作---for
for i in range(5):
print(i)
#3.循环操作---while
sum = 0
n = 99
while n > 0:
sum = sum + n
n = n - 1
print(sum)
#4.break、continue、pass
#break语句可以跳出 for 和 while 的循环体
n = 1
while n <= 100:
if n > 10:
break
print(n)
n += 1
#continue语句跳过当前循环,直接进行下一轮循环
n = 1
while n < 10:
n = n + 1
if n % 2 == 0:
continue
print(n)
#pass是空语句,一般用做占位语句,不做任何事情
for letter in 'Room':
if letter == 'o':
pass
print('pass')
print(letter)
#5.数据类型---Number(数字)
#Python支持int, float, complex三种不同的数字类型
a = 3
b = 3.14
c = 3 + 4j
print(type(a), type(b), type(c))
#5.数据类型---String(字符串)
#支持字符串拼接、截取等多种运算
a = "Hello"
b = "Python"
print("a + b 输出结果:", a + b)
#print("a[1:4] 输出结果:", a[1:4])
#5.数据类型---List(列表)
#列表是写在方括号 [] 之间、用逗号分隔开的元素列表。
#列表索引值以 0 为开始值,-1 为从末尾的开始位置。
list = ['abcd', 786 , 2.23, 'runoob', 70.2]
print(list[1:3])
#tinylist = [123, 'runoob']
#print(list + tinylist)
#5.数据类型---Tuple(元组)
#tuple与list类似,不同之处在于tuple的元素不能修改。tuple写在小括号里,元素之间用逗号隔开。
#元组的元素不可变,但可以包含可变对象,如list。
t1 = ('abcd', 786 , 2.23, 'runoob', 70.2)
t2 = (1, )
t3 = ('a', 'b', ['A', 'B'])
t3[2][0] = 'X'
print(t3)
#5.数据类型---dict(字典)
#字典是无序的对象集合,使用键-值(key-value)存储,具有极快的查找速度。
#键(key)必须使用不可变类型。
#同一个字典中,键(key)必须是唯一的。
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
print(d['Michael'])
#5.数据类型---set(集合)
#set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
#set是无序的,重复元素在set中自动被过滤。
s = set([1, 1, 2, 2, 3, 3])
print(s)
看着简单,眼睛会,手也要会,而且要熟练,事实上如果几天不练就会生疏。
课节3:Day2–Python进阶
主要讲到的库总结:
- math
- random
- json
主要讲到的接口总结:
- math.ceil(4.1) # 返回数字的上入整数
- math.floor(4.9) #返回数字的下舍整数
- math.fabs(-10) #返回数字的绝对值
- math.sqrt(9) #返回数字的平方根
- math.exp(1) #返回e的x次幂
- random.random()
- random.seed(10) #当预先使用 random.seed(x) 设定好种子之后,其中的 x 可以是任意数字,此时使用 random() 生成的随机数将会是同一个。
- girls.append(‘杨超越’) #声明一个空列表 girls = [] 1次添加1个
- girls.extend(models) #models = [‘刘雯’,‘奚梦瑶’] 1次添加多个
- girls.insert(1,‘虞书欣’) #指定位置添加
- words.remove(‘cat’) #words = [‘cat’,‘hello’,‘pen’,‘pencil’,‘ruler’]
- words.pop(1) #跟上面一样的效果
- random.randint(1,20) #随机生成这个范围里面的整数
- sorted(random_list) #升序排列一个列表
- sorted(random_list,reverse =True) 降序排列一个列表
- max(random_tuple)
- min(random_tuple)
- sum(random_tuple)
- len(random_tuple)
- random_tuple.count(4) 统计元组中某一个元素的个数
- random_tuple.index(4) 元组中某一个元素对应的下标
- for key,value in dict5.items(): 字典的遍历
- dict5.get(‘赵小棠’,170) #如果能够取到值,则返回字典中的值,否则返回默认值170
python的面向对象
方法:类比CPP来学习
定义一个类Animals:
(1)init()定义构造函数,与其他面向对象语言不同的是,Python语言中,会明确地把代表自身实例的self作为第一个参数传入
(2)创建一个实例化对象 cat,init()方法接收参数
(3)使用点号 . 来访问对象的属性。
Python JSON
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写。json.dumps 用于将 Python 对象编码成 JSON 字符串。
就是一种格式化的文档,里面就是一条条重复的数据,每天数据的性质是一样的。
- text = json.loads(jsonData) #将string转换为dict json.loads 用于解码 JSON 数据。该函数返回 Python 字段的数据类型。
- data = [ { ‘b’ : 2, ‘d’ : 4, ‘a’ : 1, ‘c’ : 3, ‘e’ : 5 } ]
json = json.dumps(data) #json.dumps 用于将 Python 对象编码成 JSON 字符串。
Python异常处理
try:
fh = open("/home/aistudio/data/testfile01.txt", "w")
fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
print('Error: 没有找到文件或读取文件失败')
else:
print ('内容写入文件成功')
fh.close()
try:
f = open("/home/aistudio/data/testfile02.txt", "w")
f.write("这是一个测试文件,用于测试异常!!")
finally:
print('关闭文件')
f.close()
#finally中的内容,退出try时总会执行,就是终究都会被执行
当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。捕捉异常可以使用try/except语句。try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。
常见Linux命令
- gzip:linux压缩文件中最常见的后缀名即为.gz,gzip是用来压缩和解压.gz文件的命令。
#会将文件压缩为文件 test.txt.gz,原来的文件则没有了,解压缩也一样
!gzip /home/aistudio/work/test.txt
- tar:tar本身是一个打包命令,用来打包或者解包后缀名为.tar。配合参数可同时实现打包和压缩。
!tar -zcvf /home/aistudio/work/test.tar.gz /home/aistudio/work/test.txt
- zip和unzip:zip命令和unzip命令用在在Linux上处理.zip的压缩文件。
!zip -r /home/aistudio/work/test.zip /home/aistudio/work/test.txt
!unzip /home/aistudio/work/test.zip
课节4:Day3–深度学习常用Python库介绍
常用库总结:
- numpy
- padas
- PIL
- Matplotlib
常用接口及用法总结:
- array = np.array([[1,2,3], [4,5,6]]) #将列表转化为数组
- zeroarray = np.zeros((2,3)) 可以创建指定长度或者形状的全0数组
- np.ones((3,4),dtype=‘int64’) 可以创建指定长度或者形状的全1数组
- np.empty((3,4))
- array = np.arange( 10, 31, 5 ) #该函数返回数组而不是列表。
- array.ndim #数组的维度
- array.shape #数组的形状
- array.size #数组元素的个数
- array.dtype #数组元素的类型
- np.arange(6).reshape([2,3]) #自定义数组类型
- np.array([[1,2,3],[4,5,6]],dtype=np.int64).reshape([3,2]) #自定义张量形状
- np.dot(arr3,arr4) #数组的点乘
- np.sum(arr3,axis=1) #axis=1,每一行求和 axie=0,每一列求和
- arr3.transpose() #矩阵的转置
- pd.Series([‘a’,‘b’,‘c’,‘d’,‘e’]) #Series带标签的一维数组 Seris中可以使用index设置索引列表。
- pd.Series([‘a’,‘b’,‘c’,‘d’,‘e’],index=[100,200,100,400,500]) #与字典不同的是,Seris允许索引重复
- d = {‘b’: 1, ‘a’: 0, ‘c’: 2} pd.Series(d) #可以通过Series的values和index属性获取其数组表示形式和索引对象
- s[100] s[[400, 500]] #通过索引的方式选取Series中的单个或一组值
- s+s s*3 #对应元素求和,对应元素相乘 (Series中最重要的一个功能是:它会在算术运算中自动对齐不同索引的数据,Series 和多维数组的主要区别在于, Series 之间的操作会自动基于标签对齐数据。因此,不用顾及执行计算操作的 Series 是否有相同的标签。)
- data = {‘state’: [‘Ohio’, ‘Ohio’, ‘Ohio’, ‘Nevada’, ‘Nevada’], ‘year’: [2000, 2001, 2002, 2001, 2002], ‘pop’: [1.5, 1.7, 3.6, 2.4, 2.9]}
frame = pd.DataFrame(data) #相当于定义一张表 - pd.DataFrame(data, columns=[‘year’, ‘state’, ‘pop’]) #如果指定了列顺序,则DataFrame的列就会按照指定顺序进行排列**(如果传入的列在数据中找不到,就会产生NAN值)**
- Image.open(’/home/aistudio/work/yushuxin.jpg’) #读取图片
- img.show() #自动调用计算机上显示图片的工具
- img_mode = img.mode #获得图像的模式
- width,height = img.size #获得图像的大小
- **img_rotate = img.rotate(45) ** #将图片旋转45度
- img1.crop((126,0,381,249)) #按照这4个坐标对图像进行剪切
- **img1_crop_result.save(’/home/aistudio/work/yushuxin_crop_result.jpg’) ** #保存处理后的图片
- img2.resize((int(width0.6),int(height0.6)),Image.ANTIALIAS) #对图片进行缩放
- img3.transpose(Image.FLIP_LEFT_RIGHT) #对图片进行左右翻转
- img3.transpose(Image.FLIP_TOP_BOTTOM) #对图像进行上下翻转
- np.linspace(-1,1,50) #创建等差数列
- plt.plot(x,y) #传入x,y,通过plot()绘制出折线图
- plt.show() #显示图形
- plt.figure(figsize=(7,5)) #创建一个画布**(2张图同时显示在一个画布上)**
- plt.plot(x,y1,color=‘red’,linewidth=1) #对数据添加属性
- plt.xlabel(‘x’,fontsize=20) #设置坐标轴
- plt.legend(handles=[l1,l2],labels=[‘aa’,‘bb’],loc=‘best’) #添加图例
- **plt.xlim((0,1)) ** #x轴只截取一段进行显示
- plt.scatter(dots1,dots2,c=‘red’,alpha=0.5) #散点图
- np.random.rand(50) #随机数
- plt.bar(x,y,facecolor=’#9999ff’,edgecolor=‘white’) #柱状图
- plt.text(ax,ay,’%.1f’ % ay,ha=‘center’,va=‘bottom’) #柱状图上每个数据添加标签
⭐⭐梳理的过程也是自己复习的过程!⭐⭐
课节5:Day4–PaddleHub体验与应用
使用PaddleHub的总体步骤:
- 安装工具paddlehub
- 安装模型
- 喂数据
上手示例1:情感检测:
!pip install paddlehub==1.6.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
!hub install senta_lstm==1.1.0
!hub run senta_lstm --input_text "人工智能课程很有趣"
结果:
[{'text': '人工智能课程很有趣', 'sentiment_label': 1, 'sentiment_key': 'positive', 'positive_probs': 0.9572, 'negative_probs': 0.0428}]
positive_probs’: 0.9572 :0.9572,整体上一个正面的表达,情感是正面的,没啥问题。
上手示例2:口罩检测:
- 安装模型
- 喂数据(事先准备好的)
#安装口罩检测模型
!hub install pyramidbox_lite_mobile_mask==1.1.0
!hub run pyramidbox_lite_mobile_mask --input_path "data/data31681/test.jpeg"
上手示例3:预测
- 加载模型
- 准备数据
module = hub.Module(name="pyramidbox_lite_mobile_mask")
test_img_path = "data/data31681/test.jpeg"
# set input dict
input_dict = {"data": [cv2.imread(test_img_path)]}
results = module.face_detection(data=input_dict)
print(results)
人像抠图,风格迁移模型都有
课节6:Day5-EasyDL体验与作业发布
综合大作业
第一步:爱奇艺《青春有你2》评论数据爬取(参考链接:https://www.iqiyi.com/v_19ryfkiv8w.html#curid=15068699100_9f9bab7e0d1e30c494622af777f4ba39) 爬取任意一期正片视频下评论评论条数不少于1000条。
第二步:词频统计并可视化展示
数据预处理:清理清洗评论中特殊字符(如:@#¥%、emoji表情符),清洗后结果存储为txt文档
中文分词:添加新增词(如:青你、奥利给、冲鸭),去除停用词(如:哦、因此、不然、也好、但是)
统计top10高频词
可视化展示高频词
第三步:绘制词云:根据词频生成词云可选项-添加背景图片,根据背景图片轮廓生成词云
第四步:结合PaddleHub,对评论进行内容审核
准备工作:
#查看第三方库安装位置
# matplotlib.__path__
# jieba.__path__
# Linux系统默认字体文件路径
# !ls /usr/share/fonts/
# 查看系统可用的ttf格式中文字体
!fc-list :lang=zh | grep ".ttf"
# !wget https://mydueros.cdn.bcebos.com/font/simhei.ttf # 下载中文字体
# #创建字体目录fonts
# !mkdir .fonts
# # 复制字体文件到该路径
# !cp simhei.ttf .fonts/
#安装模型
!hub install porn_detection_lstm==1.1.0
# !pip install --upgrade paddlehub
导入库
from __future__ import print_function
import requests
import json
import re #正则匹配
import time #时间处理模块
import jieba #中文分词
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.font_manager as font_manager
from PIL import Image
from wordcloud import WordCloud #绘制词云模块
import paddlehub as hub
爬取数据
#请求爱奇艺评论接口,返回response信息
def getMovieinfo(url):
'''
请求爱奇艺评论接口,返回response信息
参数 url: 评论的url
:return: response信息
'''
session = requests.Session()
headers = {
"User-Agent": "Mozilla/5.0",
"Accept": "application/json",
"Referer": "http://m.iqiyi.com/v_19rqriflzg.html",
"Origin": "http://m.iqiyi.com",
"Host": "sns-comment.iqiyi.com",
"Connection": "keep-alive",
"Accept-Language": "en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7,zh-TW;q=0.6",
"Accept-Encoding": "gzip, deflate"
}
response = session.get(url, headers=headers)
if response.status_code == 200:
return response.text
return None
#解析json数据,获取评论
def saveMovieInfoToFile(lastId,arr):
'''
解析json数据,获取评论
参数 lastId:最后一条评论ID arr:存放文本的list
:return: 新的lastId
'''
url = "https://sns-comment.iqiyi.com/v3/comment/get_comments.action?agent_type=118&\
agent_version=9.11.5&business_type=17&content_id=15068699100&page=&page_size=10&types=time&last_id="
url += str(lastId)
responseTxt = getMovieinfo(url)
responseJson = json.loads(responseTxt)
comments = responseJson['data']['comments']
for val in comments:
# print(val.keys())
if 'content' in val.keys():
# print(val['content'])
arr.append(val['content'])
lastId = str(val['id'])
return lastId
对文本进行处理
#去除文本中特殊字符
def clear_special_char(content):
'''
正则处理特殊字符
参数 content:原文本
return: 清除后的文本
'''
s = re.sub(r"</?(.+?)>| |\t|\r", "", content)
s = re.sub(r"\n", " ", s)
s = re.sub('[^\u4e00-\u9fa5^a-z^A-Z^0-9]', '', s)
return s
利用结巴进行分词
def fenci(text):
'''
利用jieba进行分词
参数 text:需要分词的句子或文本
return:分词结果
'''
jieba.load_userdict('add_words.txt') #添加自定义字典
seg = jieba.lcut(text, cut_all=False)
return seg
停用词处理
def stopwordslist(file_path):
'''
创建停用词表
参数 file_path:停用词文本路径
return:停用词list
'''
stopwords = [line.strip() for line in open(file_path, encoding='UTF-8').readlines()]
return stopwords
def movestopwords(sentence,stopwords,counts):
'''
去除停用词,统计词频
参数 file_path:停用词文本路径 stopwords:停用词list counts: 词频统计结果
return:None
'''
out = []
for word in sentence:
if word not in stopwords:
if len(word) != 1:
counts[word] = counts.get(word,0) + 1
return None
绘图部分练习:绘制词云统计表
ef drawcounts(counts,num):
'''
绘制词频统计表
参数 counts: 词频统计结果 num:绘制topN
return:none
'''
x_aixs = []
y_aixs = []
c_order = sorted(counts.items(), key=lambda x:x[1],reverse=True)
# print(c_order)
for c in c_order[:num]:
x_aixs.append(c[0])
y_aixs.append(c[1])
# 设置显示中文
matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
matplotlib.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
plt.bar(x_aixs, y_aixs)
plt.title('词频统计结果')
plt.show()
绘制词云
def drawcloud(word_f):
'''
根据词频绘制词云图
参数 word_f:统计出的词频结果
return:none
'''
#加载背景图片
cloud_mask = np.array(Image.open('cluod.png'))
#忽略显示的词
st=set(["东西","这是"])
#生成wordcloud对象
wc = WordCloud(background_color='white',
mask=cloud_mask,
max_words=150,
font_path='simhei.ttf',
min_font_size=10,
max_font_size=100,
width=400,
relative_scaling=0.3,
stopwords=st)
wc.fit_words(word_f)
wc.to_file('pic.png')
PaddleHub练习
def text_detection(text,file_path):
'''
使用hub对评论进行内容分析
return:none
'''
porn_detection_lstm = hub.Module(name="porn_detection_lstm")
f = open('aqy.txt', 'r',encoding='utf-8')
for line in f:
if len(line.strip()) == 1: #判断评论长度是否为1
continue
else:
test_text.append(line)
f.close()
input_dict = {"text": test_text}
results = porn_detection_lstm.detection(data=input_dict,use_gpu=True, batch_size=1)
# print(results)
for index, item in enumerate(results):
if float(item['porn_probs']) > 0.95 :
print(item['text'],':',item['porn_probs'])
脚本
#评论是多分页的,得多次请求爱奇艺的评论接口才能获取多页评论,有些评论含有表情、特殊字符之类的
#num 是页数,一页10条评论,假如爬取1000条评论,设置num=100
if __name__ == "__main__":
num = 20
lastId = '0' #lastId 是接口分页id
arr = [] #arr是爬取的所有评论存放的数组
with open('aqy.txt', 'a', encoding='utf-8') as f: #写文件是追加写的
for i in range(num):
lastId = saveMovieInfoToFile(lastId,arr)
# print(i)
time.sleep(0.5)#频繁访问爱奇艺接口,偶尔出现接口连接报错情况,睡眠0.5秒,增加每次访问间隔时间
for item in arr:
Item = clear_special_char(item)
# print(Item)
if Item.strip()!='':
try:
f.write(Item+'\n')
except Exception as e:
print("含有特殊字符")
print('共爬取评论:',len(arr))
f = open('aqy.txt', 'r',encoding='utf-8')
counts = {}
for line in f:
words = fenci(line)
stopwords = stopwordslist('cn_stopwords.txt')
movestopwords(words,stopwords,counts)
drawcounts(counts,10) #绘制top10 高频词
drawcloud(counts) #绘制词云
f.close()
'''
使用hub对评论进行内容分析
'''
file_path = 'aqy.txt'
test_text = []
text_detection(test_text,file_path)
display(Image.open('pic.png')) #显示生成的词云图像
3. 培训心得与反省
1、7天打卡营给我们绘制了一个pyhon学习的蓝景图,将pyhon学习涉及到的方方面面的信息都展示了一下,给我们学习python起了个好头。
2、通过培训,深切的感受到自己的学习能力和处理问题的能力亟待加强。我面对问题时惯性心理是抗拒的,内心告诉自己,这里面有很多坑,一时半会肯定解决不了。但是这样自己始终浮于表面,应该沉下心来,一点一点的攻破。
3、每天坚持努力一下,终有一天可以胸有成竹。
4、致谢
1、感谢集训营给我们一个免费,高质量,高效率,强氛围的学习平台。
2、讲课的几个老师都是实力派,讲的都很好,尤其是文老师的代码风格,读您的代码,像是自己一步一步走了一遍心路历程,浮躁和杂念都放下了。
3、感谢班班,每天及时给我们上传视频,发布通知,统计信息。我通常临睡时,班班还在搞当晚的视频,第二天刚醒,班班又在发新的通知,让我一度怀疑,班班是不是不睡觉,太拼了。
5、后续
爬虫专题
正则表达式专题
需要整理的内容较多,后续开新帖整理。