当前位置:   article > 正文

[python]飞桨python小白逆袭课程day5——大作业来啦_百度飞浆用python调整图片清晰度

百度飞浆用python调整图片清晰度

 

第一步:爱奇艺《青春有你2》评论数据爬取(参考链接:https://www.iqiyi.com/v_19ryfkiv8w.html#curid=15068699100_9f9bab7e0d1e30c494622af777f4ba39)

  • 爬取任意一期正片视频下评论
  • 评论条数不少于1000条

第二步:词频统计并可视化展示

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

第三步:绘制词云

  • 根据词频生成词云
  • 可选项-添加背景图片,根据背景图片轮廓生成词云

第四步:结合PaddleHub,对评论进行内容审核

 

需要的配置和准备

  • 中文分词需要jieba
  • 词云绘制需要wordcloud
  • 可视化展示中需要的中文字体
  • 网上公开资源中找一个中文停用词表
  • 根据分词结果自己制作新增词表
  • 准备一张词云背景图(附加项,不做要求,可用hub抠图实现)
  • paddlehub配置

 

下面就是具体的实现过程啦

 

  1. !pip install jieba
  2. !pip install wordcloud
  3. # Linux系统默认字体文件路径
  4. !ls /usr/share/fonts/
  5. # 查看系统可用的ttf格式中文字体
  6. !fc-list :lang=zh | grep ".ttf"
  7. #!wget https://mydueros.cdn.bcebos.com/font/simhei.ttf # 下载中文字体
  8. # #创建字体目录fonts
  9. #!mkdir .fonts
  10. # # 复制字体文件到该路径
  11. !cp simhei.ttf .fonts/
  12. #设置当前字体为默认字体
  13. !cp simhei.ttf /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/mpl-data/fonts/ttf/
  14. !fc-list :lang=zh | grep ".ttf"
  15. #安装模型
  16. !hub install porn_detection_lstm==1.1.0
  17. !pip install --upgrade paddlehub

 

下面是导入包

  1. from __future__ import print_function
  2. import requests
  3. import json
  4. import re #正则匹配
  5. import time #时间处理模块
  6. import jieba #中文分词
  7. import numpy as np
  8. import matplotlib
  9. import matplotlib.pyplot as plt
  10. import matplotlib.font_manager as font_manager
  11. from PIL import Image
  12. from wordcloud import WordCloud #绘制词云模块
  13. import paddlehub as hub
  14. import collections

collections 模块是Python标准库,是数据结构常用模块

常用类型有:

  计数器(Counter)

  双向队列(deque)

  默认字典(defaultdict)

  有序字典(OrderedDict)

  可命名元组(namedtuple)

 

这一步是爬取评论

  1. #请求爱奇艺评论接口,返回response信息
  2. def getMovieinfo(url):
  3. '''
  4. 请求爱奇艺评论接口,返回response信息
  5. 参数 url: 评论的url
  6. :return: response信息
  7. '''
  8. # url = r"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=241062754621&page=&page_size=40"
  9. headers = {
  10. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
  11. }
  12. try:
  13. response = requests.get(url,headers=headers)
  14. # print(response.status_code)
  15. if response.status_code == 200:
  16. # 状态码为200时表示成功, 服务器已成功处理了请求
  17. json_text = json.loads(response.text)
  18. return json_text
  19. # print(json_text)
  20. except Exception as e:
  21. print(e)
  22. return None
  23. #解析json数据,获取评论
  24. def saveMovieInfoToFile(json_text):
  25. '''
  26. 解析json数据,获取评论
  27. 参数 lastId:最后一条评论ID arr:存放文本的list
  28. :return: 新的lastId
  29. '''
  30. arr = []
  31. for i in range(40):
  32. # json_text.get('data').get('comments')得到的结果是列表
  33. # 由于page_size的值为40,因此需要循环40
  34. comment = json_text.get('data').get('comments')[i].get('content')
  35. arr.append(comment)
  36. # lastId 的获取
  37. lastId = json_text.get('data').get('comments')[39].get('id')
  38. # print('comment获取成功,lastId:%s' % lastId)
  39. return arr,lastId
  1. #去除文本中特殊字符
  2. def clear_special_char(content):
  3. '''
  4. 正则处理特殊字符
  5. 参数 content:原文本
  6. return: 清除后的文本
  7. '''
  8. s = r'[^\u4e00-\u9fa5a-zA-Z0-9]'
  9. # 用空格替换文本中特殊字符
  10. content= re.sub(s,'',content)
  11. return content
  12. def fenci(content):
  13. '''
  14. 利用jieba进行分词
  15. 参数 text:需要分词的句子或文本
  16. return:分词结果
  17. '''
  18. words = [i for i in jieba.lcut(text)]
  19. return words
  20. def stopwordslist(file_path):
  21. '''
  22. 创建停用词表
  23. 参数 file_path:停用词文本路径
  24. return:停用词list
  25. '''
  26. with open(file_path, encoding='UTF-8') as words:
  27. stopwords = [i.strip() for i in words.readlines()]
  28. return stopwords
  29. def movestopwords(file_path):
  30. '''
  31. 去除停用词,统计词频
  32. 参数 file_path:停用词文本路径 stopwords:停用词list counts: 词频统计结果
  33. return:None
  34. '''
  35. clean_word_list = []
  36. # 使用set集合可以更快的查找某元素是否在这个集合中
  37. stopwords = set(stopwordslist(file_path))
  38. # 遍历获取到的分词结果,去除停用词
  39. for word in all_words:
  40. if word not in stopwords and len(word) > 1:
  41. clean_word_list.append(word)
  42. # 由于没有返回值的限制,所以此处现在main()中定义counts变量,再使用全局变量counts,此句是对counts为全局变量的声明
  43. global counts
  44. # collections.Counter(clean_word_list)就是前边多导入的一个package,返回的值是一个有序字典,并且带有词频
  45. counts = collections.Counter(clean_word_list)
  46. return None
  47. def drawcounts(counts,topN):
  48. '''
  49. 绘制词频统计表
  50. 参数 counts: 词频统计结果 num:绘制topN
  51. return:none
  52. '''
  53. # counts.most_common(topN)返回的是一个列表,并且每个元素是一个元组,元组中的第一个元素是词,第二个元素是词频
  54. word_counts_topN = counts.most_common(topN) # 获取前topN最高频的词
  55. word_counts = []
  56. labels = []
  57. # 对列表进行遍历,获取词频word_counts 和该词的labels
  58. for ele in word_counts_topN:
  59. labels.append(ele[0])
  60. word_counts.append(ele[1])
  61. plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
  62. plt.figure(figsize=(12,9))
  63. plt.bar(range(topN), word_counts,color='r',tick_label=labels,facecolor='#9999ff',edgecolor='white')
  64. # 这里是调节横坐标的倾斜度,rotation是度数,以及设置刻度字体大小
  65. plt.xticks(rotation=45,fontsize=20)
  66. plt.yticks(fontsize=20)
  67. plt.legend()
  68. plt.title('''前%d词频统计结果''' % topN,fontsize = 24)
  69. plt.savefig('bar_result.jpg')
  70. plt.show()
  71. return

下面是加载抠图功能,利用一个图片最好是色差较大背景,具体的效果试过就知道了,输出是一个human_seg目录下的抠图图片

  1. import sys
  2. import os
  3. import paddlehub as hub
  4. # 加载模型
  5. humanseg = hub.Module(name = "deeplabv3p_xception65_humanseg")
  6. # 抠图
  7. results = humanseg.segmentation(data = {"image":['bgbg.png']})
  8. for result in results:
  9. print(result['origin'])
  10. print(result['processed'])

 

然后绘制词云图

  1. def drawcloud(word_f):
  2. '''
  3. 根据词频绘制词云图
  4. 参数 word_f:统计出的词频结果
  5. return:none
  6. '''
  7. mask = np.array(Image.open('/home/aistudio/humanseg_output/bgbg.png')) # 定义词频背景
  8. wc = WordCloud(
  9. background_color='white', # 设置背景颜色
  10. font_path='/home/aistudio/simhei.ttf', # 设置字体格式
  11. mask=mask, # 设置背景图
  12. max_words=120, # 最多显示词数
  13. max_font_size=100 , # 字体最大值
  14. min_font_size = 10,
  15. width = 400,
  16. height= 600,
  17. scale=2 # 调整图片清晰度,值越大越清楚
  18. )
  19. wc.generate_from_frequencies(word_f) # 从字典生成词云
  20. wc.to_file('/home/aistudio/pic3.png') # 将图片输出为文件
  1. def text_detection():
  2. '''
  3. 使用hub对评论进行内容分析
  4. return:分析结果
  5. '''
  6. test_text = []
  7. # 配置hub模型
  8. porn_detection_lstm = hub.Module(name='porn_detection_lstm')
  9. # 读取评论,并存入test_text 下
  10. with open("./dataset/comments.txt", "r") as f:
  11. for line in f:
  12. if len(line) <= 1:
  13. continue
  14. else:
  15. test_text.append(line)
  16. input_dict = {'text':test_text}
  17. results = porn_detection_lstm.detection(data=input_dict,use_gpu=True,batch_size=1)
  18. for index,item in enumerate(results):
  19. if item['porn_detection_key'] == 'porn':
  20. print(item['text'], ':', item['porn_probs'])

最后点调用主函数

  1. #评论是多分页的,得多次请求爱奇艺的评论接口才能获取多页评论,有些评论含有表情、特殊字符之类的
  2. #num 是页数,一页10条评论,假如爬取1000条评论,设置num=100
  3. if __name__ == "__main__":
  4. text_list = []
  5. # 起始url
  6. url = r"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=241062754621&page=&page_size=40"
  7. # 停用词路径
  8. file_path = r'./work/stopwords.txt'
  9. # 停用词list
  10. topN = 10
  11. counts = None
  12. stopwords = stopwordslist(file_path)
  13. # 评论获取
  14. for i in range(30):
  15. json_text = getMovieinfo(url)
  16. arr,lastId = saveMovieInfoToFile(json_text)
  17. text_list.extend(arr)
  18. time.sleep(0.5)
  19. # print('lastId:%s,评论抓取成功' %lastId)
  20. # 去除特殊字符
  21. for text in arr:
  22. # 去除文本中特殊字符
  23. if text and len(text) > 2:
  24. content = clear_special_char(text)
  25. text_list.append(content)
  26. # print('数据获取成功')
  27. url = r"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=" +lastId+ "&page=&page_size=40"
  28. with open("./dataset/comments.txt", "w") as f:
  29. # 评论写入txt文档
  30. for line in text_list:
  31. if line != None:
  32. f.writelines(line)
  33. # print(line)
  34. f.writelines("\n")
  35. print('*' * 50)
  36. print('写入完成')
  37. print('共爬取评论:%d' %len(text_list))
  38. # 评论分词
  39. all_words = []
  40. for text in text_list:
  41. if text:
  42. all_words.extend(fenci(text))
  43. # 分词结果 去除停用词
  44. movestopwords(file_path)
  45. # 绘制词频展示图
  46. drawcounts(counts,topN)
  47. # 绘制词云
  48. drawcloud(counts)
  49. # print("----")
  50. display(Image.open('pic3.png')) #显示生成的词云图像
  51. # text_detection()#显示色情评论及其概率

最后实现词频分析柱状图和词云图,收获很多,感谢飞桨深度学习学院,虽然时间很短,但的确在这很短时间内扩充了我们的视野,也让我从一开始停留在理论,转到动手实现深度学习的实验当中,虽然这些案例并不是很难,但每一步都需要认真明白,才能最终运行成功。总之,这次收获很多,再次感谢百度飞桨深度学习学院!我会利用更多时间去进一步消化课上的很多内容,加油!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/318863
推荐阅读
相关标签
  

闽ICP备14008679号