百度飛槳《青春有你2》Python小白逆襲大神技術分享

概述

7天的打卡訓練營,時間緊張而又內容飽滿,第一天主要針對小白們進行python基礎知識的講解,主要學習python的基礎語法及各類常見用法;第二天講解了爬蟲的相關概念和基礎知識;第三天重點講解了python的數據分析與處理庫;第四天講解了paddleHub的用法及相關內容;第五天主要是EasyDL的講解;第六及七天主要是作業及課程答疑時間。

第一天 pyton基礎

個人覺得還是要掌握python的基礎知識,注重個人的編碼風格和編碼習慣,python是一種對格式要求相對比較嚴格的語言,所以,格式的掌握很重要,有助於養成良好的編碼習慣。另外就是對各類數據類型的使用,切片分割技巧的掌握和了解,能在很大程度上幫你更好的進行數據的分析與處理。作業也相對比較簡單,主要是循環的使用和OS庫的使用。牢記切片原則:左閉右開


def table():
    #在這裏寫下您的乘法口訣表代碼吧!
    for i in range(1,10):
        for j in range(1,i+1):  #編寫雙層循環
            print('{}*{}={}'.format(j,i,j*i),end='\t') #進行計算,樣式輸出
        print()
if __name__ == '__main__':
    table()
1*1=1	
1*2=2	2*2=4	
1*3=3	2*3=6	3*3=9	
1*4=4	2*4=8	3*4=12	4*4=16	
1*5=5	2*5=10	3*5=15	4*5=20	5*5=25	
1*6=6	2*6=12	3*6=18	4*6=24	5*6=30	6*6=36	
1*7=7	2*7=14	3*7=21	4*7=28	5*7=35	6*7=42	7*7=49	
1*8=8	2*8=16	3*8=24	4*8=32	5*8=40	6*8=48	7*8=56	8*8=64	
1*9=9	2*9=18	3*9=27	4*9=36	5*9=45	6*9=54	7*9=63	8*9=72	9*9=81	

第二天 《選手數據爬取》

主要學習和掌握requests模塊、BeautifulSoup庫。爬蟲的主要原理就是通過模擬瀏覽器向目標站點發送相關請求,從而獲取到目標站點的響應數據, 對數據進行加工處理後本地存儲。本人一直覺得這塊一定得遵守爬蟲協議,嚴守法律底線。另外 就是感興趣的話 還可以自學下Xpath等庫,還有爲了避免IP被封鎖,可以使用動態IP代理。數據的爬取相對來說比較簡單,重點主要在於對爬取後的響應數據的相關處理,爲了方便起見,可以學習和了解下re等模塊,有助於數據快速簡單有效處理。
requests是python實現的簡單易用的HTTP庫,官網地址:http://cn.python-requests.org/zh_CN/latest/
網頁請求的過程分爲兩個環節:requests(請求)、response(相應)。
網頁請求的方式也分爲兩種:
(1)GET:最常見的方式,一般用於獲取或者查詢資源信息,也是大多數網站使用的方式,響應速度快。
(2)POST:相比 GET 方式,多了以表單形式上傳參數的功能,因此除查詢信息外,還可以修改信息。
requests.get(url)發送http get請求,返回內容response爲URL對象,表示整個網頁。

Beautiful Soup 是解析HTML和XML的工具,並提取的數據。包含html.parser、lxml等多種解析器,注意find_all()用於搜索當前節點下所有的符合條件的節點,沒有指點節點則是全文;find()返回查詢到的第一個元素節點,與find_all()略有不同

作業是對https://baike.baidu.com/item/青春有你第二季 中各個選手照片的批量爬取:
僞裝瀏覽器

 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'
    }

初步數據解析

try:
        response = requests.get(url,headers=headers)
        print(response.status_code)

        #將一段文檔傳入BeautifulSoup的構造方法,就能得到一個文檔的對象, 可以傳入一段字符串
        soup = BeautifulSoup(response.text,'lxml')
        
        #返回的是class爲table-view log-set-param的<table>所有標籤
        tables = soup.find_all('table',{'class':'table-view log-set-param'})

        crawl_table_title = "參賽學員"

        for table in  tables:           
            #對當前節點前面的標籤和字符串進行查找
            table_titles = table.find_previous('div').find_all('h3')
            for title in table_titles:
                if(crawl_table_title in title):
                    return table       
    except Exception as e:
        print(e)

數據本地化存儲

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

第三天 《青春有你2》選手數據分析

重點在於學習和掌握Numpy、pandas、Matplotlib、PIL等的使用,當然在圖像圖形繪製方面還有其他的相關庫,Echarts 很多人都在用,它是一個由百度開源的數據可視化工具,憑藉着良好的交互性,精巧的圖表設計,得到了衆多開發者的認可,當時當python遇到了Echarts,它就變身爲pyechartsl了,在這裏個人強烈推薦使用百度的pyecharts,文檔功能齊全,示例清晰明瞭,圖表內容豐富,顏色舒心悅目,最最主要的是使用方便,可以很方便的渲染到瀏覽器頁面,再次進行強烈推薦。通過下面對比就知道了
先看用 Matplotlib 畫的 K 線圖,密密麻麻啥都看不清楚,根本區分不了開盤價、最高價、最低價、收盤價。
在這裏插入圖片描述
再看用 PyEcharts 畫的 K 線圖 (gif),也是密密麻麻的,但是我們可以通過鼠標拖動圖片下方可伸縮的時間軸從而鎖定我們想看到的數據,比如那根大藍柱…
在這裏插入圖片描述
除了操作滑動軸以外,上圖 還可以任意顯示或隱藏 K 線 (K-Line), 最高價 (high) 和最低價 (low)這種交互式 (interactive) 操作在我看來給圖標增加了額外的維度,再反觀 Matplotlib 繪製出來的 K 線圖 (包含長時間歷史數據圖) 就像死水一潭,真正是沒有對比就沒有傷害。。。誰用誰知道
在這裏插入圖片描述
再說說作業吧,個人覺得主要利用pandas處理好數據的階段區間分組就完全OK啦,當然不用pandas的話,還有其他的方法,比如直接統計每段區間的個數或者分段用數組存儲,再統計每個數據中的數據庫等等,這裏看每個人喜好了
利用pandas的cut方法

bins =[0,45,50,55,1000]
labels = ['<45kg','45~50kg','50~55kg','>55kg']
counts = pd.cut(weight,bins,labels=labels,right=False)
s = counts.value_counts()

zl = s.index
sizes = s.values

再使用Matplotlib 繪圖的時候,特別需要注意中文的處理,要不就會出現亂碼


# 下載中文字體
!wget https://mydueros.cdn.bcebos.com/font/simhei.ttf
# 將字體文件複製到matplotlib字體路徑
!cp simhei.ttf /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/mpl-data/fonts/ttf/
# 一般只需要將字體文件複製到系統字體目錄下即可,但是在aistudio上該路徑沒有寫權限,所以此方法不能用
# !cp simhei.ttf /usr/share/fonts/

# 創建系統字體文件路徑
!mkdir .fonts
# 複製文件到該路徑
!cp simhei.ttf .fonts/
!rm -rf .cache/matplotlib
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默認字體
plt.figure(figsize=(20,15))

第四天 《青春有你2》選手識別

主要是對paddleHub的學習,瞭解和使用。PaddleHub是一個深度學習模型開發工具。它基於飛槳領先的核心框架,精選效果優秀的算法,提供了百億級大數據訓練的預訓練模型,方便用戶不用花費大量精力從頭開始訓練一個模型。PaddleHub可以便捷地獲取這些預訓練模型,完成模型的管理和一鍵預測。配合使用Fine-tune API,可以基於大規模預訓練模型快速完成遷移學習,讓預訓練模型能更好地服務於用戶特定場景的應用。
作業重點在於對訓練圖片數據集的自己爬取與處理,還有對訓練集、驗證集、測試集等的數據的處理:特別主要老師所講的8:1:1原則(哈哈,老師講課,我可是好好做筆記的)!
另外就是對模型的配置的設置以及Fine-tune 的相關使用:
自己準備整理訓練數據集進行解壓:!unzip -o file.zip -d ./dataset/dataset
CPU環境請執行,GPU直接忽略,建議能用GPU就用GPU,實在沒有了 再用CPU


#CPU環境啓動請務必執行該指令
%set_env CPU_NUM=1 

module = hub.Module(name="resnet_v2_50_imagenet")
rom paddlehub.dataset.base_cv_dataset import BaseCVDataset
   
class DemoDataset(BaseCVDataset):	
   def __init__(self):	
       # 數據集存放位置
       
       self.dataset_dir = "dataset"
       super(DemoDataset, self).__init__(
           base_path=self.dataset_dir,
           train_list_file="train_list.txt",
           validate_list_file="validate_list.txt",
           test_list_file="test_list.txt",
           label_list_file="label_list.txt",
           )
dataset = DemoDataset()

run_states = task.finetune_and_eval()

第五天 綜合大作業

課程內容主要學習EasyDL,EasyDL是基於百度自主研發的深度學習平臺飛槳結合業界先進的工程服務技術打造的簡單易用的模型訓練和服務平臺,EasyDL提供了從數據上傳、標註、部署、迭代覆蓋、AI開發一站式服務流程,讓你可以很好的像使用word一樣進行深度學習的研究與使用。跟普通的深度學習訓練過程比起來, EasyDL 定製化圖像識別有如下這些優勢:① 需要的數據量更少。② 擁有全程可視化的操作界面。③ 能在分鐘級的時間內完成訓練。④ 目前大部分模型的準確率在90%以上。
在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
具體的相關學習,請參考官網。
哈哈,再來說說作業的內容吧:這是好多人都最最關心的,這真是一個大綜合,所有學習過的相關技術都得用到,requests,json,re,time ,jieba,wordcloud,numpy ,matplotlib,PIL ,paddlehub 等等等等:
愛奇藝《青春有你2》評論數據爬取,注意老師講的那個抓包及lastID的分析和處理
第一個攔路虎:字體下載相關問題,報403錯誤,可以自己手動下載相關字體,然後進行上傳

#!wget https://mydueros.cdn.bcebos.com/font/simhei.ttf # 下載中文字體
# #創建字體目錄fonts
!mkdir .fonts
# # 複製字體文件到該路徑
!cp simhei.ttf .fonts/

第二虎:lastId的獲取

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)
    responesTxt = getMovieinfo(url)
    responesJson = json.loads(responesTxt)
    comments = responesJson['data']['comments']
    for val in comments:
        if 'content' in val.keys():
            print(val['content'])
            arr.append(val['content'])
        lastId = str(val['id'])
    return lastId

第三虎:特殊字符過濾

    s = re.sub(r"</?(.+?)>|&nbsp;|\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)

第四虎:matplotlib中文顯示

   #設置顯示中文
    matplotlib.rcParams['font.sans-serif']=['simhei']
    matplotlib.rcParams['axes.unicode_minus']=False

第五虎:詞雲背景設置

  cloud_mask = np.array(Image.open('333.jpg'))
    #忽略顯示的詞
    st = set(["這是","東西"])

第六虎:情感分析預測

    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()

成功闖關這六關,你的作業應該就沒有太大問題了、

總結

七天的學習,充實而又緊張,感謝班班及助教還有講師們陪着共同度過這段美好的時光,同樣也感謝羣裏的各位學友們的相互關照與共同指導,感謝百度提供的這個寶貴的學習平臺和機會,祝願你們越來越好!哈哈 下期營地我們再會。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章