之前的博客我们设计出了根据情绪对不同类型的文章进行评分的算法,现在我们使用python对其进行实现。
标准向量
为了计算出文章的情感,我们使用统计的方法,对多人,多篇文章进行阅读时的情绪采样,将人们对每个类型的文章时的情感取平均值,作为该类型的标准情感向量。最终统计的结果如下:
{'国际':[14.67, 0.163, 0.163, 1.936, 68.429, 14.67, 11.633],
'军事':[68.429, 1.936, 11.633, 14.67, 0.163, 14.67, 0.163],
'国内':[14.67, 0.163, 11.633, 1.936, 0.163, 68.429, 14.67],
'台湾':[11.633, 1.936, 14.67, 14.67, 68.429, 0.163, 0.163],
'社评':[1.936, 11.633, 0.163, 68.429, 14.67, 14.67, 0.163],
'社会':[0.163, 14.67, 68.429, 1.936, 14.67, 11.633, 0.163],
'海外看中国':[14.67, 68.429, 0.163, 1.936, 11.633, 14.67, 0.163]}
使用这个标准向量可以计算余弦相似度。
实现算法
根据上述算法思想,实现代码如下:
import numpy as np
#标准情绪向量
st_emotion={'国际':[14.67, 0.163, 0.163, 1.936, 68.429, 14.67, 11.633],
'军事':[68.429, 1.936, 11.633, 14.67, 0.163, 14.67, 0.163],
'国内':[14.67, 0.163, 11.633, 1.936, 0.163, 68.429, 14.67],
'台湾':[11.633, 1.936, 14.67, 14.67, 68.429, 0.163, 0.163],
'社评':[1.936, 11.633, 0.163, 68.429, 14.67, 14.67, 0.163],
'社会':[0.163, 14.67, 68.429, 1.936, 14.67, 11.633, 0.163],
'海外看中国':[14.67, 68.429, 0.163, 1.936, 11.633, 14.67, 0.163]}
def rate(_type,emotion):#计算评分
emotion=np.array(emotion)
types=_type.split('&')#获取所有类型标签
standard=0
for t in types:
standard+=np.array(st_emotion[t])#相加得新的标准情绪向量
cos=np.dot(standard,emotion)/(np.linalg.norm(standard)*np.linalg.norm(emotion))#计算余弦相似度
rate=5*(cos+1)#映射到-10
return rate
#print(rate('军事&社会',[1,1,1,1,1,1,1]))
这样就能根据用户的面部图像得到情绪,进而计算得到阅读评分了。
工程推进
实现算法的同时,我还负责了该模块在工程中的Service层和Dao层的代码编写、测试工作。具体工程代码可见github。