最全#私藏项目实操分享# Java实现基于朴素贝叶斯的情感词分析,kafka常见的面试问题

最后

码字不易,觉得有帮助的可以帮忙点个赞,让更多有需要的人看到

又是一年求职季,在这里,我为各位准备了一套Java程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考

以下是部分内容截图
架构面试专题及架构学习笔记导图.png

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

现在请计算在晴天,气温适中的情况下,去游泳的概率是多少?根据贝叶斯定理,计算过程如下:

P(游泳|晴天,中温)=P(晴天,中温|游泳)*P(游泳)/P(晴天,中温)

=P(晴天|游泳)*P(中温|游泳)*P(游泳)/[P(晴天)*P(中温)]

=2/3 * 1/3 *1/2 / (1/2 *1/3 )

=2/3

最终得出去游泳的概率时2/3,上面就是基于贝叶斯定理,根据给定的特征,计算事件发生概率大小的过程。

贝叶斯分析的思路对于由证据的积累来推测一个事物的发生的概率具有重大作用,当我们要预测一个事物,首先会根据已有的经验和知识推断一个先验概率,然后在新证据不断的积累的情况下调整这个概率。整个通过累积证据来得到一个事件发生概率的过程我们称为贝叶斯分析。这样,贝叶斯底层的思想就可以概括为,如果能够掌握一个事情的全部信息,就能够计算出它的一个客观概率。

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

$$

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;

}

}

total = good + bad;

catagory.put(labels[0], good);

catagory.put(labels[1], bad);

catagory.put(labels[2], total);

catagory.put(labels[3],good/total); //好评先验概率

catagory.put(labels[4],bad/total); //差评先验概率

}

查看执行完后的统计值:

“好评”对应的词汇出现的总次数是46316个,“差评”对应的词汇出现的总次数是77292个,训练集词频总数为123608个,并可基于它们计算出它们的先验概率:

该文档属于某个类别的条件概率= 该类别的所有词条词频总数 / 所有词条的词频总数

4、测试阶段

总结

虽然面试套路众多,但对于技术面试来说,主要还是考察一个人的技术能力和沟通能力。不同类型的面试官根据自身的理解问的问题也不尽相同,没有规律可循。

上面提到的关于这些JAVA基础、三大框架、项目经验、并发编程、JVM及调优、网络、设计模式、spring+mybatis源码解读、Mysql调优、分布式监控、消息队列、分布式存储等等面试题笔记及资料

有些面试官喜欢问自己擅长的问题,比如在实际编程中遇到的或者他自己一直在琢磨的这方面的问题,还有些面试官,尤其是大厂的比如 BAT 的面试官喜欢问面试者认为自己擅长的,然后通过提问的方式深挖细节,刨根到底。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

0546)]

上面提到的关于这些JAVA基础、三大框架、项目经验、并发编程、JVM及调优、网络、设计模式、spring+mybatis源码解读、Mysql调优、分布式监控、消息队列、分布式存储等等面试题笔记及资料

有些面试官喜欢问自己擅长的问题,比如在实际编程中遇到的或者他自己一直在琢磨的这方面的问题,还有些面试官,尤其是大厂的比如 BAT 的面试官喜欢问面试者认为自己擅长的,然后通过提问的方式深挖细节,刨根到底。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 22
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值