鉴于篇幅所限,贴上部分代码,畅叙一番,权当做这几天光阴(写代码/抄代码)的纪念。
第一天学习的是python的基础知识,所谓“万丈高楼平地起”,可见基础的重要性。
9*9乘法表输出
def table():
#在这里写下您的乘法口诀表代码吧!
for i in range(9):
for j in range(9):
if j<=i:
print("{:<1.0f}*{:<1.0f}={:<4.0f}".format(j+1,i+1,(j+1)*(i+1)),end="")
print("\n")
if __name__ == '__main__':
table()
遍历”Day1-homework”目录下文件;
找到文件名包含“2020”的文件;
#导入OS模块
import os
#待搜索的目录路径
path = "Day1-homework"
#待搜索的名称
filename = "2020"
#定义保存结果的数组
result = []
def findfiles(path):
#在这里写下您的查找文件代码吧!
items=os.listdir(path)
for item in items:
result=os.path.join(path,item)
if os.path.isdir(result):
findfiles(result)
else:
if filename in result:
print("[",result,"]")
if __name__ == '__main__':
findfiles(path)
第二天是爬虫
任务是:用Python来爬取百度百科中《青春有你2》所有参赛选手的信息
爬虫的过程:
1.发送请求(requests模块)
2.获取响应数据(服务器返回)
3.解析并提取数据(BeautifulSoup查找或者re正则)
4.保存数据
在爬虫之前要提前熟知一些基本知识点:
1.爬虫的基本代码、基本框架
2.熟悉requests库和Beautifulsoup库(煮成一锅美味的汤,太有意境了)
爬取每个选手的百度百科图片,并进行保存
def crawl_pic_urls():
'''
爬取每个选手的百度百科图片,并保存
'''
with open('work/'+ today + '.json', 'r', encoding='UTF-8') as file:
json_array = json.loads(file.read())
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}
for star in json_array:
name = star['name']
link = star['link']
#!!!请在以下完成对每个选手图片的爬取,将所有图片url存储在一个列表pic_urls中!!!
#向选手个人百度百科发送一个http get 请求
response=requests.get(link,headers=headers)
# 将一段文档传入BeautifulSoup的构造方法,就能得到一个文档的对象
bs=BeautifulSoup(response.text,"lxml")
#从个人百度百科页面中解析得到一个链接,该链接指向选手图片列表页面
pic_list_url=bs.select(".summary-pic a")[0].get("href")
pic_list_url="http://baike.baidu.com"+pic_list_url
#向选手图片列表页面发送http get 请求
pic_list_response=requests.get(pic_list_url,headers=headers)
#对选手图片列表页面进行解析 ,获取所有图片链接
bs= BeautifulSoup(pic_list_response.text,"lxml")
pic_list_html=bs.select('.pic-list img')
pic_urls=[]
for pic_html in pic_list_html:
pic_url=pic_html.get("src")
pic_urls.append(pic_url)
#根据图片链接列表pic_urls下载所有图片,保存在以name命名的文件夹中
down_pic(name,pic_urls)
#!!!根据图片链接列表pic_urls, 下载所有图片,保存在以name命名的文件夹中!!!
down_pic(name,pic_urls)
def down_pic(name,pic_urls):
'''
根据图片链接列表pic_urls, 下载所有图片,保存在以name命名的文件夹中,
'''
path = 'work/'+'pics/'+name+'/'
if not os.path.exists(path):
os.makedirs(path)
for i, pic_url in enumerate(pic_urls):
try:
pic = requests.get(pic_url, timeout=15)
string = str(i + 1) + '.jpg'
with open(path+string, 'wb') as f:
f.write(pic.content)
print('成功下载第%s张图片: %s' % (str(i + 1), str(pic_url)))
except Exception as e:
print('下载第%s张图片时失败: %s' % (str(i + 1), str(pic_url)))
print(e)
continue
第三天 数据可视化
选手所在地区域分布柱状图
import matplotlib.pyplot as plt
import numpy as np
import json
import matplotlib.font_manager as font_manager
#显示matplotlib生成的图形
%matplotlib inline
with open('data/data31557/20200422.json', 'r', encoding='UTF-8') as file:
json_array = json.loads(file.read())
#绘制小姐姐区域分布柱状图,x轴为地区,y轴为该区域的小姐姐数量
zones = []
for star in json_array:
zone = star['zone']
zones.append(zone)
print(len(zones))
print(zones)
zone_list = []
count_list = []
for zone in zones:
if zone not in zone_list:
count = zones.count(zone)
zone_list.append(zone)
count_list.append(count)
print(zone_list)
print(count_list)
# 设置显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
plt.figure(figsize=(20,15))
plt.bar(range(len(count_list)), count_list,color='r',tick_label=zone_list,facecolor='#9999ff',edgecolor='white')
# 这里是调节横坐标的倾斜度,rotation是度数,以及设置刻度字体大小
plt.xticks(rotation=45,fontsize=20)
plt.yticks(fontsize=20)
plt.legend()
plt.title('''《青春有你2》参赛选手''',fontsize = 24)
plt.savefig('/home/aistudio/work/bar_result01.jpg')
plt.show()
对选手体重分布进行可视化,绘制饼状图
import matplotlib.pyplot as plt
import numpy as np
import json
import matplotlib.font_manager as font_manager
%matplotlib inline
with open('data/data31557/20200422.json','r')as file:
json_array=json.loads(file.read())
weights=[]
counts=[]
for star in json_array:
weight=float (star['weight'].replace('kg',''))
weights.append(weight)
size_list=[]
count_list=[]
size1=0
size2=0
size3=0
size4=0
for weight in weights:
if weight<=45:
size1+=1
elif weight<=50:
size2+=1
elif weight<=55:
size3+=1
else:
size4+=1
labels='<=45kg','45~50kg','50~55kg','>55kg'
sizes=[size1,size2,size3,size4]
explode=(0.1,0.1,0,0)
fig1,ax1=plt.subplots()
ax1.pie(sizes,explode=explode,labels=labels,autopct="%1.1f%%",shadow=True)
ax1.axis("equal")
plt.savefig('/home/aistudio/work/pie_result01.jpg')
plt.show()
第四天 图像分类
我们要在PaddleHub中选择合适的预训练模型来Finetune,由于是图像分类任务,因此我们使用经典的ResNet-50作为预训练模型。
有了合适的预训练模型和准备要迁移的数据集后,我们开始组建一个Task。
我们选择finetune_and_eval接口来进行模型训练,这个接口在finetune的过程中,会周期性的进行模型效果的评估,以便我们了解整个训练过程的性能变化。
当Finetune完成后,我们使用模型来进行预测,先通过以下命令来获取测试的图片
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
with open("dataset/test_list.txt","r") as f:
filepath = f.readlines()
data = [filepath[0].split(" ")[0],filepath[1].split(" ")[0],filepath[2].split(" ")[0],filepath[3].split(" ")[0],filepath[4].split(" ")[0]]
label_map = dataset.label_dict()
index = 0
run_states = task.predict(data=data)
results = [run_state.run_results for run_state in run_states]
for batch_result in results:
print(batch_result)
batch_result = np.argmax(batch_result, axis=2)[0]
print(batch_result)
for result in batch_result:
index += 1
result = label_map[result]
print("input %i is %s, and the predict result is %s" %
(index, data[index - 1], result))
第五天 综合大作业
爱奇艺《青春有你2》评论数据爬取
词频统计并可视化展示
绘制词云
解析json数据,获取评论
参数 lastId:最后一条评论ID arr:存放文本的list
return: 新的lastId
解析json数据,获取评论
def saveMovieInfoToFile(lastId,arr):
'''
'''
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
正则处理特殊字符,参数 content:原文本,return: 清除后的文本
#去除文本中特殊字符
def clear_special_char(content):
'''
'''
s = re.sub(r"?(.+?)>| |\t|\r","",content)
s = re.sub(r"\n","",s)
s = re.sub(r"\*","\\*",s)
s = re.sub("[^\u4e00-\u9fa5^a-z^A-Z^0-9]","",s)
s = re.sub("[\001\002\003\004\005\006\007\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a]+","", s)
s = re.sub("[a-zA-Z]","",s)
s = re.sub("^d+(\.\d+)?$","",s)
return s
根据词频绘制词云图
参数 word_f:统计出的词频结果
return:none
def drawcloud(word_f):
'''
'''
#加载背景图片
cloud_mask = np.array(Image.open('cloud.png'))
#忽略显示的词
st = set(['东西','这是','加油','冲冲','喜欢','真的'])
#生成词云对象
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')
使用hub对评论进行内容分析
return:分析结果
def text_detection(text,file_path):
'''
'''
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:
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)
for index,item in enumerate(results):
if item['porn_detection_key']=='porn':
if item['porn_probs']>0.99:
print(item['text'],':',item['porn_probs'])
评论是多分页的,得多次请求爱奇艺的评论接口才能获取多页评论,有些评论含有表情、特殊字符之类的
num 是页数,一页10条评论,假如爬取1000条评论,设置num=100
if __name__ == "__main__":
num=105
lastId='0'#是接口分页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)
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)
drawcloud(counts)
f.close()
file_path='aqy.txt'
test_text=[]
text_detection(test_text,file_path)
最后在这里感谢七天来为我们付出的各位主讲老师、助教、班主任以及热心的同学,也衷心希望课程培训能越办越好!