首页 > 编程语言 >机器学习-贝叶斯算法的研究和实践(评论检测)

机器学习-贝叶斯算法的研究和实践(评论检测)

时间:2024-09-19 15:47:20浏览次数:9  
标签:Ci 概率 检测 贝叶斯 算法 评论 分词

项目背景:

★ 我们公司的应用有个需求是对用户发表的评论进行过滤,除了人工审核干预以外,我们还需要自动化检测评论来规避这些行为,为此我们研究贝叶斯算法,写了评论检测的项目用于过滤垃圾评论。

贝叶斯算法介绍

​ 贝叶斯分类算法是统计学的一种分类方法,它是一类利用概率统计知识进行分类的算法。在许多场合,朴素贝叶斯(Naïve Bayes,NB)分类算法可以与决策树和神经网络分类算法相媲美,该算法能运用到大型数据库中,而且方法简单、分类准确率高、速度快。 (摘自百度)

朴素贝叶斯算法

​ 朴素贝叶斯法(Naive Bayes)是基于贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布;然后基于此模型,对给定的输入 xx ,利用贝叶斯定理求出后验概率最大的输出 yy 。

​ 设每个数据样本用一个n维特征向量来描述n个属性的值,即:X={x1,x2,…,xn},假定有m个类,分别用C1, C2,…,Cm表示。给定一个未知的数据样本X(即没有类标号),若朴素贝叶斯分类法将未知的样本X分配给类Ci,则一定是

P(Ci|X)>P(Cj|X) 1≤j≤m,j≠i

​ 根据贝叶斯定理,由于P(X)对于所有类为常数,最大化后验概率P(Ci|X)可转化为最大化先验概率P(X|Ci)P(Ci)。如果训练数据集有许多属性和元组,计算P(X|Ci)的开销可能非常大,为此,通常假设各属性的取值互相独立,这样

​ 先验概率P(x1|Ci),P(x2|Ci),…,P(xn|Ci)可以从训练数据集求得。

​ 根据此方法,对一个未知类别的样本X,可以先分别计算出X属于每一个类别Ci的概率P(X|Ci)P(Ci),然后选择其中概率最大的类别作为其类别。

​ 朴素贝叶斯算法成立的前提是各属性之间互相独立。当数据集满足这种独立性假设时,分类的准确度较高,否则可能较低。另外,该算法没有分类规则输出。

​ 我们项目中应用的正是朴素贝叶斯算法

分词算法

​ 我测试了多个分词算法,包括

Ansj,FudanNLP,HanLP,IKAnalyzer,Jcseg,Jieba,MMSeg4j,Paoding,Smartcn,Stanford

经过仔细对比,最后采用了Hanlp的NLP分词,因为和Hanlp对中文的分词效果比较接近我们的场景。

NLP分词默认模型训练来自9970万字的大型综合语料库,是已知范围内全世界最大的中文分词语料库,该分词的效果是我们测试了6,7种分词算法里最优秀的,也是最适合我们评论分词的场景的。

项目实现:

一、训练过程

1.把悦读的评论库作为训练模型,每周固定时间从悦读数据库拉取数据到本地,按不当评论和正常评论存储到本地

2.用Hanlp的NLP分词对拉取到本地的评论进行分词

3.对分词的结果用朴素贝叶斯算法计算概率(贝叶斯算法是机器学习常用的一种算法)

在我们的场景下公式可以转化为:

p代表有不当词语,评论为不当评论的概率

p1代表不当评论的基础概率

p2代表正常评论的基础概率

p3代表不当评论的条件概率

p4代表正常评论的条件概率

根据公式可得:p=(p1×p3)/(p1×p3+p2×p4)

4.把计算后的概率存到ElasticSearch数据库

流程图如下:

二、人工干预概率

如果训练出来的词语概率有不准确的情况,会导致线上评论被误杀,学生无法发表正常的评论,为此我们增加了一个功能去单独为这个词语设置概率,操作步骤如下:

1.设置概率保存到ES里

2.读取时优先读取人工设置的概率

3.如果没有人工概率再读取训练的概率。

三、检测过程

1.对检测的评论进行分词,得到一个分词后的词语集合

2.查询ES里面这些词语的概率

3.通过复合概率公式或者平均概率公式计算不当评论的概率(本次项目使用的是平均概率公式,也可以切换到复合概率公式)

复合概率公式: P(A|t1 ,t2, t3……tn)=(P1P2……PN)/[P1P2……PN+(1-P1)(1-P2)……(1-PN)]

平均概率公式:P(A|t1 ,t2, t3……tn)=(P1+P2+……+PN)/N

当P(A|t1 ,t2, t3……tn) 超过预定阈值时,就可以判断为垃圾评论

假设有一句评论:这是一个美好的下午,有个王者在打荣耀

分词后从ES查询的概率分别为:

{
    "荣耀": 0.76527333,
    "王者": 0.9477534,
    "下午": 0.6597938,
    "美好": 0.26188296
}

根据平均概率公式可以算出

p=0.6586759

根据复合概率公式可以算出

p=0.9760163

这时候我们需要判定这个概率到底是否属于不当评论,这里就需要一个阀值,阀值怎么确认呢?我们接下来就要讲到这个计算。

检测的流程图如下:

四、阀值的计算

​ 阀值关系到最终不当评论的结果判定,所以计算这个需要谨慎再谨慎,我耗费了整整半个月的时间来改进算法,以及确定这个阀值。

​ 到底如何确定阀值呢,我是通过对线上的几十万评论进行检测确定的

​ 首先我们线上的评论已经由人工确定了几个分类(删除,屏蔽,不通过,正常,未审核),我这边要做的就是对这些不同种类的评论进行检测,删除和屏蔽状态的是不当评论,不通过和正常的是正常的评论(这里我们的审核机制是,如果不是特别好的评论都归纳为不通过评论,所以不通过评论也是正常的

​ 对这些评论分别检测以后我们可以得到一个不当评论的漏检率,正常评论的误报率,我会把阀值设定在(0-1之间,每隔0.03概率检测一次),相当于检测了30次左右,在这30次中,不当评论的漏检率越低越好,正常评论的误报率越低越好,最终得出在阀值为0.4时效果比较好:

正常评论误杀率为:0.068208896,不当评论漏检率为:0.11396843

​ 这个结果是平均概率公式的结果,复合概率公式会有些差异。最后鉴于我们有人工的参与,不当评论漏检率可以允许高一点,正常评论误杀率要低一点,所以我最后还是选择了概率阀值:0.49,正常评论误杀率为0.03.

总结:

​ (2024.9.19)人工智能是未来的趋势,这是18年做的项目了。目前的人工智能已经转战大模型,这种算法都是小case了,不过了解一下这种算法也好,因此我还是把这篇博客保留下来了

标签:Ci,概率,检测,贝叶斯,算法,评论,分词
From: https://www.cnblogs.com/leecoder5/p/18420710

相关文章

  • 第139期 大规模食品logo检测数据集
    引言亲爱的读者们,您是否在寻找某个特定的数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。FoodLogoDet-1500:食品徽标检测的大规模数据集探索在数字化时代的浪潮下,多媒体信息......
  • 代码随想录算法训练营,9月19日 | 39. 组合总和,40.组合总和II,131.分割回文串
    39.组合总和题目链接:39.组合总和文档讲解︰代码随想录(programmercarl.com)视频讲解︰组合总和日期:2024-09-19想法:组合总和类型题,允许重复使用元素,递归不+1就行。Java代码如下:classSolution{List<Integer>path=newArrayList<>();List<List<Integer>>res=n......
  • 老人摔倒智能检测报警系统 YOLOv7
    老人摔倒智能检测报警系统利用监控摄像头和智能算法,老人摔倒智能检测报警系统实时监测老人的活动状态,系统通过现场监控摄像头感知老人是否发生摔倒,并通过智能算法进行分析和判断,一旦发现摔倒事件,立即触发报警装置发送求助信号。系统能够实时监测老人的活动状态,及时发现摔倒事件,减少......
  • 智慧课堂学生行为检测评估系统 Python
    智慧课堂学生行为检测评估系统利用摄像头和人工智能技术,智慧课堂学生行为检测评估系统实时监测学生的上课行为,智慧课堂学生行为检测评估系统通过图像识别和行为分析,评估学生的表情、是否交头接耳行为、课堂参与度以及互动质量,并提供相应的反馈和建议。智慧课堂学生行为检测评估系统......
  • 护目镜佩戴检测系统 Opencv
    护目镜佩戴检测系统利用摄像头和图像识别技术,护目镜佩戴检测系统实时监测工人的护目镜佩戴情况,护目镜佩戴检测系统通过拍摄工人的面部图像,并使用算法分析图像中的眼睛和护目镜位置,判断是否正确佩戴护目镜。护目镜佩戴检测系统能够实时监测工人的护目镜佩戴情况,护目镜佩戴检测系统及......
  • 算法-两数相加(150)
     我们首先创建一个虚拟头节点dummy,它的主要作用是简化边界条件的处理。然后,我们使用一个循环来遍历两个链表,同时考虑进位。在循环中,我们计算当前位的和(包括从上一个计算中可能遗留下来的进位),然后更新进位和当前节点。如果两个链表中的某个链表已经遍历完,我们将对应的值视为0......
  • 自动驾驶研发系列—智能驾驶护航:深入探讨盲点检测(BSD)功能
    ......
  • 算法设计与分析(整数划分问题
    目录整数拆分问题的递归解法问题描述解决方案递归函数设计边界条件递归公式实现代码示例输出小结:整数拆分问题的递归解法在今天的博客中,我们将探讨一个经典的数学问题:整数拆分。具体地说,我们要解决的问题是:将整数n拆分成若干个不大于m的正整数之和,问有多少种不同的拆分方式。这个......
  • 算法设计与分析(合并排序
    目录归并排序(MergeSort)的C++实现源代码解释结果小结:归并排序(MergeSort)的C++实现归并排序是一种分而治之的算法,它将数组分成两半,对每半部分递归地应用归并排序,然后将排序好的两半合并成一个有序的数组。以下是一个归并排序的C++实现。源代码#include<iostream>usingnames......
  • 算法设计与分析(斐波那契数列
    目录斐波那契数列的递归实现斐波那契数列的定义递归实现注意事项小结:斐波那契数列的递归实现在编程中,斐波那契数列是一个非常著名的序列,它通常定义为每个数字(从第3个数字开始)都是前两个数字的和,且前两个数字分别是0和1。斐波那契数列的定义在本实现中,斐波那契数列的定义略有不同,......