Python小白逆袭大神---基于百度飞桨aistudio的学习

鉴于篇幅所限,贴上部分代码,畅叙一番,权当做这几天光阴(写代码/抄代码)的纪念。

第一天学习的是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)

最后在这里感谢七天来为我们付出的各位主讲老师、助教、班主任以及热心的同学,也衷心希望课程培训能越办越好!

你可能感兴趣的:(百度飞桨,笔记)