各位集美兄得看過來! 利用AI給青春有你2的選手們做數據分析挖掘(四):AI分析誰最容易出道

各位集美兄得看過來! 利用AI給青春有你2的選手們做數據分析挖掘(一):爬蟲選手信息

各位集美兄得看過來! 利用AI給青春有你2的選手們做數據分析挖掘(二):統計並展示數據

各位集美兄得看過來! 利用AI給青春有你2的選手們做數據分析挖掘(三):看圖像識選手

各位集美兄得看過來! 利用AI給青春有你2的選手們做數據分析挖掘(四):AI分析誰最容易出道

到了現在比賽白熱化階段,不少選手已經初見鋒芒,接下來,我們將基於愛奇藝視頻的評論去做數據分析,哪位選手現在最受關注,最具備出道機率!看看你pick的小姐姐的路人緣怎樣!

實踐主要涉及的技術包括爬蟲,NLP(自然語言處理),機器學習等內容,主要使用百度提供的PaddleHub進行開發,實踐中間會帶一點基礎知識說明,問題不大,大家放心看~

在這裏插入圖片描述
我們的目標是通過<<青春有你2>>的視頻評論獲取數據,然後經過數據處理清洗後,對評論進行分詞以及詞頻統計,繪製出詞雲,直觀的展示現在觀衆的對選手的看法以及通過文本審覈模型,對評論進行內容審覈.

事不宜遲,我們馬上開始吧!

配置準備

  • 中文分詞需要jieba
  • 詞雲繪製需要wordcloud
  • 可視化展示中需要的中文字體
  • 網上公開資源中找一箇中文停用詞表
  • 根據分詞結果自己製作新增詞表
  • 準備一張詞雲背景圖
  • paddlehub配置
!pip install jieba
!pip install wordcloud
# 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

爬取評論

評論的來源主要是<<青春有你2>>正片的評論

分析頁面

我們打開頁面,我們需要爬取的評論區就是下面框框框住的部分。
在這裏插入圖片描述

我們**“F12”**打開頁面源碼,指出相應區域如下
在這裏插入圖片描述

那是不是只需要使用樣式爬取所有的評論就行了呢?

然而實際上評論是不斷下滑加載的,並不是一次加載完畢,因此我們需要拿到加載評論的接口

在這裏插入圖片描述

通過捕獲,可以得到請求評論的接口如下

https://sns-comment.iqiyi.com/v3/comment/get_comments.action?agent_type=118&agent_version=9.11.5&authcookie=null&business_type=17&content_id=15068699100&hot_size=0&last_id=240718226621&page=&page_size=20&types=time&callback=jsonp_1587905040415_94459

  • 主要使用參數:

last_id: 上次加載最後一條評論id,當last_id爲空的時候,就是第一頁,第一頁加載10個

page_size:加載評論條數

將page_size調到200請求,返回錯誤提示如下
在這裏插入圖片描述

在這裏插入圖片描述意思是單頁加載量不能超過40個,那我們後面就愉快得一次加載40個吧。

  • 返回值:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-dYVMZH52-1587922926890)(C:\Users\lps\Documents\myblog\青春有你\情感分析.assets\image-20200426211044629.png)]

具體思路

1.用爬取第一頁所有的評論

2.以第一頁最後的評論的id爲last_id,循環請求評論接口每頁加載40個評論,然後爬下來

基於requests與正則實現爬取

#請求愛奇藝評論接口,返回response信息
def getMovieinfo(last_id):
    '''
    請求愛奇藝評論接口,返回response信息
    參數  url: 評論的url
    :return: response信息
    '''
    if last_id=='':
        page_size=10
    else:
        page_size=40
    url = 'https://sns-comment.iqiyi.com/v3/comment/get_comments.action?agent_type=118&agent_version=9.11.5&authcookie=null&business_type=17&content_id=15068699100&hot_size=0&page=&page_size='+str(page_size)+'&types=time&callback=jsonp&&last_id='+str(last_id)
    response = requests.get(url, timeout=10)
    # print(result.text)
    return response



#解析json數據,獲取評論
def saveMovieInfoToFile(text):
    '''
    解析json數據,獲取評論
    參數  lastId:最後一條評論ID  arr:存放文本的list
    :return: 新的lastId
    '''
    pattern = re.compile('.*?jsonp[(](.*?)[)] }catch', re.S)
    items = re.findall(pattern, text)
    if len(items)==0:
        return ''
    data_json=json.loads(items[0])
    # print(data_json)
    comments=data_json['data']['comments']
    f_comments=open('work/comments.txt','a')
    for comment in comments:
        if 'content' not in comment:
            continue
        f_comments.write(comment['content']+'\n')
        last_id=comment['id']
    f_comments.close
    crawl_num=len(comments)
    return last_id,crawl_num


調用方式,由於是分頁的,需要循環調用接口,具體實現如下:

    response=getMovieinfo('')
    cur_last_id,total_crawl=saveMovieInfoToFile(response.text)
    num=0
    while cur_last_id !='' :
        if num >30:
            break
        cur_last_id,total=saveMovieInfoToFile(getMovieinfo(cur_last_id).text)
        total_crawl+=total
        num+=1
    print('總共爬取評論:%d條'%(total_crawl))

輸出comments.txt如下:
在這裏插入圖片描述

數據清洗

我們爬了一波評論之後,由於評論裏面有點特殊的字符比如shaking加油♥♥♥♥♥♥♥♥♥♥♥♥,我們需要把這些特殊字符處理了.

具體實現:

#去除文本中特殊字符
def clear_special_char(content):
    '''
    正則處理特殊字符
    參數 content:原文本
    return: 清除後的文本
    '''
    f_clear = open('work/clear_comments.txt','a')
    clear_content = re.findall('[\u4e00-\u9fa5a-zA-Z0-9]+',content,re.S)   #只要字符串中的中文,字母,數字
    str=','.join(clear_content)
    f_clear.write(str+'\n')
    f_clear.close
    return str

輸出clear_comments.txt就是清洗完成的評論如下:
在這裏插入圖片描述

詞頻統計

因爲我們要看小姐姐的路人緣,因此我們對評論進行詞頻統計,看看觀衆對青春有你的關注點.因此需要對評論進行分詞,然後去除停用詞比如"儘管,如此"這些,然後對詞頻進行統計,統計評論中出現詞最多top10,以柱狀圖形式顯示.

分詞

分詞我們主要使用Jieba分詞,主要使用 jieba.cut

def fenci(content):
    '''
    利用jieba進行分詞
    參數 content:需要分詞的句子或文本
    return:分詞結果
    '''
    # 加載本地詞庫
    jieba.load_userdict(r"dic/user_dic.txt")
    seg_list = jieba.cut(content)
    return seg_list

分詞案例:

分詞前:征戰 四海 只 爲 今日 一勝 , 我 不會 再敗 了 。
分詞後:['征戰', '四海', '只', '爲', '今日', '一勝', ',', '我', '不會', '再敗', '了', '。']

創建停用詞表

從網上下載中文停用詞表到本地,通過停用詞文件加載停用詞

def stopwordslist():
    '''
    創建停用詞表
    參數 file_path:停用詞文本路徑
    return:停用詞list
    '''
    stopwords = [line.strip() for line in open('work/stopwords.txt',encoding='UTF-8').readlines()]
    acstopwords=['哦','因此','不然','也好','但是']
    stopwords.extend(acstopwords)
    return stopwords

去除停用詞

基於停用詞表,去除清洗後的評論的停用詞,返回最終評論詞數組

def movestopwords(sentence_depart,stopwords):
    '''
    去除停用詞,統計詞頻
    參數 file_path:停用詞文本路徑 stopwords:停用詞list counts: 詞頻統計結果
    return:None
    '''
    segments = []
   
    # 去停用詞
    for word in sentence_depart:
        if word not in stopwords:
            if word != '\t':
                # outstr += word
                # outstr += " "
                segments.append(word)
   
    return segments

繪製top10詞頻統計表

根據上面返回的詞數組,統計每個詞的數量返回結果,並繪製柱狀圖,繪圖主要使用matplotlib

import collections 

def drawcounts(segments):
    '''
    繪製詞頻統計表
    參數 counts: 詞頻統計結果 num:繪製topN
    return:none
    '''
    # 詞頻統計
    word_counts = collections.Counter(segments) # 對分詞做詞頻統計
    word_counts_top10 = word_counts.most_common(10) # 獲取前10最高頻的詞
    print (word_counts_top10) 
    dic=dict(word_counts_top10)
    print(dic)
    x_values=[]
    y_values=[]
    for k in dic: 
        x_values.append(k)
        y_values.append(dic[k])
    # 設置顯示中文

    plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默認字體

    plt.figure(figsize=(20,15))

    plt.bar(range(len(y_values)), y_values,color='r',tick_label=x_values,facecolor='#9999ff',edgecolor='white')

    # 這裏是調節橫座標的傾斜度,rotation是度數,以及設置刻度字體大小
    plt.xticks(rotation=45,fontsize=20)
    plt.yticks(fontsize=20)

    plt.legend()
    plt.title('''《青春有你2》高頻評論詞統計''',fontsize = 24)
    plt.savefig('highwords.jpg')
    plt.show()
    return word_counts

  

輸出結果如下:
在這裏插入圖片描述

繪製詞雲

接下來,將基於wordcloud 製作詞雲

摳圖

聽說,hub有個牛逼的摳圖能力,讓我試試!反正詞雲需要背景
首先我們下載一張有形狀的圖
在這裏插入圖片描述

編寫以下代碼:

import sys
import os
import paddlehub as hub
 
# 加載模型
humanseg = hub.Module(name = "deeplabv3p_xception65_humanseg")

 
# 摳圖
results = humanseg.segmentation(data = {"image":['sendpix0.jpg']})
 
for result in results:
    print(result['origin'])
    print(result['processed'])

看看摳圖結果:

在這裏插入圖片描述

可以看到除了邊緣有點不規整之外,還是扣得挺漂亮的,但是由於我們詞雲需要的背景圖是白底,所有最好選擇黑色的圖作爲主圖

繪製詞雲

基於wordcloud繪製詞雲

def drawcloud(word_counts):
    '''
    根據詞頻繪製詞雲圖
    參數 word_f:統計出的詞頻結果
    return:none
    '''
    # 詞頻展示
    # 關鍵一步
    font=r'fonts/SimHei.ttf' 
    shape=np.array(Image.open(r'humanseg_output/sendpix0.png'))
    my_wordcloud = WordCloud(font_path=font,stopwords=stopwords,background_color='white',mask=shape,width=800,height=600,
                        max_words=200,max_font_size = 100,random_state=20).generate_from_frequencies(word_counts) 
 
    #顯示生成的詞雲 
    plt.imshow(my_wordcloud)
    plt.axis("off") 
    plt.show() 
    my_wordcloud.to_file('pic.png')

我們看看我們繪製出來的結果:
在這裏插入圖片描述
工具人看到之後表示:
在這裏插入圖片描述

評論審覈

基於PaddlePaddle的porn_detection_lstm預訓練模型,可自動判別文本是否涉黃並給出相應的置信度,對文本中的色情描述、低俗交友、污穢文愛進行識別。porn_detection_lstm採用LSTM網絡結構並按字粒度進行切詞,具有較高的分類精度。該模型最大句子長度爲256字,僅支持預測。

導入模型

porn_detection_lstm = hub.Module(name="porn_detection_lstm")

使用模型對評論進行分析

import six

def text_detection():
    '''
    使用hub對評論進行內容分析
    return:分析結果

    '''
    comment_text = [line.strip() for line in open('work/clear_comments.txt',encoding='UTF-8').readlines()]

    input_dict = {"text": comment_text}

    results = porn_detection_lstm.detection(data=input_dict,use_gpu=True, batch_size=1)

    f_dect=open('work/text_detection.txt','w')
    for index, text in enumerate(comment_text):
        results[index]["text"] = text
    for index, result in enumerate(results):
        if six.PY2:
            detection= json.dumps(results[index], encoding="utf8", ensure_ascii=False)
        else:
            detection=results[index]
        # print(detection)
        print("檢測句子:%s,檢測結果not_porn_probs:%f\n"%(detection['text'],detection['not_porn_probs']))
        f_dect.write("檢測句子:%s,檢測結果not_porn_probs:%f\n"%(detection['text'],detection['not_porn_probs']))
    f_dect.close

輸出結果:
在這裏插入圖片描述

not_porn_probs越接近1越正經

MAIN實現

#評論是多分頁的,得多次請求愛奇藝的評論接口才能獲取多頁評論,有些評論含有表情、特殊字符之類的
#num 是頁數,一頁10條評論,假如爬取1000條評論,設置num=100

if __name__ == "__main__":
    response=getMovieinfo('')
    cur_last_id,total_crawl=saveMovieInfoToFile(response.text)
    num=0
    while cur_last_id !='' :
        if num >30:
            break
        cur_last_id,total=saveMovieInfoToFile(getMovieinfo(cur_last_id).text)
        total_crawl+=total
        num+=1
    print('總共爬取評論:%d條'%(total_crawl))
    stopwords=stopwordslist()

    f = open(r"work/comments.txt")
    line = f.readline()
    segments=[]
    while line:
        line = f.readline()
        clear_line=clear_special_char(line)
        seg_list= fenci(clear_line)
        segments_list=movestopwords(seg_list,stopwords)
        segments.extend(segments_list)
    f.close()
    
    drawcloud(drawcounts(segments)) 
    text_detection()

結語

通過hub提供的預訓練模型進行預測,實現對青春有你2選手的數據分析,給我這個0基礎的工具人學習了很多,起碼掌握了具體一個採集清洗分析訓練預測的流程,實在是獲益良多!
然後談談技術吧,無論用什麼語言什麼技術,根本上都是要實現價值的,無論是大還是小,將技術應用到你生活中工作中,才能說明你掌握了這項技術,在你遇到場景的時候,想到應用什麼樣的技術能最有效率的解決問題並且實現出來,這就是能力,我個人是希望自己向着這個目標前進的!
最後~
shaking衝鴨!!!

安崎衝鴨!!!

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