任务详情:
下方给定某电视剧(共 12 集)的弹幕信息,完成下方指定任务。
任务一:删除内容为空的弹幕(行),该行存在空值就需要删除。
任务二:使用 SnowNLP 库获取指定剧集点赞数量大于等于 100 的弹幕的情感极性平均得分。比如指定剧集series_num=5,返回第5集弹幕(点赞数量>=100)的情感极性平均得分
含义 | 内容 | 点赞数量 | 剧集 |
---|---|---|---|
列名 | contents | likeCount | tv_name |
说明:
1. 某集弹幕情感极性平均得分=该集弹幕情感极性得分总和 / 该集弹幕(点赞数量>=100)总数。
任务要求:
1. 程序接收某一剧集集数 series_num:int,程序返回结果是该剧集的弹幕情感极性平均得分,需要四舍五入保留两位小数,返回类型为 float;
2. 某电视剧弹幕信息是以逗号分割的csv文件,utf-8 编码。
思路:
1.根据任务一提示的,使用dropna()去除空值的行
2.因为本题的数据太多要进行分割处理,否则就会运行超时。使用Numpy里np.array_split(a,几块,axis = 0或1)分割成12块,刚好对应12集。把传入的值当成下标,再处理一下下标位置就可以对这个所需的块进行操作。
(感觉这道题有点凑巧,分割之后,每块里也只有一两个别的数据,但是按照任务二点赞数量大于100这个要求,也并没有太影响,只有两个数据需要再加个if判断,拼一下前面的一块)
3.遍历新得到的那块数据的'likeCount'列的数据进行判断,如果小于100,使用df[df['columns']==元素].index获取到其索引,使用pandas里的drop()方法把那些不符合要求的直接删除掉那一行,并直接修改原始的值inplace = True,随后重置下索引。
4.遍历其弹幕内容,使用SnowNLP里的SnowNLP(x).sentiments方法对其每个元素进行情感分析,并追加到列表里。在Datafream新生成一列,把这个列表赋值过去。
5.使用groupby('columns').sum()方法把数据组合起来,得到这一集的所有情感分析的总和
6.遍历'tv_name'列的数据和传入的值进行判断统计个数。(因为之前已经把小于100的给删掉了,所以不用再做其他判断了)
7.最后按照要求返回(该集弹幕情感极性得分总和 / 该集弹幕(点赞数量>=100)总数),并做好类型处理即可。
代码如下:
import pandas as pd
from snownlp import SnowNLP
import numpy as np
class Solution:
def TvSeriesEmotionalTask(self, series_num: int) -> float:
url='#######'
df=pd.read_csv(url,sep=',')
df=df.dropna(axis=0,how='any').reset_index()#去除nan值
df_list=np.array_split(df,12,axis=0)#把DataFrame切片
if series_num==3:
new_df=pd.concat([df_list[series_num-1],df_list[series_num-2]],axis=0,ignore_index=True)
elif series_num==10:
new_df=pd.concat([df_list[series_num-1],df_list[series_num-2]],axis=0,ignore_index=True)
else:
new_df=df_list[series_num-1]
for x in new_df['likeCount'].values:
if x <100:
new_df.drop(index=new_df[new_df['likeCount']==x].index,axis=0,inplace = True)
new_df=new_df.reset_index()#重置索引
#情感分析
good=[]
for x in new_df['contents'].values:
s=SnowNLP(x)
good.append(s.sentiments)
new_df['good']=good
df1=new_df.groupby('tv_name').sum()
count=0
for x in new_df['tv_name'].values:
if x==series_num:
count+=1
res=float('%.2f'%(df1['good'][series_num]/count))
return res
pass
以上仅代表个人的思路,如有欠缺请指教。