本来想用python+机器学习做情感分析,但是还没开始就放弃了(机器学习没学过啊,还那么难,为了这一个接口去花费大量的时间学习,实在不划算)所以放弃了造轮子。emmm,无意中发现了,百度AI开放平台。上面有很多可以免费使用的“轮子”。
嗯,就是这个情感倾向分析
自己创建一个应用就可以了。这里我使用的是java的SDK。
SDK文档很详细,可以直接照着例子用。
来分析一下返回结果:
{
"text":"苹果是一家伟大的公司",
"items":[
{
"sentiment":2, //表示情感极性分类结果
"confidence":0.40, //表示分类的置信度
"positive_prob":0.73, //表示属于积极类别的概率
"negative_prob":0.27 //表示属于消极类别的概率
}
]
}
官方的解释。
我在这里提取的值是positive_prob(取值范围0 ~ 1),这个是属于积极类别的概率,我把它作为文本分析的情绪值。
因为当这个值很大时(接近1)表示情绪正向,即很高兴,当它很小时(接近0)表示情绪负向,即不开心或者其他消极情绪。
返回结果总的是个json
对象,我们要首先取到items,它是个json
对象数组,用getJSONArray("items")
获取,数组里只有一个元素,所以我们要获取它的第一个元素,即get(0)
,这也是个json
对象。然后直接get("positive_porb")
就可以获取我们想要的值(为了更加直观的显示,我在这里乘了100,然后转为了int型,使它的取值范围变成0 ~ 100)。
这里我是放在springboot
项目里的。下面贴一下代码。主要是一个问题。从返回结果中提取自己想要的值。
我直接写成了一个配置类:
package com.after.demo.config;
import com.baidu.aip.nlp.AipNlp;
import org.json.JSONObject;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
/**
* @author www.xyjz123.xyz
* @description
* @date 2019/4/27 16:45
*/
@Configuration
public class AipNlpConfig {
public static final String APP_ID = "你的app_id ";
public static final String API_KEY = "你的api_key";
public static final String SECRET_KEY = "你的secret_key";
/**
* 根据传入的文本进行情感分析
* @param text 文本内容
* @return 情感分析结果
*/
public JSONObject sentimentClassify(String text){
// 初始化一个AipNlp
AipNlp client = new AipNlp(APP_ID, API_KEY, SECRET_KEY);
// 设置网络连接参数
client.setConnectionTimeoutInMillis(2000);
client.setSocketTimeoutInMillis(60000);
//传入可选参数调用接口
HashMap<String ,Object> options = new HashMap<>(16);
//情感倾向分析,并返回结果
return client.sentimentClassify(text,options);
}
}
在service中调用:
package com.after.demo.service.impl;
import com.after.demo.config.AipNlpConfig;
import com.after.demo.entity.Diary;
import com.after.demo.mapper.DiaryMapper;
import com.after.demo.service.DiaryService;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author www.xyjz123.xyz
* @description
* @date 2019/4/16 20:14
*/
@Service
public class DiaryServiceImpl implements DiaryService {
@Autowired
DiaryMapper diaryMapper;
@Autowired
AipNlpConfig aipNlpConfig;
@Override
public int saveDiary(String userName, String photo, String title, String content,String time) {
int sentiment = getSentiment(content);
return diaryMapper.saveDiary(userName, photo, title, content, time, sentiment);
}
public int getSentiment(String text){
//情感分析
JSONObject res = aipNlpConfig.sentimentClassify(text);
//获取items
JSONArray items = res.getJSONArray("items");
//取items的第一个元素,是个JSONObject对象
JSONObject it1 = items.getJSONObject(0);
//取it1的中属于积极类别的概率并 * 100
int sentiment = (int)(it1.getDouble("positive_prob") * 100);
return sentiment;
}
}
到此结束,来测试一下试试:
我传入的文本是一句没啥感情色彩的句子,所以sentiment值不大不小。