首页 > 编程语言 >#私藏项目实操分享# Java实现基于朴素贝叶斯的情感词分析

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

时间:2024-03-27 23:01:38浏览次数:38  
标签:Java parameters 训练 分类 差评 贝叶斯 实操 key

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

$$

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工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

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

如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)

img

总结

我个人认为,如果你想靠着背面试题来获得心仪的offer,用癞蛤蟆想吃天鹅肉形容完全不过分。想必大家能感受到面试越来越难,想找到心仪的工作也是越来越难,高薪工作羡慕不来,却又对自己目前的薪资不太满意,工作几年甚至连一个应届生的薪资都比不上,终究是错付了,错付了自己没有去提升技术。

这些面试题分享给大家的目的,其实是希望大家通过大厂面试题分析自己的技术栈,给自己梳理一个更加明确的学习方向,当你准备好去面试大厂,你心里有底,大概知道面试官会问多广,多深,避免面试的时候一问三不知。

大家可以把Java基础,JVM,并发编程,MySQL,Redis,Spring,Spring cloud等等做一个知识总结以及延伸,再去进行操作,不然光记是学不会的,这里我也提供一些脑图分享给大家:

希望你看完这篇文章后,不要犹豫,抓紧学习,复习知识,准备在明年的金三银四拿到心仪的offer,加油,打工人!
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
M,并发编程,MySQL,Redis,Spring,Spring cloud等等做一个知识总结以及延伸,再去进行操作,不然光记是学不会的,这里我也提供一些脑图分享给大家:

[外链图片转存中…(img-45x9OQOQ-1711529796961)]

[外链图片转存中…(img-bpSfGhZs-1711529796961)]

[外链图片转存中…(img-BqMF6lf6-1711529796961)]

希望你看完这篇文章后,不要犹豫,抓紧学习,复习知识,准备在明年的金三银四拿到心仪的offer,加油,打工人!
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

标签:Java,parameters,训练,分类,差评,贝叶斯,实操,key
From: https://blog.csdn.net/2401_83641098/article/details/137082775

相关文章

  • 区块链编程七大语言,使用最多的竟是Java
    SQL——结构化查询语言(StructuredQueryLanguage)或“Sequel”,是IBM开发的一种编程语言,用于与存储、查询和处理数据的数据库进行沟通。如今SQL约拥有700万名开发者。MySQL、PostgreSQL、SQLServer、DB2、Oracle等主流数据库都使用SQL来开发应用程序。使用SQL的区块链项......
  • 学习java时候的笔记(四)
    数组什么是数组?数组指的是一种容器,可以用来储存同种数据类型的多个值一维数组一维数组的定义:格式1数据类型[]数组名例:int[]array格式2数据类型数组名[]例intarray[]一维数组的静态初始化初始化:就是在内存中,为数组容器开辟空间,并将数据存入容器中......
  • java基础 韩顺平老师的 面向对象(高级) 自己记的部分笔记
     373,类变量引出 代码就提到了问题分析里的3点packagecom.hspedu.static_;publicclassChildGame{publicstaticvoidmain(String[]args){//定义一个变量count,统计有多少小孩加入了游戏intcount=0;Childchild1=newChild(......
  • R语言贝叶斯INLA空间自相关、混合效应、季节空间模型、SPDE、时空分析野生动物数据可
    全文链接:https://tecdat.cn/?p=35518原文出处:拓端数据部落公众号在统计建模过程中,经常会遇到空间自相关性的问题。空间自相关性是指相近位置的观测值往往比远离位置的观测值更相似。在尝试估计参数或进行预测时,空间自相关性可能会导致结果产生偏差。INLA(IntegratedNestedLapla......
  • 【面试精讲】Java垃圾回收算法分析和代码示例
    【面试精讲】Java垃圾回收算法分析和代码示例目录一、引用计数(ReferenceCounting)算法二、可达性分析(ReachabilityAnalysis)算法三、标记-清除(Mark-Sweep)算法四、复制(Copying)算法五、标记-整理(Mark-Compact)算法六、分代收集(GenerationalCollection)算法七、死亡对象判......
  • Java学习路线
    Java学习路线可以分为几个阶段,每个阶段都有其特定的学习目标和内容。以下是一条详细的Java学习路线:###阶段1:Java入门-**目标**:培养兴趣、快速上手。-**前期准备**:准备好在线编程工具,如菜鸟工具,以及记笔记软件,如Typora。-**Java编程基础**(约45天): -Java特点、环......
  • 抽象类java
    packagedemo;abstractclassPerson{//私有数据成员privateStringname;publicPerson(){}publicPerson(Stringname){this.name=name;}//getter和setter方法publicStringgetName(){returnname;}......
  • JAVA面试大全之并发篇
    目录1、并发基础1.1、多线程的出现是要解决什么问题的?本质什么?1.2、Java是怎么解决并发问题的?1.3、线程安全有哪些实现思路?1.4、如何理解并发和并行的区别?1.5、线程有哪几种状态?分别说明从一种状态到另一种状态转变有哪些方式?1.6、通常线程有哪几种使用方式?1......
  • Java写一个计算机,要求实现加减乘除功能,并且能够循环接收新的数据,通过用户交互来实现
    importjava.util.Scanner;//写一个计算机,要求实现加减乘除功能,并且能够循环接收新的数据,通过用户交互来实现publicclassDemo08{publicstaticvoidmain(String[]args){inta=0;intb=0;chars......
  • Java对象的数据安全
    假如你是负责实现某个Java类的程序员(theimplementatorofaJavaclass),你会怎么做以防止客户端(theclient)程序员篡改你的数据,干预你的程序的正常运行?本篇随笔提供了几种方法。使用private关键字修饰属性出于数据的安全性考虑,在定义Java类的属性时,应当尽可能多地使用privat......