各位集美兄得看過來! 利用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”**打開頁面源碼,指出相應區域如下
那是不是只需要使用樣式爬取所有的評論就行了呢?
然而實際上評論是不斷下滑加載的,並不是一次加載完畢,因此我們需要拿到加載評論的接口
通過捕獲,可以得到請求評論的接口如下
- 主要使用參數:
last_id: 上次加載最後一條評論id,當last_id爲空的時候,就是第一頁,第一頁加載10個
page_size:加載評論條數
將page_size調到200請求,返回錯誤提示如下
意思是單頁加載量不能超過40個,那我們後面就愉快得一次加載40個吧。
- 返回值:
具體思路
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衝鴨!!!
安崎衝鴨!!!