#私藏项目实操分享# Java实现基于朴素贝叶斯的情感词分析

本文介绍了贝叶斯分类的基础概念,重点阐述了朴素贝叶斯模型的工作原理,包括其在假设特征属性独立性的情况下的简化,以及在文本情感分析中的应用流程。作者通过实例展示了模型的训练、保存和加载过程。
摘要由CSDN通过智能技术生成

另外,在贝叶斯公式的基础上进行变形,可以得到下面的公式:

$$

P(B_i|A)= \frac {P(B_i)P(A|B i)} {\sum {j=1}^n P(B_j)P(A|B_j)}

$$

其中 B1,B2,…,Bj 是一个完备事件组,上面的公式可以表示在事件A已经发生的条件下,寻找导致A发生的各种“原因”的 Bi 的概率。

朴素贝叶斯

在学习朴素贝叶斯之前,首先需要对贝叶斯分类进行一下了解,贝叶斯分类通过预测一个对象属于某个类别的概率,通过比较不同类别概率的大小预测其最可能从属的类别,是基于贝叶斯定理而构成出来的。在处理大规模数据集时,贝叶斯分类器表现出较高的分类准确性。

贝叶斯分类在处理一个未知类型的样本X时,可以先算出X属于每一个类别Ci的概率 P(Ci|X) ,然后选择其中概率最大的类别。假设有两个特征变量x和y,并且存在两个分类类别C1和C2,结合贝叶斯定理:

P(C1|x,y) > P(C2|x,y)

P(C1|x,y) < P(C2|x,y)

而朴素贝叶斯模型( Naive Bayesian Model )作为一种强大的预测建模算法,它在贝叶斯定理的基础上进行了简化,假定了目标的特征属性之间相互独立,这也是它被形容为“朴素”的原因。在实际情况中如果属性之间存在关联,那么分类准确率会降低,不过对于解决绝大部分的复杂问题非常有效。

设在样本数据集D上,样本数据的特征属性集为X=x1,x2,…,xdX=x1,x2,…,xd,类变量可被分为 Y=y1,y2,…,ymY=y1,y2,…,ym,即数据集D可以被分为ymym个类别。我们假设x1,x2,…,xdx1,x2,…,xd相互独立,那么由贝叶斯定理可得:

$$

\begin{array}{l}

P(y_i|x_1,x_2,\cdots,x_d)= \frac{P(x_1,x_2,\cdots,x_d|y_i) \cdot P(y_i)}{P(x_1,x_2,\cdots,x_d)} \

= \frac{P(x_1|y_i)\cdot P(x_2|y_i)\cdots P(x_d|y_i) \cdot P(y_i)}{P(x_1,x_2,\cdots,x

d)} \

{i=1}^{d}{P(x_j|y_i) \cdot P(y i)}}{\prod {j=1}^{d}{P(x_j)}} \

\end{array}

$$

对于相同的测试样本,分母 P(X) 的大小是固定不变的,因此在比较后验概率时,我们可以只比较分子的大小即可。

在这里解释一下贝叶斯定理、贝叶斯分类和朴素贝叶斯之间的区别,贝叶斯定理作为理论基础,解决了概率论中的逆概率问题,在这个基础上人们设计出了贝叶斯分类器,而朴素贝叶斯是贝叶斯分类器中的一种,也是最简单和常用的分类器,可以使用下面的图来表示它们之间的关系:

在实际应用中,朴素贝叶斯有广泛的应用,在文本分类、垃圾邮件过滤、情感预测及钓鱼网站的检测方面都能够起到良好的效果。为了训练朴素贝叶斯模型,我们需要先在训练集的基础上对分类好的数据进行训练,计算出先验概率和每个属性的条件概率,计算完成后,概率模型就可以使用贝叶斯原理对新数据进行预测。

贝叶斯推断与人脑的工作机制很像,这也是它为什么能够成为机器学习的基础,大脑的决策过程就是先对事物进行主观判断,然后搜集新的信息,优化主观判断,如果新的信息符合这个主观判断,那就提高主观判断的可信度,如果不符合,就降低主观判断的可信度。

代码实现

在对理论有了基本的了解后,我们开始分析怎样将朴素贝叶斯应用于我们文本处理的情感词分析中。主要步骤如下:

  • 对训练集和测试集完成文本分词,并通过主观判断标注所属的分类

  • 对训练集进行训练,统计每个词汇出现在分类下的次数,计算每个类别在训练样本中的出现频率、及每个特征属性对每个类别的条件概率(即似然概率)

  • 将训练好的模型应用于测试集的样本上,根据贝叶斯分类计算样本在每个分类下的概率大小

  • 比较在各个分类情况下的概率大小,推测文本最可能属于的情感分类

使用流程图表示:

1、准备阶段

首先准备数据集,这里使用了对某酒店的评论数据,根据主观态度将其分为“好评”或“差评”这两类待分类项,对每行分词后的语句打好了情感标签,并且已经提前对完整语句完成了对分词,数据格式如下:

在每行的数据的头部,是添加的“好评”或“差评”标签,标签与分词采用 tab 分割,词语之间使用空格分割。按照比例,将数据集的80%作为训练集,剩余20%作为测试集,分配过程尽量保证随机原则。

2、训练阶段

在训练阶段,主要完成词频的统计工作。读取训练集,统计出每个词属于该分类下出现的次数,用于后续求解每个词出现在各个类别下的概率,即词汇与主观分类情感之间的关系:

private static void train(){

Map<String,Integer> parameters = new HashMap<>();

try(BufferedReader br = new BufferedReader(new FileReader(trainingData))){ //训练集数据

String sentence;

while(null!=(sentence=br.readLine())){

String[] content = sentence.split("\t| "); //以tab或空格分词

parameters.put(content[0],parameters.getOrDefault(content[0],0)+1);

for (int i = 1; i < content.length; i++) {

parameters.put(content[0]+“-”+content[i], parameters.getOrDefault(content[0]+“-”+content[i], 0)+1);

}

}

}catch (IOException e){

e.printStackTrace();

}

saveModel(parameters);

}

将训练好的模型保存到文件中,可以方便在下次使用时不用重复进行模型的训练:

private static void saveModel(Map<String,Integer> parameters){

try(BufferedWriter bw =new BufferedWriter(new FileWriter(modelFilePath))){

parameters.keySet().stream().forEach(key->{

try {

bw.append(key+“\t”+parameters.get(key)+“\r\n”);

} catch (IOException e) {

e.printStackTrace();

}

});

bw.flush();

}catch (IOException e){

e.printStackTrace();

}

}

查看保存好的模型,数据的格式如下:

好评-免费送 3

差评-真烦 1

好评-礼品 3

差评-脏乱差 6

好评-解决 15

差评-挨宰 1

……

这里对训练的模型进行保存,所以如果后续有同样的分类任务时,可以直接在训练集的基础上进行计算,对于分类速度要求较高的任务,能够有效的提高计算的速度。

3、加载模型

加载训练好的模型:

private static HashMap<String, Integer> parameters = null; //用于存放模型

private static Map<String, Double> catagory=null;

private static String[] labels = {“好评”, “差评”, “总数”,“priorGood”,“priorBad”};

private static void loadModel() throws IOException {

parameters = new HashMap<>();

List parameterData = Files.readAllLines(Paths.get(modelFilePath));

parameterData.stream().forEach(parameter -> {

String[] split = parameter.split(“\t”);

String key = split[0];

int value = Integer.parseInt(split[1]);

parameters.put(key, value);

});

calculateCatagory(); //分类

}

对词进行分类,统计出好评及差评的词频总数,并基于它们先计算得出先验概率:

//计算模型中类别的总数

public static void calculateCatagory() {

catagory = new HashMap<>();

double good = 0.0; //好评词频总数

double bad = 0.0; //差评的词频总数

double total; //总词频

for (String key : parameters.keySet()) {

Integer value = parameters.get(key);

if (key.contains(“好评-”)) {

good += value;

} else if (key.contains(“差评-”)) {

bad += value;

}

}
先自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以扫码领取!

img

总结

谈到面试,其实说白了就是刷题刷题刷题,天天作死的刷。。。。。

为了准备这个“金三银四”的春招,狂刷一个月的题,狂补超多的漏洞知识,像这次美团面试问的算法、数据库、Redis、设计模式等这些题目都是我刷到过的

并且我也将自己刷的题全部整理成了PDF或者Word文档(含详细答案解析)

我的美团offer凉凉了?开发工程师(Java岗)三面结束等通知...

66个Java面试知识点

架构专题(MySQL,Java,Redis,线程,并发,设计模式,Nginx,Linux,框架,微服务等)+大厂面试题详解(百度,阿里,腾讯,华为,迅雷,网易,中兴,北京中软等)

我的美团offer凉凉了?开发工程师(Java岗)三面结束等通知...

算法刷题(PDF)

我的美团offer凉凉了?开发工程师(Java岗)三面结束等通知...

了准备这个“金三银四”的春招,狂刷一个月的题,狂补超多的漏洞知识,像这次美团面试问的算法、数据库、Redis、设计模式等这些题目都是我刷到过的

并且我也将自己刷的题全部整理成了PDF或者Word文档(含详细答案解析)

[外链图片转存中…(img-Xmpxc6cJ-1711182927206)]

66个Java面试知识点

架构专题(MySQL,Java,Redis,线程,并发,设计模式,Nginx,Linux,框架,微服务等)+大厂面试题详解(百度,阿里,腾讯,华为,迅雷,网易,中兴,北京中软等)

[外链图片转存中…(img-uKVEKM9H-1711182927206)]

算法刷题(PDF)

[外链图片转存中…(img-2YdzNIa4-1711182927206)]

需要更多Java资料的小伙伴可以帮忙点赞+关注,点击传送门,即可免费领取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值