精华内容
下载资源
问答
  • 提出了适合煤矿企业自身特点的隐患排查治理信息管理系统,分析了我国煤矿企业隐患排查治理现状及存在的问题,介绍了煤矿企业隐患排查治理业务分析,详细阐述了煤矿企业隐患排查治理信息系统设计和功能模块设计。...
  • 企业安全风险分级管控与事故隐患排查治理管理信息化系统,按照国家安全风险分级管控与事故隐患排查治理实施指南,结合煤矿安全生产标准化的要求,帮助煤矿企业斩断了危险从源头(危险源)到末端(事故)的传递链条,...
  • 企业要建立和完善隐患排查治理自查自改自报系统每年第一季度更新企业信息每月底按时上报本月的隐患排查治理信息重大隐患应及时报送保证上报信息的完整性和准确性 四建立完善隐患排查治理信息系统 五开展全覆盖的
  • 通过分析大台煤矿隐患排查系统的隐患排查历史数据,结合事故致因理论进行分析可知,煤矿事故隐患主要分布于班组等一线工作单元,是造成煤矿事故频发的重要原因,有必要建立基于班组的煤矿事故隐患排查体系。而现阶段的...
  • 四川省隐患排查治理信息系统用户手册(企业端).doc
  • 融合工作流管理思想与技术,设计了适合煤矿企业安全生产隐患排查的管理信息平台,并且成功地在企业中得到了运用。实际应用表明,隐患排查管理的工作效率得到了较大的提高,隐患排查治理周期明显缩短。
  • 为了落实好“双重预防控制”工作,保证煤矿安全生产,通过研究煤矿企业在风险分级管控和隐患排查治理方面存在的问题,基于互联网+、云平台、智慧矿山、物联网、WebGIS等技术,研究设计了煤矿安全风险分级管控和事故隐患...
  • 为了更好地贯彻执行国家安监总局隐患排查治理工作,本系统还可实现隐患排查治理绩效评估功能。 互联网是个神奇的大网,大数据开发和软件定制也是一种模式,这里提供最详细的报价,如果你真的想做,可以来这里,这个...

    安全生产预警系统产品概述

    系统主要实现水泥企业安全生产状态的预警和预测等基本功能,同时也和企业的日常安全生产管理工作结合,实现一部分的管理功能。为了更好地贯彻执行国家安监总局隐患排查治理工作,本系统还可实现隐患排查治理绩效评估功能。

    互联网是个神奇的大网,大数据开发和软件定制也是一种模式,这里提供最详细的报价,如果你真的想做,可以来这里,这个手机的开始数字是一伍扒中间的是壹壹三三最后的是泗柒泗泗,按照顺序组合起来就可以找到,我想说的是,除非你想做或者了解这方面的内容,如果只是凑热闹的话,就不要来了。

    企业安全生产关系到国家的财产安全、人民生活利益,以及企业职工的幸福安康,是企业根本的效益所在。安全生产关系到企业的前途和命运,是企业生存和发展的基石,影响着企业本身的内外形象。在我国经济社会正处于高速发展的大好时期,生产安全管理显得尤为重要。

    预警是指在事故发生前进行预先警告,即对将来可能发生的危险进行事先的预报,提请相关当事人注意。

    安全生产预警系统主要由预警分析系统和预控对策系统两部分组成。其中预警分析系统主要包括监测系统、预警信息系统、预警评价指标体系系统、预测评价系统等组成。预警分析完成的主要功能是通过各种监测手段获得有关信息和运行数据,并对数据进行加工处理分析,通过适当的评价方法,对未来的趋势做出初步判断。当判断结果满足预警准则要求时,就触动报警系统,报警系统根据事先设定的报警级别发出事故报警。

    功能架构

    拓扑结构​

    安全生产预警系统部分界面效果图

    展开全文
  • 近期接了一个兼职,给客户开发个《消防安全隐患排查与验收系统》,初期评估这系统本身不是很难,但实质开发中也花费了将近2个月时间。 前端界面使用了 jqweui, 后端界面使用了 xadmin(基于layui) 后端技术使用...

    近期接了一个兼职,给客户开发个《消防安全隐患排查与验收系统》,初期评估这系统本身不是很难,但实质开发中也花费了将近2个月时间。

    前端界面使用了  jqweui, 后端界面使用了 xadmin(基于layui)

    后端技术使用: java 1.8,  mysql 5.7

    联系扣:312425336

    难点:

    开发过程中最难实现是表格导出到word文档,百度基本都是以XML方式实现,先创建好模板再使用记事本编辑填充占位符。

    但是我要导出表格,而且XML方式实现不太友好,有点麻烦。最终让我谷歌到国外的开源项目《docx-stamper https://github.com/thombergs/docx-stamper》实现,看了下官方例子直觉告诉我就是我要找的,但没中文文档。只能硬着头皮使用谷歌翻译看完,最终还是真让我实现了。感谢作者,致敬开源。

    功能包括:

    企业档案管理、

    检查标准管理、

    检查人员管理、

    检查报告管理

    为一体的消防检查管理系统,适合用于当前信息化检查模式,极大地提搞了检查人员工作效率。

    主要功能:

    1、数据批量导出、导入

    2、现场图片采集、隐患信息收集

    3、生成报告详情二维码,详细报告链接

    4、导出word文档整改告知书

      

     

    导出这个word文档是最困难的,主要是处理那个表格(当然本人水平有限)。文档没截图完整,下面还有二维码图片。

    展开全文
  • 为了建立煤矿维修作业现场隐患排查标准,基于JHA与FMEA分别对煤矿设备维修作业活动和维修作业中使用的工具和设备进行分析,得出系统全面的安全风险与危险源信息,并结合企业现有控制手段、法律法规、相关标准、企业成熟...
  • 安全安全隐患排查实施方案一根据区卫生局江卫通【20**】9号关于印发《江城区卫生系统安全隐患排查治理体系建设实施方案》的通知的精神,为全面推进农场医院安全隐患排查治理体系建设,结合我院安全生产实际,特制定...

    安全隐患排查在日常安全管理中发挥着重要作用,下面是学习啦小编为大家整理的安全安全隐患排查实施方案,供大家分享。

    安全安全隐患排查实施方案一

    根据区卫生局江卫通【20**】9号关于印发《江城区卫生系统安全隐患排查治理体系建设实施方案》的通知的精神,为全面推进农场医院安全隐患排查治理体系建设,结合我院安全生产实际,特制定本实施方案。

    一、指导思想

    深入贯彻科学发展观,坚持以人为本、安全发展的理念, 探索创新安全监管机制和手段,强化和落实安全生产主体责任,把握隐患治理、事故防范的主动权,打好安全隐患排查治理攻坚战,坚决遏制事故发生,建立安全生产长效机制。 隐患排查工作治理的原则:以完善安全监管责任机制和考核机制为抓手,以制定安全标准体系为支撑,以广泛开展安全教育培训为保障,强化和落实企业安全生产主体责任,切实保障职工生命安全和身体健康权益,为农场医院创造良好的安全生产环境。

    二、主要内容

    全面落实安全生产责任制,确保重大事故隐患、重大危险源得到整改、监控,严格执行各项安全生产法律法规和规章制度,不断完善安全生产应急救援体系。重点抓好以下安全隐患排查和专项整治:

    (一)安全生产责任制落实情况。加强领导,层层落实安全生产责任,形成主要领导全面抓落实,分管领导具体抓落实和“一岗双责”的工作格局,进一步强化对安全生产工作的组织领导,努力夯实安全生产基层基础,完善安全生产工作运行机制。

    (二)消防安全措施落实情况。严格执行消防安全有关规定,进一步做好消防安全工作,坚决消除重大火灾隐患。各单位要对火灾隐患进行全面排查,彻底查找安全漏洞和火灾风险隐患,加强对火源、电源、易燃易爆物品等的安全管理,切实做好办公楼、住院楼、家属宿舍区等人员密集场所的消防安全工作,重点抓好对人和物的管理,要保证安全疏散设施(安全出口、疏散楼梯、通道、疏散指示、应急照明)完好,配足配齐消防设备,消火栓及消防水带齐全有效。大力宣传消防安全知识,做好消防灭火及人员疏散演练,增强职工的安全用电用火常识和自防自救能力,坚决遏制重大火灾事故的发生。

    (三)对特种设备的安全监管情况。要加强对锅炉、压力容器、电梯、高低压变配电系统等各类特种设备和大型医疗设备的检查、检修,确保生产设施、设备时刻处于正常运转状态;本单位各类特种设备定期年检,加强安全管理人员、特种作业操作人员的培训工作,坚持持证上岗,严格操作规程。

    (四)重大危险源监控管理制度落实情况。要加强对毒、麻、精药品安全监管,加强对放射源、剧毒化学品、毒菌种及其他危险物品的安全管理,尤其是存放和使用剧毒化学品的单位要建立管理台帐,严格执行剧毒化学品必须用专用仓库储存或单独存放的规定。

    (五)各项安全制度制定和执行情况。安全责任是否明确,执行是否认真;水、电、气、热等后勤保障系统的安全运行及维修、保养情况;财务部门、收费处、计算机房、病房、集体宿舍等要害部位人防、物防、技防等安全防范设施的落实和管理情况。

    (六)建筑安全监管情况。各单位要严格执行新建、改建、扩建工程项目实行安全“三同时”的规定;强化施工现场消防安全责任制、用火用电、危险作业等安全管理措施;加强在建项目的监管力度,加强对施工现场的安全监管;存在的建筑安全隐患,能彻底改造的要彻底改造,一时不能改造的要实施必要的加固处理,并严格建筑安全监控措施。

    (七)交通安全监管情况。坚持以人为本,加�咳嗽焙统盗景踩芾砉ぷ鳎惺翟銮吭鹑我馐丁⒂腔家馐丁⒎婪兑馐逗桶踩馐丁H婕觳槌盗景踩迹忧咳粘Nぃ峋龆啪盗敬∩下贰6约菔蝗私芯P缘拿娑悦姘踩逃偈蛊渥跃踝袷氐缆方煌ǚü妫峋龆啪フ录菔弧⒊�

    速行驶、疲劳驾驶、酒后驾驶、无证驾驶等严重交通违法行为,遏制各种交通事故的发生。

    (八)行业安全监管情况。加强防范重大食物中毒等公共卫生突发事件的发生;对传染病、食物中毒等突发公共卫生事件实行网络直报,适时监控;提高对突发公共卫生事件的预警、监测、调查及处置能力。

    三、工作步骤

    (一)摸底调查阶段(20**年6月至年底)。

    各科室完成安全隐患排查治理体系建设的宣传发动、标准规范制定、明晰监管责任和摸底调查工作。

    (二)建设阶段(20**年)。

    完善工作制度和标准,建立分级分层次的安全隐患排查治理体系。

    (三)巩固提高阶段(20**年)。

    开展隐患排查治理体系建设情况检查,进一步完善体系工作制度、标准和使用管理办法,在全系统基本建立适用的安全隐患排查治理体系。

    四、工作要求

    (一)周密部署,稳步推进,统一部署。研究制定安全隐患排查治理体系建设方案,集中力量开展工作。按照“自下而上、循序渐进、突出重点、以点带面”的原则,从基层抓起,逐级扩大联网,扩大覆盖面,最终形成全场内健全完

    善的安全隐患排查治理体系。

    (二)突出重点,典型示范。加强对辖区内重点进行业务指导,在系统建设、安全隐患排查标准制定、监管责任落实、监管方法创新、考核机制完善、技术资金安排等方面给予重点支持,确保安全隐患排查治理体系建设取得实效。

    (三)完善标准,强化培训。结合推进安全生产标准化工作,组织安全生产领导小组梳理完善行业安全隐患排查治理标准,为建立安全隐患排查治理体系提供技术标准支持。进一步建立完善隐患排查、登记、检测监控、整改、上报、统计、检查和考核等制度。组织开展多形式、多渠道、多层面的安全隐患排查治理体系建设系列培训,重点对安全隐患自查自报管理方法、安全隐患排查标准等进行全面培训。要加强培训检查督导工作,保证各项工作的顺利推进。

    (四)加大投入,强化考核。完善激励约束机制,对没有按要求完成安全隐患排查治理体系建设工作的科室和个人,实行一票否决。将安全隐患排查治理体系建设与评先选优、奖惩考核、事故处理等有机结合起来。对不履行安全监管职责的相关部门和人员严肃追究责任。将开展安全隐患排查治理体系建设工作情况作为对农场医院年度安全生产目标责任考核的重要内容。

    (五)加强领导,落实责任。切实加强安全隐患排查治理体系建设工作的组织领导,成立了医院安全隐患排查治理体

    系建设工作领导小组:

    组长:范XX

    成员:陈XX 张XX 敖XX 关XX 杨XX 谢XX 黄Xx 刘XX 蔡Xx 关XX 郭XX

    领导小组下设办公室,关XX同志兼任办公室主任,负责医院安全隐患排查的组织、协调等工作。

    安全安全隐患排查实施方案二

    安全,是近来悬在所有人心中的警钟,进入夏季以来,各种各样的安全事故的发生时刻在提醒着我们:安全,不是一时、一日、一月、一年的问题,它没有时间地域的限制,理所应该成为一种长效机制。为贯彻落实卫生局7月15日安全工作会议关于安全隐患排查的工作要求,确保隐患排查治理工作顺利进行,特制定本实施方案:

    一、指导思想

    认真贯彻落实卫生局文件要求,结合本院实际,及时、全面、有效开展安全生产隐患排查治理专项行动,强化安全生产基础,提高安全管理水平,为实现2012年度“安全生产年”及“平安医院创建”工作目标提供有力保障,为我县医疗卫生事业又好又快发展营造安全稳定的环境。

    二、工作目标

    及时、全面开展隐患排查治理专项行动,全面、深入排查各类事故隐患,建立落实安全事故隐患治理责任制,确保重大安全隐患整改率100%,及时有效地整改事故隐患,确保不发生安全生产事故。推动安全生产责任制和责任追究制的落实,完善安全生产规章制度,建立健全隐患排查治理及重大危险源监控的长效机制,强化安全生产基础,提高安全生产管理水平,增强防监控能力,有效防范和遏制重特大事故的发生,为实现安全生产状况明显好转奠定坚实的基础。健全完善公共卫生突发事件和重特大事故救治应急预案,确保及时有效实施医疗急救。

    三、组织领导

    为保障安全隐患排查工作有序、规范完成,我院领导高度重视,经院委会

    研究决定,成立以院长xxx同志为组长的安全隐患排查工作领导小组:

    组长:院长xxx

    副组长:副院长xxx

    组员:主管安全生产的xxx同志、主管医疗安全的xxx同志、主管院感的xxx同志以及办公室主任xxx同志。

    四、排查治理内容

    安全生产法律法规、规章制度、规程标准的贯彻执行情况;安全生产责任制建立及落实情况;安全生产重要设施装备和关键设备、装置的完好状况及日常管理维护、保养情况,安全防护用品的配备和使用情况;危险性较大的特种设备和毒麻限制药品的贮存、领用,安全管理及使用情况;消防设施完好率情况;内部安全保卫人防、物防、技防状况;事故报告、处理及对有关责任人的责任追究情况;安全基础工作及教育培训情况,特别是从业人员的持证上岗等情况;应急预案制定、演练和应急救援物资、设备配备及维护情况。

    排查工作要突出重点科室如药房、财务、食堂,重点设施如危房、水、电、压力容器,另外还应该注意网络安全,结合本院的实际,确定排查治理的主要内容及重要时段排查治理重点,有针对性地开展隐患排查与治理工作。

    五、排查治理方式。

    隐患排查治理工作要做到“四个结合”:

    1、排查治理与专项整治相结合。坚持把隐患排查治理工作与本院安全生产工作特点结合起来,突出重点,狠抓薄弱环节,解决影响安全生产的突出矛盾和问题。

    2、排查治理与落实责任相结合。要认真落实责任,切实把责任落到实处。

    3、排查治理与基础建设相结合。要大力探索推进安全生产标准化和规范化建设,与隐患排查治理工作相互补充,相互促进,推进隐患排查治理的全面

    化、经常化、制度化。

    4、排查治理与加强应急管理相结合。要在排查治理工作过程中进一步贯彻落实《中华人民共和国突发事件应对法》,建立健全应急管理制度,完善应急预案体系。

    六、工作措施

    1、全面实施排查,及时整改隐患。全面开展隐患排查,及时整改隐患,切实落实措施,防范事故发生。

    2、建立信息报送制度,及时统计报告。将隐患排查情况及时统计上报。

    3、总结提高,完善制度,构建长效机制。要边排查治理,边总结经验,完善规章制度,提高隐患排查工作的科学性、系统性、有效性,构建长效机制。

    六、工作阶段

    按照卫生局的统一部署,结合本院的实际,安全生产排查治理工作分三个阶段:

    (一)动员部署阶段(7月29日前)

    1、成立安全生产隐患排查治理工作领导小组。

    2、结合实际,制订排查治理方案,明确责任,落实人员,完成工作部署。

    (二)排查治理阶段(20*-*年7月至12月)

    依照本方案及有关法律法规的要求,对本单位进行全面隐患排查治理。坚持边查边改,能立即整改的,要及时予以整改;一时难以整改的,要列出计划限期整改,做到责任、措施、资金、时间、预案五落实,严防各类安全生产事故的发生。

    七、工作要求

    (一)加强领导,切实落实责任。要根据本方案要求,明确分管领导,成立相应组织,迅速作出工作部署,及时开展隐患排查治理,要为隐患排查治理

    工作提供必要的人力、资金和技术保障。一定要把工作做深做细,不留盲区,不留死角。凡是由于排查工作不认真而疏漏安全隐患的,要严肃追究有关人员的责任。

    (二)突出重点,狠抓落实。按照排查治理范围内容要求,结合实际,突出工作重点,抓好本院疏散通道、电气线路、毒麻限制药品、放射源的安全排查,经常了解工作进展情况,发现并及时解决隐患治理工作中的难点,积极做好防范工作。

    (三)加强宣传,广泛发动群众。要充分利用宣传栏、墙报、标语、横幅等形式,加大对隐患排查治理工作的宣传力度,以“治理隐患、防范事故”为主题,组织开展好“安全生产月”活动。要深刻认识开展安全生产“隐患治理年”的重要性、必要性和紧迫性,增强做好隐患排查工作的主动性和自觉性,落实主体责任。

    安全安全隐患排查实施方案三

    根据坚持“安全发展”的指导原则和“安全第一、预防为主、综合治理的方针”强化工程施工安全,确保消除事故隐患安全隐患本项目部特制定安全隐患排查治理实施方案:

    一、安全隐患排查治理领导小组:

    组长:

    副组长:

    成员:

    二、时间安排:

    1、学习部署阶段

    自2011年8月5日至8月7日开始进行学习部署。组织各班组负责人,工人(包括力工和其他勤杂人员)学习上级文件,规范,规章制度和安全操作规程等相关文件,确定检查时间和任务。

    2、安全隐患排查治理。

    自2011年8月8日至8月30日项目部和各班组组织进行隐患排查。排查方式主要采取自查互查。在排查的基础上,组织制定隐患治理措施,和制定整改方案,限期整改,并组织具体落实实施。

    3、总结。

    自2011年9月3日至10月15日项目部组织跟踪验证,并对活动情况进行总结。

    三、排查重点内容:

    1、模板支护;

    2、脚手架搭设;

    3、机械设备设施;

    4、“四口”、“五临边”、外电线路等重点部位;

    5、高处作业、临时用电等施工环节;

    6、特种作业人员持证上岗是否符合规定;

    7、项目经理、专职安全员、技术负责人等关键管理人员职责履行情况;

    8、施工组织设计,安全专项施工方案编制,审批是否符合要求,具有针对性及实施情况;

    9、防火措施及落实情况;

    10、生活设施安全状况;

    11、安全防护用品发放及使用情况;

    四、宣传工作。

    施工现场悬挂标语、张贴宣传画、办好墙壁报。

    猜你喜欢:

    展开全文
  • 基于文本挖掘的企业隐患排查质量分析模型 1.1 赛题背景 企业自主填报安全生产隐患,对于将风险消除在事故萌芽阶段具有重要意义。企业在填报隐患时,往往存在不认真填报的情况,“虚报、假报”隐患内容,增大了企业...

    1、比赛说明

    基于文本挖掘的企业隐患排查质量分析模型

    在这里插入图片描述

    1.1 赛题背景

    企业自主填报安全生产隐患,对于将风险消除在事故萌芽阶段具有重要意义。企业在填报隐患时,往往存在不认真填报的情况,“虚报、假报”隐患内容,增大了企业监管的难度。采用大数据手段分析隐患内容,找出不切实履行主体责任的企业,向监管部门进行推送,实现精准执法,能够提高监管手段的有效性,增强企业安全责任意识。

    1.2 赛题任务

    本赛题提供企业填报隐患数据,参赛选手需通过智能化手段识别其中是否存在“虚报、假报”的情况。

    1.3 赛题数据

    训练集:
    在这里插入图片描述

    测试集:
    在这里插入图片描述

    数据说明:

    训练集数据包含“【id、level_1(一级标准)、level_2(二级标准)、level_3(三级标准)、level_4(四级标准)、content(隐患内容)和label(标签)】”共7个字段。

    其中“id”为主键,无业务意义;“一级标准、二级标准、三级标准、四级标准”为《深圳市安全隐患自查和巡查基本指引(2016年修订版)》规定的排查指引,一级标准对应不同隐患类型,二至四级标准是对一级标准的细化,企业自主上报隐患时,根据不同类型隐患的四级标准开展隐患自查工作;“隐患内容”为企业上报的具体隐患;“标签”标识的是该条隐患的合格性,“1”表示隐患填报不合格,“0”表示隐患填报合格。

    预测结果文件:

    在这里插入图片描述

    1.4 评测标准

    在这里插入图片描述

    2、数据探索

    2.1 读取数据

    train = pd.read_csv('./data/train.csv')
    test = pd.read_csv('./data/test.csv')
    

    2.2 数据统计

    train.shape
    # (12000, 7)
    test.shape
    # (18000, 6)
    
    train.label.value_counts()
    # 0    10712
    # 1     1288
    train.label.mean()
    # 0.10733333333333334    # 正样本占比10.7%
    

    2.3 字段信息

    train.info()
    

    在这里插入图片描述

    test.info()
    

    在这里插入图片描述

    content字段存在缺失值,填充空值:

    train['content'].fillna('', inplace=True)
    test['content'].fillna('', inplace=True)
    

    2.4 字段探索

    合并训练集和测试集,进行字段探索:

    train['type'] = 'train'
    test['type'] = 'test'
    df = pd.concat([train, test])
    

    (1)level

    • 字段取值
    df.groupby('type')[['level_1', 'level_2', 'level_3', 'level_4']].nunique()
    

    在这里插入图片描述

    可见,测试集中存在训练集中未见的标准,只考虑训练集中的标准会造成模型泛化能力不好。

    • 样本数量

    level_1:

    df_cnt = df.groupby(['type','level_1'])['content'].count().reset_index()
    df_pvt = pd.pivot_table(df_cnt, index='level_1', columns='type', values='content').sort_values(by='train', ascending=False)
    df_pvt
    

    在这里插入图片描述

    测试集中存在两个训练集中未见的一级标准。

    level_2:

    df_cnt = df.groupby(['type','level_2'])['content'].count().reset_index()
    df_pvt = pd.pivot_table(df_cnt, index='level_2', columns='type', values='content').sort_values(by='train', ascending=False)
    df_pvt.head(10).append(df_pvt.tail(10))
    

    在这里插入图片描述

    print('测试集多于训练集的标准:{}个'.format((df_pvt.train.isnull()&df_pvt.test.notnull()).sum()))
    # 测试集多于训练集的标准:16个
    

    level_3:

    df_cnt = df.groupby(['type','level_3'])['content'].count().reset_index()
    df_pvt = pd.pivot_table(df_cnt, index='level_3', columns='type', values='content').sort_values(by='train', ascending=False)
    df_pvt.head(5).append(df_pvt.tail(5))
    

    在这里插入图片描述

    print('测试集多于训练集的标准:{}个'.format((df_pvt.train.isnull()&df_pvt.test.notnull()).sum()))
    # 测试集多于训练集的标准:32个
    

    level_4:

    df_cnt = df.groupby(['type','level_4'])['content'].count().reset_index()
    df_pvt = pd.pivot_table(df_cnt, index='level_4', columns='type', values='content').sort_values(by='train', ascending=False)
    df_pvt.head(5).append(df_pvt.tail(5))
    

    在这里插入图片描述

    print('测试集多于训练集的标准:{}个'.format((df_pvt.train.isnull()&df_pvt.test.notnull()).sum()))
    # 测试集多于训练集的标准:109个
    

    如上可知:level字段中,测试集存在大量训练集未见的标准,level字段参与文本训练不见得是好事。

    (2)content

    df['content_len'] = df.content.str.len()
    df.groupby('type')['content_len'].max()
    # test     394
    # train    151
    
    df.groupby('type')['content_len'].min()
    # test     0
    # train    0
    
    # 绘制训练集和测试集的content长度分布图
    plt.figure(figsize=(8, 6))
    sns.kdeplot(df[df.type == 'train'].content_len, label='train_content_len')
    sns.kdeplot(df[df.type == 'test'].content_len, label='test_content_len')
    

    在这里插入图片描述

    如图所示,训练集和测试集的content长度分布一致。

    从上面的 head() 就很明显地看出,正样本基本上都是文本比较短的,我们可以用文本字符串长度来确认。

    train['content_strlen'] = train['content'].astype(str).apply(len)
    train[train['content_strlen']<=3]['label'].mean()
    # 0.8769968051118211
    

    可以看出,content长度小于等于3的数据正样本率高达 87.7%,当然也很容易理解,上报隐患时填写的文本太短,说明填写比较随意,基本是不符合监管要求的。

    另外,在数据探索中也会发现部分样本的标签存在模棱两可的情况,比如content的内容基本一致,但是标签不一致,不过这种情况很难处理,就先不作考虑了,当做噪声吧。

    根据以上分析,分类任务主要以content为核心构造变量,主要包括两个思路:

    • 基于数据分析和探索,构造统计类特征

    • 对长文本使用bert进行分类,构造子模型分,进入最终的LGB模型;

    3、统计类特征

    首先,对content和level_4两个字段进行预处理,只保留文本,剔除无用的符号和数字:

    df["content"] = df["content"].astype(str)
    regex = re.compile(u"[\u4e00-\u9fa5]+")
    df["level4_nosign"] = df["level_4"].apply(lambda x: ''.join(regex.findall(x)))
    df["content_nosign"] = df["content"].apply(lambda x: ''.join(regex.findall(x)))
    df.head()
    

    在这里插入图片描述

    3.1 level和content的相关类特征

    3.1.1 最长公共子序列

    • 计算content文本是否包含于level_4

    • content与level_4最长公共子序列

    • content、level_4与子序列的长度、差值、比值

    def getMaxSame(a, b):
        # 获得a,b字符串最大相同子序列
        if len(a)<=len(b):
            s1, s2 = a, b
        else:
            s1, s2 = b, a
        maxlen = 0
        maxstr = ""
        for i in range(len(a)):
            for j in range(len(a), i-1, -1):
                if s1[i:j] in s2 and len(s1[i:j]) > maxlen:
                    maxlen = len(s1[i:j])
                    maxstr = s1[i:j]
        return maxstr
    
    # content是否包含于level_4
    df["content_in_level4"] = df.apply(lambda x: int(x.content_nosign in x.level4_nosign), axis=1)
    # content与level4最长相同子字符串
    df["content_level4_substr"] = df.apply(lambda x: getMaxSame(x.content_nosign, x.level4_nosign), axis=1)
    # content与level4最长相同子字符串长度
    df["content_level4_sublen"] = df["content_level4_substr"].str.len()
    df["level4_strlen"] = df.level4_nosign.apply(len)
    df["content_strlen"] = df.content_nosign.apply(len)
    df['level4_content_sub'] = df['level4_strlen'] - df['content_strlen']
    df['level4_content_div'] = df['level4_strlen'] / df['content_strlen']
    df["substr_level4_div"] = df["content_level4_sublen"] / df["level4_strlen"]
    df["substr_content_div"] = df["content_level4_sublen"] / df["content_strlen"]
    

    3.1.2 子句

    level_4和content的子句长度及差值。

    # level_4和content的分句长度比较
    def get_len(x):
        x_split = re.split("[,,;;.。]", x)
        x_split = [i for i in x_split if len(i)>2]
        return len(x_split)
    
    df['level4_sent_num'] = df.level_4.apply(lambda x: get_len(x))
    df['content_sent_num'] = df.content.apply(lambda x: get_len(x))
    df['level4_content_sent_sub'] = df['level4_sent_num'] - df['content_sent_num']
    

    3.1.3 分词

    基于jieba分词,计算三个特征:相同词的个数,不同词的个数,相同词占level_4和content的比值、Jaccard相似度。

    df['level4_nosign_jieba'] = df['level4_nosign'].apply(lambda x: set(jieba.cut(x)))
    df['content_nosign_jieba'] = df['content_nosign'].apply(lambda x: set(jieba.cut(x)))
    df['same_word'] = df.apply(lambda x: len(x.level4_nosign_jieba&x.content_nosign_jieba), axis=1)
    df['different_word'] = df.apply(lambda x: len(x.content_nosign_jieba-x.level4_nosign_jieba), axis=1)
    df['same_word_level4'] = df.apply(lambda x: x.same_word/len(x.level4_nosign_jieba), axis=1)
    df['same_word_content'] = df.apply(lambda x: x.same_word/len(x.content_nosign_jieba) 
                                       if len(x.content_nosign_jieba)>0 else 0, axis=1)
    df['jaccard'] = df.apply(lambda x: x.same_word/len(x.level4_nosign_jieba|x.content_nosign_jieba), axis=1)
    

    3.2 content类特征

    3.2.1 关键词特征

    对content分词,统计关键词的索引和出现次数

    word_lst, label_lst = [], []
    df['jieba'] = df.apply(lambda x: [i for i,j in list(pseg.cut(x.content)) if i not in x.content_level4_substr and j in ["v", "d", "a"]], axis=1)
    for i, j in df[df.label.notna()][['jieba', 'label']].values:
        word_lst.extend(i)
        label_lst.extend(len(i)*[j])
    df_word = pd.DataFrame({"word": word_lst, "label": label_lst})
    word_label1_30 = list(df_word.loc[df_word.label==1, "word"].value_counts().sort_values(ascending=False)[:30].index)
    word_label0_100 = set(df_word.word.value_counts().sort_values(ascending=False)[:130].index)-set(ci_label1_30)
    
    def getIndex(a, b):
        # 输出a在b中的索引,若a不在b中,则返回-1
        if a in b:
            return b.index(a)
        else:
            return -1
    
    for i, word in enumerate(word_label1_30):
        df['word_'+str(i)] = df.content.apply(lambda x: getIndex(word, x))  # 前30多的词,出现在当前content的索引
    df["word_label0_100"] = df.jieba.apply(lambda x: len(set(x)&word_label0_100))  # 前100正样本特有的词,出现在当前content几次
    

    3.2.2 TextRank特征

    使用TextRank算法对正负样本的content分别提取关键词,并基于关键词衍生特征:

    def get_word_weight(text, nums=100, window=2, speech_tags=['a', 'd', 't', 'v', 'l']):
        """使用textrank获取分词的权重"""
        # 创建分词类的实例
        tr4w = TextRank4Keyword(allow_speech_tags=speech_tags)
        # 对文本进行分析,设定窗口大小为2,并将英文单词小写
        tr4w.analyze(text=text, lower=True, window=window)
    
        # 从关键词列表中获取前20个关键词
        word_lst = []
        weight_lst = []
        for item in tr4w.get_keywords(num=nums, word_min_len=1):
            # 打印每个关键词的内容及关键词的权重
            word_lst.append(item.word)
            weight_lst.append(item.weight)
        word_weight = pd.DataFrame({'word': word_lst, 'weight': weight_lst})
        return word_weight
    
    def get_key_word_num(content, words):
        """获取关键词的命中数量"""
        word_sum = 0
        for word in words:
            if word in content:
                word_sum += 1
        return word_sum
        
    text0 = ' '.join(df[df.label==0].content.values)
    text1 = ' '.join(df[df.label==1].content.values)
    df_content_0 = get_word_weight(text0, nums=100, window=6)
    df_content_1 = get_word_weight(text1, nums=100, window=6)
    df_content_0.columns = ['word', 'weight_0']
    df_content_1.columns = ['word', 'weight_1']
    df_content_0_wd = pd.merge(df_content_0, df_content_1, on='word', how='left')
    content_0_wd = df_content_0_wd[df_content_0_wd.weight_1.isna()]['word'].values
    df_content_1_wd = pd.merge(df_content_1, df_content_0, on='word', how='left')
    content_1_wd = df_content_1_wd[df_content_1_wd.weight_0.isna()]['word'].values
    df['content_0_cnt'] = df.content.apply(lambda x: get_key_word_num(x, content_0_wd))
    df['content_1_cnt'] = df.content.apply(lambda x: get_key_word_num(x, content_1_wd))
    
    df_wd_1 = pd.DataFrame()
    for i, word in enumerate(content_1_wd):
        df_wd_1['prwd1_' + str(i)] = df.content.apply(lambda x: int(word in x))
    
    df_wd_0 = pd.DataFrame()
    for i, word in enumerate(content_0_wd):
        df_wd_0['prwd0_' + str(i)] = df.content.apply(lambda x: int(word in x))
    
    ## 特征筛选
    # 方法一:编码后降维
    pca = PCA(n_components=0.8)
    pca.fit(df_wd_1)
    wd1_pca = pca.transform(df_wd_1)
    
    for i in range(wd1_pca.shape[1]):
        df[f'content_pr1_{i}'] = wd1_pca[:, i]
    
    pca = PCA(n_components=0.8)
    pca.fit(df_wd_0)
    wd0_pca = pca.transform(df_wd_0)
    
    for i in range(wd0_pca.shape[1]):
        df[f'content_pr0_{i}'] = wd0_pca[:, i]
    
    # 方法二:选择IV大于0.02的分词,降维后进入模型
    # df_wd_1['label'] = df.label
    # df_wd_0['label'] = df.label
    # df_wd1_iv = toad.quality(df_wd_1, target='label')
    # df_wd1_iv_sel = df_wd1_iv[df_wd1_iv.iv > 0.02].index.values
    # df_wd0_iv = toad.quality(df_wd_0, target='label')
    # df_wd0_iv_sel = df_wd0_iv[df_wd0_iv.iv > 0.02].index.values
    
    # pca = PCA(n_components=0.95)
    # pca.fit(df_wd_1[df_wd1_iv_sel])
    # wd1_pca = pca.transform(df_wd_1[df_wd1_iv_sel])
    
    # for i in range(wd1_pca.shape[1]):
    #     df[f'content_pr1_{i}'] = wd1_pca[:, i]
    
    # pca = PCA(n_components=0.8)
    # pca.fit(df_wd_0[df_wd0_iv_sel])
    # wd0_pca = pca.transform(df_wd_0[df_wd0_iv_sel])
    
    # for i in range(wd0_pca.shape[1]):
    #     df[f'content_pr0_{i}'] = wd0_pca[:, i]
    

    附录查看TextRank原理。

    3.2.3 TF-IDF特征

    content分词后计算tf-idf,由于维度较高,这里进行降维处理:

    df['content_nosign_seg'] = df['content_nosign'].apply(lambda x: " ".join(jieba.cut(x)))
    df['content_word_cnt'] = df['content_nosign_seg'].apply(lambda x: len(x.split(" ")))
    
    n_components = 16
    X = list(df['content_nosign_seg'].values)
    tfv = TfidfVectorizer(ngram_range=(1,1), 
                          token_pattern=r"(?u)\b[^ ]+\b",
                          max_features=10000)
    tfv.fit(X)
    X_tfidf = tfv.transform(X)
    svd = TruncatedSVD(n_components=n_components)
    svd.fit(X_tfidf)
    X_svd = svd.transform(X_tfidf)
    
    for i in range(n_components):
        df[f'content_tfidf_{i}'] = X_svd[:, i]
    

    3.3 level类特征

    3.3.1 badrate编码

    经统计发现,不同level的badrate存在差异,因此对不同level作badrate编码。

    # 不同标准的badrate值
    for col in ['level_1', 'level_2', 'level_3']:
        risk_ratio = dict(df[df.label.notna()].groupby(col)['label'].mean())
        df[f'{col}_risk_score'] = df[col].map(risk_ratio)
    

    3.3.1 类别编码

    类别变量编码为数值变量。

    for col in ['level_1', 'level_2', 'level_3', 'level_4']:
        df[f'{col}_strlen'] = df[col].astype(str).apply(len)
        lbl = LabelEncoder()
        lbl.fit(df[col])
        df[col] = lbl.transform(df[col])
    

    最终,得到的统计类数据集如下:

    drop_cols = ['content', 'content_nosign', 'level4_nosign', 'content_level4_substr', 'level4_nosign_jieba', 'content_nosign_jieba', 'jieba', 'content_nosign_seg']
    df.drop(drop_cols, axis=1, inplace=True)
    train = df[df['label'].notna()]
    test = df[df['label'].isna()]
    print(train.shape, test.shape)
    # (12000, 79) (18000, 79)
    train.head()
    

    在这里插入图片描述

    4、bert子模型分

    4.1 sentence classification score

    使用单个文本fine-tuning分类模型。

    # bert prob
    train_bert_pred = pd.read_csv('./data/roberta_pred_oof2.csv')
    test_bert_pred = pd.read_csv('./data/roberta_pred_test2.csv')
    
    train = pd.merge(train, train_bert_pred, on='id')
    test = pd.merge(test, test_bert_pred, on='id')
    

    4.2 sentence pair classification score

    使用sentence pair fine-tuning分类模型。

    # sbert
    train_sbert_pred = pd.read_csv('./data/roberta2_pred_oof.csv')
    test_sbert_pred = pd.read_csv('./data/roberta2_pred_test.csv')
    
    train = pd.merge(train, train_sbert_pred, on='id')
    test = pd.merge(test, test_sbert_pred, on='id')
    

    4.3 双塔sbert模型提取文本语义

    直接使用预训练模型,未做fine-tuning。

    # 直接用预训练模型encode,计算文本相似度
    df_tr_sim = pd.read_csv('./data/train_sim.csv')
    df_ts_sim = pd.read_csv('./data/test_sim.csv')
    
    train = pd.concat([train, df_tr_sim], axis=1)
    test = pd.concat([test, df_ts_sim], axis=1)
    

    数据处理完成,接下来,第二篇介绍用bert训练模型得到子模型分的过程。

    数据和代码参见sodic_enterprise_hidden_dangers


    附录:

    1、TextRank原理

    TextRank算法是由PageRank算法改进而来的,二者的思想有相同之处,区别在于:PageRank算法根据网页之间的链接关系构造网络,而TextRank算法根据词之间的共现关系构造网络;PageRank算法构造的网络中的边是有向无权边,而TextRank算法构造的网络中的边是无向有权边。TextRank算法的核心公式如下:
    W S ( V i ) = ( 1 − d ) + d ∗ ∑ V j ∈ I n ( V i ) w j i ∑ V k ∈ O u t ( V j ) w j k W S ( V j ) WS(V_i)=(1-d)+d*\sum_{V_j \in In(V_i)}{{w_{ji}}\over{\sum_{V_k \in Out(V_j)}w_{jk}}}WS(V_j) WS(Vi)=(1d)+dVjIn(Vi)VkOut(Vj)wjkwjiWS(Vj)
    其中, w j i w_{ji} wji表示两个节点之间的边连接具有不同的重要程度, I n ( V i ) In(V_i) In(Vi)表示节点i的邻域, O u t ( V j ) Out(V_j) Out(Vj)表示节点j的邻域, W S ( V j ) WS(V_j) WS(Vj)表示节点j的TextRank值,d为阻尼系数,即按照超链接进行浏览的概率,一般取经验值为0.85,1-d表示浏览者随机跳转到一个新网页的概率。

    为了便于理解,给出使用TextRank算法提取关键词的具体步骤如下:

    1)将给定的文本按照整句进行分割,即 T = [ S 1 , S 2 , . . . , S m ] T=[S_1,S_2,...,S_m] T=[S1,S2,...,Sm]

    2)对于每个句子 S i ∈ T S_i\in T SiT,对其进行分词和词性标注,然后剔除停用词,只保留指定词性的词,如名词、动词、形容词等,即 S i = [ t i , 1 , t i , 2 , . . . , t i , n ] S_i=[t_{i,1},t_{i,2},...,t_{i,n}] Si=[ti,1,ti,2,...,ti,n],其中 t i , j t_{i,j} ti,j为句子i中保留下的词;

    3)构建词图 G = ( V , E ) G=(V,E) G=(V,E),其中V为节点集合,由以上步骤生成的词组成,然后采用共现关系构造任意两个节点之间的边:两个节点之间存在边仅当它们对应的词在长度为K的窗口中共现,K表示窗口大小,即最多共现K个单词,一般K取2;

    4)根据上面的公式,迭代计算各节点的权重,直至收敛;

    5)对节点的权重进行倒序排序,从中得到最重要的t个单词,作为top-t关键词;

    6)对于得到的top-t关键词,在原始文本中进行标记,若它们之间形成了相邻词组,则作为关键词组提取出来。

    2、TextRank实现

    textrank4zh模块是针对中文文本的TextRank算法的python算法实现,该模块的地址为:TextRank4ZH

    结合原理部分,TextRank算法主要包括三部分:分词、构建邻接矩阵、计算PageRank值,下面结合源码来看下具体实现:

    (1)分词

    使用jieba进行分词,可配置用于过滤的词性列表和停用词表。

    # -*-coding:utf-8-*-
     
    # 把新版本的特性引入当前版本
    from __future__ import (absolute_import, division, print_function, unicode_literals)
    # 导入结巴分词的词性标注组件
    import jieba.posseg as pseg
    # 导入编码转换模块
    import codecs
    # 导入操作系统模块
    import os
    # 导入工具包组件
    from textrank4zh import util
     
     
    # 获取停用词文件的路径
    def get_default_stop_words_file():
    	# 获取当前脚本所在的路径
    	d = os.path.dirname(os.path.realpath(__file__))
    	# 返回停用词表所在路径,os.path.join方法用于将多个路径组合后返回
    	return os.path.join(d, 'stopwords.txt')
     
     
    """分词类"""
     
     
    class WordSegmentation(object):
     
    	"""初始化函数,获取词性列表和停用词表"""
    	def __init__(self, stop_words_file=None, allow_speech_tags=util.allow_speech_tags):
    		"""
    		:param stop_words_file:保存停用词表的文件路径,使用utf-8编码方式,每行存放一个停用词,若不是str类型,则使用默认的停用词
    		:param allow_speech_tags:默认的词性列表,用于过滤某些词性的词
    		:return:无
    		"""
    		# 词性列表
    		allow_speech_tags = [util.as_text(item) for item in allow_speech_tags]
    		# 将词性列表设置为默认的词性列表
    		self.default_speech_tags_filter = allow_speech_tags
     
    		# 使用set方法创建空集合
    		self.stop_words = set()
    		# 获取停用词文件的路径
    		self.stop_words_file = get_default_stop_words_file()
    		# 若停用词文件路径不是str类型,则使用默认的停用词
    		if type(stop_words_file is str):
    			self.stop_words_file = stop_words_file
    		# 打开并读取停用词文件,将其中的停用词加入停用词集合
    		for word in codecs.open(self.stop_words_file, 'r', 'utf-8', 'ignore'):
    			self.stop_words.add(word.strip())
     
    	"""对文本进行分词,返回的分词结果以列表方式存储"""
    	def segment(self, text, lower=True, user_stop_words=True, use_speech_tags_filter=False):
    		"""
    		:param text: 要进行分词的文本
    		:param lower: 是否要将单词小写,针对英文
    		:param user_stop_words: 若为True,表示使用停用词集合进行过滤,去掉停用词
    		:param use_speech_tags_filter:是否基于词性进行过滤,若为True,则使用默认的词性列表进行过滤
    		:return:词性过滤后的词列表
    		"""
    		# 待分词的文本
    		text = util.as_text(text)
    		# 词性标注结果列表
    		jieba_result = pseg.cut(text)
     
    		if use_speech_tags_filter == True:
    			# 进行词性过滤后的词性标注结果
    			jieba_result = [w for w in jieba_result if w.flag in self.default_speech_tags_filter]
    		else:
    			# 不进行词性过滤的词性标注结果
    			jieba_result = [w for w in jieba_result]
     
    		# 去除特殊符号
     
    		# 去除非语素字和词两端的空格
    		# 非语素字只是一个符号,字母x通常用于代表未知数、符号
    		word_list = [w.word.strip() for w in jieba_result if w.flag != 'x']
    		# 去除空字符
    		word_list = [word for word in word_list if len(word) > 0]
     
    		# 是否将英文单词小写
    		if lower:
    			word_list = [word.lower() for word in word_list]
     
    		# 是否使用停用词集合进行过滤
    		if user_stop_words:
    			word_list = [word.strip() for word in word_list if word.strip() not in self.stop_words]
     
    		# 返回词性过滤后的词列表
    		return word_list
     
    	"""将列表sentences中的每个元素/句子转换为由单词构成的列表"""
    	def segment_sentences(self, sentences, lower=True, user_stop_words=True, user_speech_tags_filter=False):
    		"""
    		:param sentences: 句子列表
    		:return: 以词性过滤后的词列表为元素的列表
    		"""
    		res = []
    		for sentence in sentences:
    			# 调用segment方法,将词性过滤后的词列表加入到列表中
    			res.append(self.segment(text=sentences, lower=lower, user_stop_words=user_stop_words, use_speech_tags_filter=user_speech_tags_filter))
    		# 返回以词性过滤后的词列表为元素的列表
    		return res
     
     
    """分句类"""
     
     
    class SentenceSegmentation(object):
     
    	"""初始化函数,获取用于分句的分隔符集合"""
    	def __init__(self, delimiters=util.sentence_delimiters):
    		"""
    		:param delimiters: 可迭代对象,用于拆分句子
    		"""
    		self.delimiters = set([util.as_text(item) for item in delimiters])
     
    	"""将文本划分为句子,返回句子列表"""
    	def segment(self, text):
    		# 获取文本
    		res = [util.as_text(text)]
    		# 调试
    		util.debug(res)
    		util.debug(self.delimiters)
     
    		# 分句,使用了两层循环
    		# 遍历分隔符对象
    		for sep in self.delimiters:
    			# res表示分句结果
    			text, res = res, []
    			# 遍历文本对象
    			for seq in text:
    				# 分句操作
    				res += seq.split(sep)
    		# 去除句子两端空格,并滤除空句
    		res = [s.strip() for s in res if len(s.strip() > 0)]
    		# 返回句子列表
    		return res
     
     
    """分割类"""
     
     
    class Segmentation(object):
     
    	"""初始化函数"""
    	def __init__(self, stop_word_file=None, allow_speech_tags=util.allow_speech_tags, delimiters=util.sentence_delimiters):
    		"""
    		:param stop_word_file: 停用词文件
    		:param allow_speech_tags: 词性列表,用于过滤某些词性的词
    		:param delimiters: 用于拆分句子的分隔符
    		"""
    		# 创建分词类的实例
    		self.ws = WordSegmentation(stop_word_file=stop_word_file, allow_speech_tags=allow_speech_tags)
    		# 创建分句类的实例
    		self.ss = SentenceSegmentation(delimiters=delimiters)
     
    	def segment(self, text, lower=False):
    		# 获取文本
    		text = util.as_text(text)
    		# 拆分文本,得到句子列表
    		sentences = self.ss.segment(text)
    		# 未进行词性过滤后的词列表
    		words_no_filter = self.ws.segment_sentences(sentences=sentences, lower=lower, user_stop_words=False, user_speech_tags_filter=False)
    		# 去掉停用词后的词列表
    		words_no_stop_words = self.ws.segment_sentences(sentences=sentences, lower=lower, user_stop_words=True, user_speech_tags_filter=False)
    		# 进行词性过滤并去掉停用词后的词列表
    		words_all_filters = self.ws.segment_sentences(sentences=sentences, lower=lower, user_stop_words=True, user_speech_tags_filter=True)
    		# 返回以上结果
    		return util.AttrDict(sentences=sentences, words_no_filter=words_no_filter, words_no_stop_words=words_no_stop_words, words_all_filters=words_all_filters)
     
     
    # 主模块
    if __name__ == '__main__':
    	# 空语句,保持程序结构的完整性
    	pass
    

    (2)构建邻接矩阵 & 计算PageRank值

    • 获取分词后的列表,在设定的window下进行单词组合,用来构造单词之间的边;
    • 使用networkx中的pagerank算法计算节点的pagerank值,将值从小到大排序;
    from __future__ import (absolute_import, division, print_function,
    						unicode_literals)
     import os
    import math
    import networkx as nx
    import numpy as np
    import sys
     
    try:
    	reload(sys)
    	sys.setdefaultencoding('utf-8')
    except:
    	pass
     
    sentence_delimiters = ['?', '!', ';', '?', '!', '。', ';', '……', '…', '\n']
    allow_speech_tags = ['an', 'i', 'j', 'l', 'n', 'nr', 'nrfg', 'ns', 'nt', 'nz', 't', 'v', 'vd', 'vn', 'eng']
     
    def combine(word_list, window=2):
    	"""构造在window下的单词组合,用来构造单词之间的边。
    	Keyword arguments:
    	word_list  --  list of str, 由单词组成的列表。
    	windows    --  int, 窗口大小。
    	"""
    	if window < 2: window = 2
    	for x in xrange(1, window):
    		if x >= len(word_list):
    			break
    		word_list2 = word_list[x:]
    		res = zip(word_list, word_list2)
    		for r in res:
    			yield r 
     
    def sort_words(vertex_source, edge_source, window=2, pagerank_config={'alpha': 0.85, }):
    	"""将单词按关键程度从大到小排序
    	Keyword arguments:
    	vertex_source   --  二维列表,子列表代表句子,子列表的元素是单词,这些单词用来构造pagerank中的节点
    	edge_source     --  二维列表,子列表代表句子,子列表的元素是单词,根据单词位置关系构造pagerank中的边
    	window          --  一个句子中相邻的window个单词,两两之间认为有边
    	pagerank_config --  pagerank的设置
    	"""
    	sorted_words = []
    	word_index = {}
    	index_word = {}
    	_vertex_source = vertex_source
    	_edge_source = edge_source
    	words_number = 0
    	for word_list in _vertex_source:
    		for word in word_list:
    			if not word in word_index:
    				word_index[word] = words_number
    				index_word[words_number] = word
    				words_number += 1
     
    	graph = np.zeros((words_number, words_number))
     
    	for word_list in _edge_source:
    		for w1, w2 in combine(word_list, window):
    			if w1 in word_index and w2 in word_index:
    				index1 = word_index[w1]
    				index2 = word_index[w2]
    				graph[index1][index2] = 1.0
    				graph[index2][index1] = 1.0
     
    	debug('graph:\n', graph)
     
    	nx_graph = nx.from_numpy_matrix(graph)
    	scores = nx.pagerank(nx_graph, **pagerank_config)  # this is a dict
    	sorted_scores = sorted(scores.items(), key=lambda item: item[1], reverse=True)
    	for index, score in sorted_scores:
    		item = AttrDict(word=index_word[index], weight=score)
    		sorted_words.append(item)
     
    	return sorted_words
    

    (3)提取关键词和关键词组

    TextRank4Keyword是我们在使用过程中调用的类,可配置停用词、词性表等,analyze方法实现了算法的主要功能,我们可通过get_keywords提取关键词,get_keyphrases提取关键词组。

    # 把新版本的特性引入当前版本
    from __future__ import (absolute_import, division, print_function, unicode_literals)
    # 导入操作复杂网络的模块
    import networkx as nx
    # 导入数值计算模块
    import numpy as np
    # 导入工具包组件
    from textrank4zh import util
    # 导入Segmentation文件
    from textrank4zh.Segmentation import Segmentation
     
     
    class TextRank4Keyword(object):
     
    	"""初始化函数"""
    	def __init__(self, stop_words_file=None, allow_speech_tags=util.allow_speech_tags, delimiters=util.sentence_delimiters):
    		"""
    		:param stop_words_file:str类型,指定停用词文件的路径,若为其他类型,则使用默认的停用词文件
    		:param allow_speech_tags:词性列表,用于过滤某些词性的词
    		:param delimiters:用于拆分句子的分隔符,默认值为`?!;?!。;…\n`
    		"""
    		self.text = ''
    		self.Keywords = None
    		# 创建分割类的实例
    		self.seg = Segmentation(stop_words_file=stop_words_file, allow_speech_tags=allow_speech_tags, delimiters=delimiters)
    		# 句子列表
    		self.sentences = None
    		# 对sentences中每个句子分词而得到的两维列表
    		self.words_no_filter = None
    		# 去掉words_no_filter中的停止词而得到的两维列表
    		self.word_no_stop_words = None
    		# 保留words_no_stop_words中指定词性的单词而得到的两维列表
    		self.words_all_filters = None
     
    	"""分析文本的函数,体现算法思想的部分"""
    	def analyze(self, text, window=2, lower=False, vertex_source='all_filters', edge_source='no_stop_words', pagerank_config={'alpha': 0.85,}):
    		"""
    		:param text: 文本内容
    		:param window: 窗口大小,整型,用于构造单词之间的边,去默认值为2
    		:param lower: 是否将英文文本转换为小写,默认值为False
    		:param vertex_source: 选择使用words_no_filter, words_no_stop_words, words_all_filters中的哪一个来构造pagerank对应的图中的节点。默认值为`'all_filters'`,可选值为`'no_filter', 'no_stop_words', 'all_filters'`。关键词也来自`vertex_source`
    		:param edge_source:选择使用words_no_filter, words_no_stop_words, words_all_filters中的哪一个来构造pagerank对应的图中的节点之间的边。默认值为`'no_stop_words'`,可选值为`'no_filter', 'no_stop_words', 'all_filters'`。边的构造要结合`window`参数。
    		:param pagerank_config:pagerank算法参数配置,阻尼系数为0.85
    		"""
    		self.text = text
    		self.word_index = {}
    		self.index_word = {}
    		# 关键词列表
    		self.keywords = []
    		self.graph = None
     
    		result = self.seg.segment(text=text, lower=lower)
    		self.sentences = result.sentences
    		self.words_no_filter = result.words_no_filter
    		self.word_no_stop_words = result.word_no_stop_words
    		self.words_all_filters = result.words_all_filters
     
    		# 调试
    		util.debug(20 * '*')
    		util.debug('self.sentences in TextRank4Keyword:\n', ' || '.join(self.sentences))
    		util.debug('self.words_no_filter in TextRank4Keyword:\n', self.words_no_filter)
    		util.debug('self.words_no_stop_words in TextRank4Keyword:\n', self.words_no_stop_words)
    		util.debug('self.words_all_filters in TextRank4Keyword:\n', self.words_all_filters)
     
    		# 选项,几种模式
    		options = ['no_filter', 'no_stop_words', 'all_filters']
    		# 模式选择
    		if vertex_source in options:
    			_vertex_source = result['words_' +vertex_source]
    		else:
    			_vertex_source = result['words_all_filters']
    		if edge_source in options:
    			_edge_source = result['words_' + edge_source]
    		else:
    			_edge_source = result['words_no_stop_words']
     
    		self.keywords = util.sort_words(_vertex_source, _edge_source, window=window, pagerank_config=pagerank_config)
     
     
    	"""获取最重要的num个长度大于等于word_min_len的关键词"""
    	def get_keywords(self, num=6, word_min_len=1):
    		"""
    		:param num: 返回的关键词个数
    		:param word_min_len: 最小关键词长度
    		:return: 关键词列表
    		"""
    		result = []
    		count = 0
    		for item in self.keywords:
    			if count >= num:
    				break
    			if len(item.word) >= word_min_len:
    				result.append(item)
    				count += 1
    		return result
     
    	"""获取 keywords_num 个关键词构造的可能出现的短语,要求这个短语在原文本中至少出现的次数为min_occur_num"""
    	def get_keyphrases(self, keywords_num=12, min_occur_num=2):
    		"""
    		:param keywords_num: 返回的关键词短语个数
    		:param min_occur_num: 短语在文本中的最小出现次数
    		:return: 关键词短语列表
    		"""
    		# 关键词集合
    		keywords_set = set([item.word for item in self.get_keywords(num=keywords_num, word_min_len=1)])
    		# 关键词短语集合
    		keyphrases = set()
    		for sentence in self.words_no_filter:
    			one = []
    			for word in sentence:
    				if word in keywords_set:
    					one.append(word)
    				else:
    					if len(one) > 1:
    						# 将关键词组成关键词短语
    						keyphrases.add(''.join(one))
    					if len(one) == 0:
    						continue
    					else:
    						one = []
    			# 兜底
    			if len(one) > 1:
    				keyphrases.add(''.join(one))
    		# 在原文本中至少出现min_occur_num词
    		return [phrase for phrase in keyphrases if self.text.count(phrase) >= min_occur_num]
    

    参考文献:

    [1] TextRank算法的基本原理及textrank4zh使用实例

    展开全文
  • 学校安全隐患排查情况报告引导语:安全生产隐患排查整治信息系统为开展安全隐患排查整治工作提供统一的协同工作平台,实现对重大危险源企业、安全隐患信息的登记、审查、评估、分类、统计、分析和处理。下面是小编为...
  • 以《工贸企业安全风险分级管控体系建设实施指南(试用版)》、《工贸企业隐患排查治理体系建设实施指南(试用版)》为依据,以现行的风险管理和安全检查隐患排查为框架基础,通过分析、评价、分级、管控等工作,明确...
  • 2、VR商场火灾隐患排查 虚拟现实中进行场景体验,显示实物性安全隐患点,要求体验者在一定时间内通过查找一 定数量的隐患 点消除隐患。系统进行评分学习安全知识。在虚拟现实中学习到生活中消防隐患问题,提高安全...
  • 为了解决隐患管理系统适应企业对安全管理需求不断增加的问题.采用持续改进与优化的方法,研究了现有系统存在的几点不足:缺乏对隐患的标准化处理、忽略人的不安全行为以及缺少对隐患信息的统计分析.通过实现对隐患的...
  • 1、文本挖掘的历程 对于NLP问题,首先要解决的是文本表示的问题。虽然人能够清楚地了解文本的含义,但是计算机只能处理数值运算,因此首先要考虑如何将文本转化为数值。 1.1 向量表示 1.1.1 词袋模型 ...
  • 前言: 随着如今的互联网和大数据时代不断发展,很多企业开始建设自己的机房,用于存储数据、运行系统等,机房...机房需要进行安全隐患排查的地方 (1)逐个局点、机柜、涉及到动环监控可监控试验,机房防
  • 对隐患分类定级,定期通报,挂牌督办,限期整改,超时升级,促进企业层层落实隐患排查治理责任。定期召开专业会议,对查出的隐患进行系统梳理,分析评估,查找根源,找出不足,落实针对性防控措施,强化风险预控。
  • 根据煤矿企业隐患排查治理工作实际需要,利用信息技术和网络技术,提出了煤矿事故隐患管理与预警方法,设计了与之配套的、基于B/S模式的应用软件——煤矿事故隐患管理与预警系统,并在事故隐患预警与动态监控的基础上...
  • 安全风险分级管控与事故隐患排查治理 管理信息化系统简介 安全风险分级管控与事故隐患排查治理管理信息化系统按照国家安全风险分级管控与事故隐患排查治理实施指南结合煤矿安全生产标准化的要求帮助煤矿企业斩断了...
  • 分析了现有煤矿隐患管理系统中存在的不足,制定了完整的隐患级别、隐患种类和隐患标准项管理方式,优化了隐患排查治理流程,利用分层架构方法和ASP.NET MVC技术完成了煤矿隐患闭环管理系统的研发。系统利用智能终端实现...
  • Mac狮子系统又暴安全隐患

    千次阅读 2012-05-04 01:32:44
    最近,有人又暴Apple的安全隐患问题。 安全隐患 在Mac OS X 10.7.3系统在某些特殊情况下,据有人发现,Mac OS X系统会把用户的用户名连同密码一起记录在系统的安全日志中,而且密码是明码。 参见:...
  • 工信部通知要求开展新能源汽车安全隐患排查工作,重点对已售车辆、库存车辆的防水保护、高压线束、车辆碰撞、车载动力电池、车载充电装置、电池箱、机械部件和易损件开展安全隐患排查工作,前期已进行过检查的车辆,...
  • 为了更好地贯彻执行国家安监总局隐患排查治理工作,本系统还可实现隐患排查治理绩效评估功能。 企业安全生产关系到国家的财产安全、人民生活利益,以及企业职工的幸福安康,是企业根本的效益所在。安全生产关系到...
  • 煤矿企业安全信息管理系统 上海汇睿电子科技 TOC \o "1-3" \h \z 安全为天怎样...2 安全技术方法 2 月度隐患排查 2 地质水文预报 2 安全活动管理 2 安全规章制度 2 安全工程管理 2 安全报表管理 2 审阅安全信息 2 一

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,855
精华内容 1,142
关键字:

企业隐患排查系统