飞桨学院-Python从小白逆袭大神-Day5-综合大作业

序言

七日的打卡营,这次第五次的作业了,也是最后一次的作业了,小编看了一下啊,其实这次的作业是之前4次作业的大融合,集文件处理,爬虫,还有数据可视化,以及paddlehub的使用。但是这次还是有些难度的,因为嘛,这次的作业没有之前的写好的代码,全靠自己。还好上课老师还有代码参考,不然的话真是难倒我了。

综合大作业

第一步:爱奇艺《青春有你2》评论数据爬取(参考链接:https://www.iqiyi.com/v_19ryfkiv8w.html#curid=15068699100_9f9bab7e0d1e30c494622af777f4ba39)
爬取任意一期正片视频下评论
评论条数不少于1000条

第二步:词频统计并可视化展示
数据预处理:清理清洗评论中特殊字符(如:@#¥%、emoji表情符),清洗后结果存储为txt文档
中文分词:添加新增词(如:青你、奥利给、冲鸭),去除停用词(如:哦、因此、不然、也好、但是)
统计top10高频词
可视化展示高频词

第三步:绘制词云
根据词频生成词云
可选项-添加背景图片,根据背景图片轮廓生成词云

第四步:结合PaddleHub,对评论进行内容审核
下面我将分享我理解的和做题的过程。

环境配置

因为AiStudio是基于Linux操作系统,所以下面的命令是Linux命令。

!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/
!ls .fonts/
!ls .cache/
!rm -rf .cache/matplotlib

#安装模型
!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

数据爬取

#请求爱奇艺评论接口,返回response信息
def getMovieinfo(url):
    '''
    请求爱奇艺评论接口,返回response信息
    参数  url: 评论的url
    :return: response信息
    '''
    headers={
     
        'Host': 'sns-comment.iqiyi.com',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:75.0) Gecko/20100101 Firefox/75.0 Chrome/49.0.2623.221',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
        'Accept-Encoding': 'gzip, deflate, br',
        'Connection': 'keep-alive',
        'Upgrade-Insecure-Requests': '1' 
        }
    session = requests.Session()
    response = session.get(url, headers = headers)
    if response.status_code is 200:
        return response.text
    return None

#解析json数据,获取评论
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&authcookie=null&business_type=17&content_id=15068699100&hot_size=0&\
            last_id=240634156221&page=&page_size=20&types=time&callback=jsonp_1587986745841_61260"
    url += "&last_id=" + str(lastId)
    response_text = getMovieinfo(url)
    js = json.loads(response_text[31:-14])
    comments = js['data']['comments']
    for comment in comments:
        if 'content' in comment.keys():
            arr.append(comment['content'])
        lastId = str(comment['id'])

    return lastId

爬虫爬取数据通常较灵活,在爬取评论的时候,我们就要看看实际情况,像爱奇艺的评论爬取就不同。站点分析在这里:
飞桨学院-Python从小白逆袭大神-Day5-综合大作业_第1张图片

数据清洗

由于我们爬取的数据会有很多的非法字符,表情,所以我们需要对数据进行清洗。

#去除文本中特殊字符
def clear_special_char(content):
    '''
    正则处理特殊字符
    参数 content:原文本
    return: 清除后的文本
    '''
    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+)7$', '',s)
    return s

分词

分词,我们希望得到我们想要的词,但是这个jieba库通常有可能分错,所以我们需要自定义字典,讲我们需要得到的词写进去,那么分词的时候就会生成自定义字典的词。

def fenci(text):
    '''
    利用jieba进行分词
    参数 text:需要分词的句子或文本
    return:分词结果
    '''
    jieba.load_userdict('add_words.txt') #自定义字典
    seg = jieba.lcut(text, cut_all=False)
    return seg

停用词

通常我们有我们不想得到的词,那我们就得创建停用词表,将不想得到的词加入停用词里面。

def stopwordslist(file_path):
    '''
    创建停用词表
    参数 file_path:停用词文本路径
    return:停用词list
    '''
    stopwords = [line.strip() for line in open(file_path, encoding='UTF-8').readlines()]
    return stopwords
def movestopwords(sentence,stopwords,counts):
    '''
    去除停用词,统计词频
    参数 file_path:停用词文本路径 stopwords:停用词list counts: 词频统计结果
    return:None
    '''
    for word in sentence:
        if word not in stopwords:
            if len(word) != 1:
                counts[word] = counts.get(word,0) + 1
    return None
    

数据可视化

def drawcounts(counts, num):
    '''
    绘制词频统计表
    参数 counts: 词频统计结果 num:绘制topN
    return:none
    '''
    x_aixs = []
    y_aixs = []
    
    order = sorted(counts.items(), key = lambda x:x[1], reverse = True)
    for a in order[:num]:
        x_aixs.append(a[0])
        y_aixs.append(a[1])
    
    matplotlib.rcParams['font.sans-serif'] = ['SimHei']
    matplotlib.rcParams['axes.unicode_minus'] = True
    plt.bar(x_aixs, y_aixs)
    plt.title('词频统计结果')
    plt.show()

def drawcloud(word_f):
    '''
    根据词频绘制词云图
    参数 word_f:统计出的词频结果
    return:none
    '''
    cloud_mask = np.array(Image.open('cloud.png'))
    st = set(['东西','这是','真的','怎么'])
    wc = WordCloud(background_color='white',
    mask = cloud_mask,
    max_words=100,
    font_path='simhei.ttf',
    min_font_size=10,
    max_font_size=60,
    width=400,
    relative_scaling=0.3,
    stopwords=st)
    wc.fit_words(word_f)
    wc.to_file('pic.png')

内容分析

def text_detection(text,file_path):
    '''
    使用hub对评论进行内容分析
    return:分析结果

    '''
    porn_detection_lstm = hub.Module(name='porn_detection_lstm')
    f = open('comments.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':
            print(item['text'],':',item['porn_probs'])

主函数

#评论是多分页的,得多次请求爱奇艺的评论接口才能获取多页评论,有些评论含有表情、特殊字符之类的
#num 是页数,一页10条评论,假如爬取1000条评论,设置num=100
if __name__ == "__main__":
    num = 60
    arr = []     #放置评论
    lastId = '0'  #接口的id
    with open('comments.txt','a',encoding='utf-8') as f:
        for i in range(num):
            lastId = saveMovieInfoToFile(lastId, arr)
            time.sleep(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(arr)
    print('共爬取评论:', len(arr))
    f = open('comments.txt','r',encoding='utf-8')
    counts = {
     }
    for line in f.readlines():
        words = fenci(line)
        stopwords = stopwordslist('cn_stopwords.txt')
        movestopwords(words, stopwords, counts)

    drawcounts(counts,10)
    drawcloud(counts)
    f.close()

    file_path = 'comments.txt'
    test_text = []
    text_detection(test_text,file_path)
    display(Image.open('pic.png')) #显示生成的词云图像

运行结果

飞桨学院-Python从小白逆袭大神-Day5-综合大作业_第2张图片
飞桨学院-Python从小白逆袭大神-Day5-综合大作业_第3张图片
好了,今天分享就到这里了,大家有不懂的可以留言评论噢。

你可能感兴趣的:(飞桨学院-Python从小白逆袭大神-Day5-综合大作业)