`
grunt1223
  • 浏览: 422889 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

基于统计概率和机器学习的文本分类技术 —— 社区产品机器审核机制预研报告

阅读更多
基于统计概率和机器学习的文本分类技术

—— 社区产品机器审核机制


一、现状

目前,所在公司社区类产品(论坛、博客、百科)每天都会接收到大量的垃圾、灌水信息,高峰期16小时内(晚6点以后到第二天9点前)可以达到十万量级。大量的人力、时间被浪费在删除、屏蔽这些重复无用信息上,从而导致无法更好地为客户服务。用人工审核的方式去对抗机器发帖,类似于二战时的“长矛战坦克”。如果继续采用这种方式,正在和未来可能面临的问题主要一下几点:
  • 未来版本量增加导致人工审核压力的增大。
  • 目前负责版本审核的人员约2-3人/天,基本能保证答案在4-5小时内被审核,但该速度不是令大多数用户满意的
  • 对于百科wiki类产品,除了判别是否违禁以外,还有一个需求,就是客户答案是否与问题确实相关。wiki的审核大多牵扯到一个多版本问题。由于审核延迟,可能造成部分答案有多个版本,而后面的用户在回答时不能看到前面用户的版本,故不是在原来答案基础上做修改,造成多个版本质量接近或后面的版本质量不高,被退回影响用户通过率和使用体验;
  • 特定任务中部分功能的实现遇到问题。任务中的倒计时功能,由于审核有延迟,不能做自动到时结束,必须人工审核完成后人工手动结束


总结目前产品中常见的垃圾广告主要有以下特点:
  • 批量垃圾信息是同几拨人发的,只是内容变来变去,感觉像专门的发帖公司。
  • 现在大都采取变换不同ID发帖的方式,导致黑名单方式不可用
  • 有些会在帖子标题中加很多符号或标点等分隔符隔断内容,所以之前尝试将他们的热线电话的号码加到违禁词里的办法,效果也不佳;另外还有火星文等样式


目前,了解到同行百科类网站审核情况如下
  • 百度知道:先发后审,机器过滤+人工检举
  • 搜搜问问:机器审核,能够计算出比较准确的审核时间,基本在5分钟以内
  • 百度百科:先审后发,机器过滤+人工审核,人工审核为主,所需时间从几分钟到小时不等,且晚上23:00以后没有审核不生成新版本
  • 互动百科:先发后审,人工审核,所需时间平均8小时左右


二、背景

在日常生活中,人们往往进行常识推理,而这种推理通常并不是十分准确的。例如,你看见一个头发潮湿的人走进来,你可能会认为外面下雨了,那你也许错了;如果你在公园里看到一男一女走得很近,你可能会认为他们是情侣,你可能也犯了错误。对结果的预测往往是建立在原有经验积累的基础上,并对现有现象各个特征分别属于某一结果的概率加权。

基于贝叶斯定理的进行分类或决策需要一系列特征向量(即某些东西,它们或存在、或不存在、或部分存在于某个分类中)。比如对于一套可以根据照片识别男女性别的系统,它决策所依赖的特征向量可能就是眼睛、鼻梁、脸庞、发型等;用它正确识别张靓颖的成功率就要高于李宇春,因为后者的许多特征向量的没有明显的倾向性。

对文本过滤来说,特征向量就是某段给定文本的各个词语。贝叶斯决策优于常用敏感词库过滤的一个重要原因在于,它考虑到了文本的上下问环境。我们先考虑简单的情况(不考虑中文分词),以英语为例,假设我们需要一个系统来识别一段包含单词python的文本,究竟应该是属于编程类,还是生物类。首先,我们需要模拟人知识积累的过程,给计算机一些已有的样本进行学习,如下表所示。
文本归类(Bio or Pro)
Pythons are constrictors that feed on birds and mammalsBio
Python was originally developed as a scripting languagePro
A 49-ft.-long python was found in ChinaBio
Python has dynamic type systemPro
Python with vivid scalesBio
An Open source project developed by pythonPro
…………


我们统计各特征向量(单词)在各类别(编程类或生物类)中出现的频率,得到类似如下的结果:
Pro Bio
dynamic 0.6 0.1
constrictor 0.0 0.6
long 0.1 0.2
source 0.3 0.1
and 0.95 0.95
…… …… ……


使用足够多的数据进行训练,上表的结果就很有意思。dynamic相对较常出现在编程类的文本中,而constrictor则相对较常出现在生物类的文本中,而source和long就没有那么强的倾向性。另外,像and这些词,它在各类目中出现的频率几乎一样(因为基本每篇文章中都会用到and),所以对于机器学习来说没有任何价值,这类词我们称为“停用词”(stop word),意味着以后在样本训练之前可以将它们去除,从而减少学习时间。几乎每个搜索引擎都会维护一份“停用词表”(stop word list),后面的章节会讲到如何使用它。

在使用贝叶斯分类器之前,让我们先来看看以下定义:
1.Pr(Category):属于某一特定分类的概率,先验概率
2.Pr(Document):某一文本的概率,先验概率,对任一文本,其值均为常量,故此值可以忽略
3.Pr(Category|Document):已知文本A,它属于某一分类的概率,就是我们要求的结果,条件概率、后验概率
4.Pr(Document | Category):某一分类下,文本A可能出现的概率,条件概率、非后验概率

一般的, Pr(Document | Category) = Pr(Word1 | Category) × Pr(Word2 | Category) × ……,例如“Python is a dynamic language”去除停用词 (is、a)后属于编程类的概率即为Pr(python | Pro) × Pr(dynamic | Pro) × Pr(language | Pro), 其中各Pr(Word | Category)的值取自前表。事实上,由于Pr(Word | Category) < 1,文本所包含的单词越多,Pr(Document | Category)的结果就越小。但这并非会影响最后的结果,因为我们使用的是各分类的相对值,例如,判断某一段文字是属于编程类还是生物类,计算的是Pr(Document | Pro)/ Pr(Document | Bio)。

使用贝叶斯分类器本质上就是根据先验概率、条件概率求后验概率的过程,描述为
Pr(Category|Document) = Pr(Document | Category) × Pr(Category) / Pr(Document)

事实上,正如前面所说的,Pr(Document)对所有待测文本都是相同的,而我们又只关心相对值,因此该公式可进一步简化为
Pr(Category|Document) = Pr(Document | Category) × Pr(Category)

计算Pr(Category|Document)所需的两个参数搜可以通过类似的方法训练历史数据得到,并且每次计算机决策、运营手工订正后以及错判投诉的结果又都会被加入到样本库中进行修正和再学习,这就是“有监督的机器学习”。

MicroSoft的工程师在Outlook中就使用了这种机制,并在
http://www.gfi.com/whitepapers/why-bayesian-filtering.pdf
阐述了为什么贝叶斯分类器是最有效的文本过滤算法,同时宣称合理的参数设置和足够丰富的样本能保证99.7%的审核正确率。

它的优点:
1、贝叶斯分类器识别整段代词文本内容。它在检索某些常用垃圾词的同时,也会兼顾那些在正常邮件中出现的词语。例如,并不是每封包含“free”和“cash”的邮件都是垃圾邮件,事实上,如果贝叶斯分类器在文本的其它地方发现了商业术语、公司合同等,还是可能会将它归为正常邮件。贝叶斯分类器考虑了上下文的语境,并智能化地使用概率、词频来权衡各词语,这是它与关键词\敏感词算法相比的最大优势。

2、贝叶斯分类器是完全自适应的 —— 它会从垃圾邮件和正常邮件不断地学习、抽取知识,甚至会在对抗中成长 —— 随着新出现的垃圾邮件而进化。比如专业的spammer使用“f-r-e-e”来代替“free”,或是使用“5ex”来代替“sex”,来逃避敏感词库的过滤。对于贝叶斯分类器来说,刚开始它从未见过这个单词,因此可能会将其归为“unknown”;但随着人工审核的复查,它会很快学习到这是个垃圾词。以后,spammer在垃圾帖中使用“f-r-e-e”的效果甚至还不如使用“free”,因为“f-r-e-e”几乎不会出现在正常邮件中,因此分类器更有自信将其归为垃圾邮件(useful/spam的比率更高)。

3、贝叶斯分类会分析用户的行为,更适合与定制化需求。例如对于一家经营五金的公司来说,“mortgage“ 几乎以为着垃圾邮件,但对于一家金融服务公司来说,它很有肯能是正常邮件(起码是”unknown”的) 。

4、贝叶斯分类器与敏感词相比,更适合国际化\多语言。事实上,要维护一份敏感词库十分困难,需要专业人士的参与。贝叶斯分类器采用自然语言分类的方式,某个词语属于垃圾邮件/正常邮件的概率完全由日常的行为所决定,即使是中英文混合的内容,也照常处理。

5、基于贝叶斯分类器的文本过滤机制较难被绕过 。一位高级的 spammer 想要绕过它,无非两种方法,较少采用强垃圾邮件倾向的词(比如free, Viagra等),或是较多采用强正常邮件倾向的词语。一般来说,采用后者较为困难,因为需要了解收件方公司的详细业务,而采用一些中性词(比如public等)对最后的结果有影响甚微。

6、不需要维护、下载、更新敏感词库,贝叶斯分类器是完全可以自循环的

它的缺点:

1、唯一的缺点是需要原始数据的进行学习/训练,或是需要运行一段时间才能看出效果。随着时间的推移,不同于其它静态技术,贝叶斯分类器会越来越有效,因此之前花一段时间等待是完全值得的,正如《基督山伯爵》结语,“人类最伟大的智慧,在于等待和希望”……

三、原型设计
初步写了个原型,想测试一下效果,(无接口、无抽象、单类、命名不规范、无注释,汗),详细过程不说了,有兴趣的可参考附件。
首先给出五个训练样本:

cf.train("Nobody owns the water", "good");
cf.train("the quick rabbit jumps fences", "good");
cf.train("buy pharmaceuticals now", "bad");
cf.train("make quick money at the online casino", "bad");
cf.train("the quick brown fox jumps", "good");

接下来,我们试一下“make quick money at the online casino“的效果
cf.prob("make quick money at the online casino", "good")
cf.prob("make quick money at the online casino", "bad")

输出结果分别是0.0013183593749999999和0.00625,这并没有显示出贝叶斯分词的优势,毕竟这段文本在以前出现过。如果我们将文本修改为“make quick money, visit XXX.htm“
cf.prob("make quick money, visit XXX.htm ", "good")
cf.prob("make quick money, visit XXX.htm ", "bad")

输出结果分别是0.005859375和0.0125。由于分类器从未见过visit、XXX.htm等词语,因此它也不是非常确定这是一条垃圾文本,如果我们通过人工审核将其加入训练库
cf.train("make quick money, visit XXX.htm ", "bad");

下一次,如果接收到文本“make quick money , visit YYY.htm, earn dollars“,分类器将会毫不犹豫地将它划分为垃圾邮件(good:4.1232638888888883E-4;bad:0.004199620627572015)。

前面提过的都是英文文本的识别。对于中文,则要考虑分词器的影响。这里选用MMAnalyzer,建议使用最大正向匹配方式(细粒度为零),因为“人民”和“人民币”是两个不同的概念。对“2008年前三季度,美国次贷危机升级,全球金融持续动荡,世界经济增长全面放缓,全球经济增长动力减弱,世界主要经济体与新兴市场正面临巨大的外部冲击。“ 的分词效果还是比较理想的。
2008] [年前] [三季度] [美国] [次] [贷] [危机] [升级] [全球] [金融] [持续] [动荡] [世界经济] [增长] [全面] [放] [缓] [全球] [经济] [增长] [动力] [减弱] [世界] [主要] [经济] [体] [新兴] [市场] [正] [面临] [巨大] [外部] [冲击]

我们采用生意经中的数据来模拟,锁定“机票“这一关键词

cf.train( " 网上预定了飞机票,请问具体付款流程的怎样的" , "good");
cf.train( "请问高手们,如何开办一家预定销售机票的公司?谢谢" , "good");
cf.train( "中国民航全国统一订票(销售)热线" , "bad");
cf.train( "杭州到上海机票预定热线是多少?" , "bad");
cf.train( "机票预定热线是多少?" , "bad");
cf.train( "特价机票预定方法有哪些?" , "good");
cf.train( "东方航空特价机票:400+6918118" , "bad");
cf.train( "携程机票预定中心:400.6888.932" , "bad");
cf.train( "机票销售代理" , "bad");

假设我们新接收一条文本“广州到青岛机票预定热线是多少?“,贝叶斯分类器将其判定为垃圾文本(bad:0.010416666666666666;good:0.0010363520408163264)

假设我们新接收一条文本“预定国内机票具体应该注意那些问题?“,贝叶斯分类器将其判定为正常文本(bad:0.003348214285714286;good:0.005181760204081632)

考虑大多数的情况下,可以原谅几篇广告文本绕过审核,却无法忍受一篇有效文本被过滤,因此特别维护一个thresholds的HashMap,比如当bad/good > 3时才判定,该文本为垃圾广告。比如“预定国内机票应该怎么做?”,贝叶斯分类器将其判定为unknown(未知)(bad:0.013392857142857144;good:0.012436224489795918),因为3 > bad/good > 1。运营人员在审核unknown的文本时,发觉这是一条正常文本,因此将其加入训练库
cf.train( "预定国内机票应该怎么做?" , "good");

下一次,再接收到类似文本比如“预定国内机票怎么操作?”,分类器将会自动将其归类为正常邮件(bad:0.006054687499999999;good:0.018951416015625)。

四、初步架构



五、展望
1、自然语义(主、谓、宾)的引入
2、将标题、内容、副标题、相关类目的文本内容作为权值引入
3、非文本因素的引入(id、ip、web行为)
4、论坛、博客、百科等词库共享

六、参考文献
1、《垃圾信息相关范例和情况》
2、《每日审核战报》
3、http://www.gfi.com/whitepapers/why-bayesian-filtering.pdf
4、《Programming Collective Intelligence,Building Smart Web 2.0》 Toby Segaran
5、《Collective Intelligence in Action》 Satnam Alag
6、http://nlp.stanford.edu/IR-book/html/htmledition/naive-bayes-text-classification-1.html
7、http://www.emis.de/journals/GM/vol14nr4/pop/pop.pdf
8、http://mathforum.org/~ken/bayes/bayes.html

  • 大小: 73.5 KB
2
1
分享到:
评论

相关推荐

    基于springboot+Javaweb的二手图书交易系统源码数据库文档.zip

    基于springboot+Javaweb的二手图书交易系统源码数据库文档.zip

    Linux课程设计.doc

    Linux课程设计.doc

    课程考试的概要介绍与分析

    课程考试资源描述 本资源是为应对各类课程考试而精心准备的综合性学习包。它包含了多门学科的考试指南、历年真题、模拟试题以及详细的答案解析。这些资源旨在帮助学生系统复习课程内容,理解考试要点,提高解题技巧,从而在考试中取得优异成绩。 资源中不仅包含了基础的考试资料,还特别加入了考试技巧讲解和备考策略分析。学生可以通过这些资源了解不同题型的解题方法和思路,学会如何在有限的时间内高效答题。此外,还有针对弱项科目和难点的专项训练,帮助学生攻克学习瓶颈。 为了确保资源的时效性和准确性,我们会定期更新考试资料和模拟试题,及时反映最新的考试动态和趋势。同时,也提供了在线交流平台,方便学生之间互相讨论、分享学习心得。 项目源码示例(简化版,Python) 以下是一个简单的Python脚本示例,用于生成包含选择题和答案的模拟试题: python import random # 定义选择题题库 questions = [ {"question": "Python的创始人是谁?", "options": ["A. 林纳斯·托瓦兹", "B. 巴纳姆", "C. 比尔·盖茨", "D.

    基于Django的食堂点餐系统

    基于 MySQL+Django 实现校园食堂点餐系统。 主要环境: PowerDesigner MySQL Workbench 8.0 CE Python 3.8 Django 3.2.8 BootStrap 3.3.7 Django-simpleui

    基于SpringBoot的同城宠物照看系统源码数据库文档.zip

    基于SpringBoot的同城宠物照看系统源码数据库文档.zip

    value_at_a_point.ipynb

    GEE训练教程

    基于springboot+Web的心理健康交流系统源码数据库文档.zip

    基于springboot+Web的心理健康交流系统源码数据库文档.zip

    kotlin 实践微信插件助手, 目前支持抢红包(支持微信最新版本 7.0.0及7.0.3).zip

    微信小程序 kotlin 实践微信插件助手, 目前支持抢红包(支持微信最新版本 7.0.0及7.0.3).zip

    N32G45X运放电路检测电压

    N32G45X运放电路检测电压

    梦幻西游道人20241121数据

    梦幻西游道人是梦幻西游里面的一个NPC,主要是刷全服最实惠的高级兽决和其他很好用的比较贵的东西,在长安城、傲来国、长寿村中的任意一个场景出现,一般会出现30分钟,不过东西一般都被秒刷。 梦幻西游道人出现时间解析如下: 1.梦幻西游道人出现时间一直都保持着一年出现两次的规律,即2、3月份的元宵节期间来一次,9月份的教师节期间出现一次。 2.云游道人每个整点(0:00至7:00不出现)会在长安城、傲来国、长寿村中的任意一个场景出现,每次出现后停留时间为30分钟。

    tables-3.7.0-cp38-cp38-win_amd64.whl

    tables-3.7.0-cp38-cp38-win_amd64.whl

    基于springboot旧物回收管理系统源码数据库文档.zip

    基于springboot旧物回收管理系统源码数据库文档.zip

    MariaDB集群部署手册word版最新版本

    MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。在存储引擎方面,使用XtraDB(英语:XtraDB)来代替MySQL的InnoDB。 本文档介绍了MariaDB 10.1的集群部署,至少三台机器做成集群,每台可以同时提供读和写,感兴趣的小伙伴们可以参考一下

    JavaScript语言教程:基础语法、DOM操作、事件处理及新特性详解

    内容概要:本文档全面介绍了JavaScript作为一种轻量级的、解释型的语言及其在前端开发中的广泛应用。从JavaScript的基本概念出发,详尽讲解了基础语法(如变量、数据类型、运算符、流程控制)、函数和闭包、对象和原型、DOM操作(如获取、修改、添加和删除元素)、事件处理(如事件监听器、事件对象)、AJAX与Fetch API、ES6+的新特性(如箭头函数、模板字符串、解构赋值)以及前端框架和库(React、Vue、Angular)。除此之外,文章还涉及了代码优化技巧(如减少DOM操作、选择适当的算法和数据结构、使用工具提升代码性能),并对JavaScript的应用场景和发展趋势进行了展望。 适用人群:适用于初学者或具有少量编程经验的学习者,旨在帮助他们系统掌握JavaScript基础知识和前沿技术。 使用场景及目标:通过本教程的学习,读者不仅可以学会基本语法,还能理解并掌握高级概念和技术,如DOM操纵、事件处理机制、异步编程及最新的ECMAScript规范。这不仅有助于改善用户体验、增强网站互动性和响应速度,也能有效提升自身的编码水平和项目开发能力。 其他说明:此文档不仅涵盖了JavaScript的传统功能,还有现代前端技术和最佳实践指导,确保读者能够紧跟行业发展步伐,成为合格甚至优秀的Web开发人员。

    毕业设计&课设_安卓公交线路查询 app(含架构技术、数据格式及数据库相关说明).zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过严格测试运行成功才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

    基于springboot高考志愿智能推荐系统源码数据库文档.zip

    基于springboot高考志愿智能推荐系统源码数据库文档.zip

    经典-FPGA时序约束教程

    经典-FPGA时序约束教程

    mcu交互实验整体文件

    mcu交互实验整体文件

    Collins COBUILD (CN).mdx

    Collins COBUILD (CN).mdx

    自定义springboot starter,提供HelloService

    自定义springboot starter

Global site tag (gtag.js) - Google Analytics