计算机视觉领域:物体的尺寸变化范围大、摆放物体角度、姿态不定,而且可以出现在图片的任何地方,物体也可以是多个类别。
自然语言处理领域:语义推理、语义关联(文字的顺序会有不同的语义)、语义表示(分词歧义、一词多义)
实现层面:大数据(小样本局限)、大模型(模型越复杂,门槛越高)、大算力(硬件资源要求高)
迁移学习:A任务有一个模型,B任务与A类似,可以使用小数据在已有模型上微调
PaddleHub让我们直接从模型这一步开始去使用
PaddleHub是为了解决对于深度学习模型的需求开发的工具,基于飞桨领先的核心框架,精选效果优秀的算法,提供了百亿级大数据训练的预训练模型,方便用户不用花费大量精力从头开始训练一个模型。
官网:https://www.paddlepaddle.org.cn/hub
优势:深度学习的流程大致分为明确需求、数据优化、模型选型、调参训练、预测部署几个步骤。
PaddleHub让我们有一个便捷的方式,1模型即软件、使用Fine-tune API实现2迁移学习,AutoDLFinetuner实现一键自动超参搜索,3端到端部署,HubServing:一键模型服务化部署。
直接使用PaddleHub的模型。
Sentiment Classification(Senta),针对带有主观描述的中文文本,可自动判断该文本的情感极性类别并给出相应的置信度,能够帮助企业理解用户消费习惯、分析热点话题和危机舆情监控,为企业提供有利的决策支持。
Linux
!hub install senta_lstm==1.1.0#模型安装
#使用
!hub run senta_lstm --input_text "人工智能课程很有趣"
执行结果:
[{'text': '人工智能课程很有趣', 'sentiment_label': 1, 'sentiment_key': 'positive', 'positive_probs': 0.9572, 'negative_probs': 0.0428}]
情感标签是1,积极的
PyramidBox-Lite是基于2018年百度发表于计算机视觉顶级会议ECCV 2018的论文PyramidBox而研发的轻量级模型,模型基于主干网络FaceBoxes,对于光照、口罩遮挡、表情变化、尺度变化等常见问题具有很强的鲁棒性。该PaddleHub Module基于WIDER FACE数据集和百度自采人脸数据集进行训练,支持预测,可用于检测人脸是否佩戴口罩。
在python使用:
import paddlehub as hub
import cv2
module = hub.Module(name="pyramidbox_lite_mobile_mask")
test_img_path = "data/data31681/test.jpeg"
input_dict = {"data": [cv2.imread(test_img_path)]}#输入是json格式
results = module.face_detection(data=input_dict)
print(results)
结果:
[{'data': {'label': 'MASK', 'left': 678.9846324920654, 'right': 893.2966804504395, 'top': 241.9092297554016, 'bottom': 487.231333732605, 'confidence': 0.9711812}, 'id': 1}]
label标签为mask,戴了口罩
但是我觉得也有不太好的地方,所有的都基于已经训练好的模型,一旦模型不用了或者出现问题,就无法使用。
爬取青春有你2评论数据,进行词频统计并生成词云。
1、中文分词需要jieba,词云绘制需要wordcloud
!pip install jieba
!pip install wordcloud
2、库的导入
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 #绘制词云模块
3、数据爬取部分
num = 1000
lastId = '0' #lastId 是接口分页id
arr = [] #arr是爬取的所有评论存放的数组
with open('aqy.txt', 'a', encoding='utf-8') as f: #写文件是追加写的
for i in range(num):
lastId = saveMovieInfoToFile(lastId,arr)
time.sleep(0.5)#频繁访问爱奇艺接口,偶尔出现接口连接报错情况,睡眠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('共爬取评论:',len(arr))
涉及的函数:
(1)请求页面
def getMovieinfo(url):
session = requests.Session()
headers = {
"User-Agent": "Mozilla/5.0",
"Accept": "application/json",
"Referer": "http://m.iqiyi.com/v_19rqriflzg.html",
"Origin": "http://m.iqiyi.com",
"Host": "sns-comment.iqiyi.com",
"Connection": "keep-alive",
"Accept-Language": "en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7,zh-TW;q=0.6",
"Accept-Encoding": "gzip, deflate"
}
response = session.get(url, headers=headers)
if response.status_code == 200:
return response.text
return None
(2)爬取数据,解析数据获取评论
def saveMovieInfoToFile(lastId,arr):
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)
responseTxt = getMovieinfo(url)
responseJson = json.loads(responseTxt)
comments = responseJson['data']['comments']
for val in comments:
# print(val.keys())
if 'content' in val.keys():
# print(val['content'])
arr.append(val['content'])
lastId = str(val['id'])
return lastId
(3)去除特殊字符
def clear_special_char(content):
s = re.sub(r"?(.+?)>| |\t|\r", "", content)
s = re.sub(r"\n", " ", s)
s = re.sub('[^\u4e00-\u9fa5^a-z^A-Z^0-9]', '', s)
return s
4、数据处理部分
counts = {}
f = open('aqy.txt', 'r',encoding='utf-8')
for line in f:
words = fenci(line)
stopwords = stopwordslist('cn_stopwords.txt')
movestopwords(words,stopwords,counts)
def fenci(text):
jieba.load_userdict('add_words.txt')
seg = jieba.lcut(text, cut_all=False)
return seg
def stopwordslist(file_path):
stopwords = [line.strip() for line in open(file_path, encoding='UTF-8').readlines()]
return stopwords
def movestopwords(sentence,stopwords,counts):
out = []
for word in sentence:
if word not in stopwords:
if len(word) != 1:
counts[word] = counts.get(word,0) + 1
return None
5、图像绘制部分
drawcounts(counts,10) #绘制top10 高频词
drawcloud(counts) #绘制词云
f.close()
def drawcounts(counts,num):
x_aixs = []
y_aixs = []
c_order = sorted(counts.items(), key=lambda x:x[1],reverse=True)
for c in c_order[:num]:
x_aixs.append(c[0])
y_aixs.append(c[1])
matplotlib.rcParams['font.sans-serif'] = ['simhei']
matplotlib.rcParams['axes.unicode_minus'] = False#也不知为啥没什么用
plt.bar(x_aixs, y_aixs)
plt.title('词频统计结果')
plt.show()
def drawcloud(word_f):
#加载背景图片
cloud_mask = np.array(Image.open('cluod.png'))
#忽略显示的词
st=set(["东西","这是"])
#生成wordcloud对象
wc = WordCloud(background_color='white',
mask=cloud_mask,
max_words=150,
font_path='simhei.ttf',
min_font_size=10,
max_font_size=100,
width=400,
relative_scaling=0.3,
stopwords=st)
wc.fit_words(word_f)
wc.to_file('pic.png')