对文本数据进行实时过滤的需求在舆情类系统的开发过程中经常碰到。如:对涉黄、涉政、涉恐文本的过滤;对广告数据的过滤;以及对非业务数据的过滤等。这些过滤需求由于比较难于描述其过滤规则,所有出现了很多分类算法用于对各类文本数据的分类过滤,这些算法在网上已经有很多文章进行了深入探讨,本文不再做赘述。本文将主要探讨一种基于规则的实时文本过滤技术。

在舆情系统的开发中,我们也时常会碰到基于规则定义的文本过滤需求。如:SSAS模式下的舆情系统,用户通过基于关键字的规则向舆情系统设定其感兴趣的文本内容,舆情系统根据规则向用户推送相关的文本;用户向舆情系统设置告警规则,当文本匹配告警规则时产生告警等。这类需求字面上随没有蕴含实时的字样,但实际对于数据处理的实时性是有要求的。当舆情采集到文本时,如果能更快的确定需要将该文本推送给哪些客户,客户将更实时的获得到关注的文本,提升客户的使用体验;而对文本进行告警,告警越实时,用户就可以更及时的处理告警。

这类基于规则的实时文本过滤需求,在过去实现时,需要在实时性和功能完整性上做出取舍。因为lucene没有提供文本的实时过滤功能,所以为了能够实现文本处理的实时性,开发者往往会自己动手实现一个仅支持lucene语法子集能力的过滤功能,如对关键词进行匹配过滤等。这种情况,文本在接收后即可在数据流中被实时过滤,不需要等到进入lucene等系统后再进行处理。这种实现方式,数据被实时过滤,但其能支持的过滤条件有限,有些lucene语法支持的功能,其无法满足;在进行文本处理时,lucene无疑已经成为实时的标准,其提供的文本检索匹配能力已基本覆盖了我们对文本处理的需求,但由于它的实现机制,其无法提供实时的文本过滤方案,只提供了准实时的解决方案NRT(Near Realtime Search)。该方案会对lucene整体性能有一定影响,另外,关于NRT,本文不做具体的讨论,有兴趣的朋友可以在网络中找到很多相关资料。但使用lucene技术,可以在文本过滤的功能完整性及性能上找到一个不错的折衷。

Lucene的折衷在过去无疑是一个还不错的选择,但总还是让笔者耿耿于怀。因为其提供的技术总还要引起IO操作(因为其索引是需要保存在磁盘的),而这些IO操作在实时过滤的场景中实际是没有必要的。这与笔者在2006年左右处理结构化数据的过滤时一样,当年需要将数据存储到数据库后,再利用数据库的检索功能将数据检索出来,以达到过滤效果。当时这种方案是因为没有一种基于SQL语法能力的,能够对内存结构化数据进行过滤的有效工具,后来笔者经过数年积累开发了一个针对内存结构化数据实时过滤的开源工具MOQL,该工具是一款基于SQL语法的结构化数据实时处理工具,有兴趣的朋友可以参看我关于MOQL的其它文章。(代码路径: https://github.com/colorknight/moql.git)。

如今碰到的问题与当年碰到的问题如出一辙,则其解决办法也如出一辙。如果有一款兼容lucene语法的,支持实时文本过滤的工具,那么就可以很好的解决文本数据的实时过滤问题了。这个工具可以降低使用者的学习成本,并可以让应用系统实现一个语法同时完成实时计算与对lucene的检索(注:笔者开发的舆情系统中,实际已经完成了这样的应用整合)。

为此,笔者开发了一款兼容lucene语法的实时过滤开源工具Tripod(代码路径: https://github.com/colorknight/tripod.git)。该工具完全兼容lucene的查询语法,相关语法参见lucene查询语法。同时,Tripod也支持lucene的相关度评分机制,评分算法可参见lucene评分机制。在应用系统中,由于实现机制的差异,Tripod给出的分值与lucene不一致,但其所表现的趋势是一致的。其造成这种评分差异的主要原因是,lucene会保留所有文档基于词的反向索引,但Tripod受限于使用内存的大小,无法保留如此巨大的索引,在进行TF/IDF计算时,该值会引起不小的差异,但由于所有的信息都是基于实际环境中的文档信息构建出来的,所以二者所返回的相关度趋势是一致的。

使用Tripod进行文本数据的实时过滤非常简单,示例代码如下:

// 创建TripodEngine
TripodEngine tripodEngine = createTripodEngine();// 构造测试数据文档,一个文档由多个部分,如:题目,内容;而每个部分由一堆词组成Map<String, TermEntity[]> dataMap = TripodTestHelper.createDataMap();// 匹配文档tripodEngine.match(dataMap, true);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}protected static TripodEngine createTripodEngine() {// 描述文档的组成结构,及结构中每一部分的权重
List<FieldMetadata> fieldMetadatas = new LinkedList<FieldMetadata>();FieldMetadata fieldMetadata = new FieldMetadata("title", 2);fieldMetadatas.add(fieldMetadata);fieldMetadata = new FieldMetadata("content", 1);fieldMetadatas.add(fieldMetadata);/** 初始化TripodEngine,传入待处理的文档对象的字段信息,缺省字段及Idf计算辅助接口
* IdfCounterImpl记录了文档与词的相关关系,可持久化该类的信息,每次使用Tripod时
* 注入这些持久化数据,使Tripod的相关度计算结果尽量保持与lucene一致* */TripodEngine tripodEngine = new TripodEngine(fieldMetadatas, fieldMetadata,new IdfCounterImpl());// 设置引擎在匹配时计算相关度tripodEngine.setScoring(true);// 文档匹配监听器,当规则匹配文档后,通过该接口回调传回匹配结果TripodListener tripodListener = new TripodPrintListener();// 向引擎添加基于lucene语法的匹配规则tripodEngine.addTripodRule("test1", "\"第5代 领导\" 任命 形式主义", tripodListener);return tripodEngine;
}

示例代码的执行结果为:

test1 : 0.066580

其原理就是在Tripod引擎中,根据需要,预先设定好所有的过滤规则,并为每个过滤规则设置好监听器。将Tripod引擎设置在文本数据的处理流中,每当有新的文本数据被采集到,流经Tripod引擎时,引擎就会对文本进行过滤处理。引擎会遍历设置在引擎内的所有过滤规则,当文本命中某个过滤规则后,会通过该规则的监听器,将文本返回以完成后续的处理逻辑。一个文本可以同时命中多个过滤规则。Tripod被设定为一个实时过滤工具,因此其内部没有多线程的调度实现。开发者可根据自己应用场景的实际需要,自行完成多线程开发,实现大数据量的文本实时过滤并发处理。

如何实现实时文本过滤相关推荐

  1. 天天看盘网站突发君异动君实时监控提醒

    相信玩股票的大神都非常注意股票的突发和异动信息,借此帮助判断股票的买卖时机,更好的分析股票,快人一步夺得挣钱先机.我们的网页资讯工具软件可以实现对股票网站突发和异动信息的实时监控,让你获得第一手股票异 ...

  2. Xilinx低比特率高品质 ABR 视频实时转码(HPE 参考架构)

    Xilinx低比特率高品质 ABR 视频实时转码(HPE 参考架构) 介 绍 对实时视频流的需求给视频服务提供商带来了严峻挑战,必须在管理基础设施和互联网带宽运营成本,还要为客户提供高质量体验.鉴于视 ...

  3. ONNX 实时graph优化方法

    ONNX 实时graph优化方法 ONNX实时提供了各种图形优化来提高模型性能.图优化本质上是图级别的转换,从小型图简化和节点消除,到更复杂的节点融合和布局优化. 图形优化根据其复杂性和功能分为几个类 ...

  4. deepstream-开放式实时服务器

    deepstream-开放式实时服务器 deepstream是一款开源服务器,其灵感来自金融交易技术背后的概念.它允许客户端和后端服务同步数据.发送消息并以非常高的速度和规模规划rpc. 参考:htt ...

  5. 基于TensorRT的BERT实时自然语言理解(下)

    基于TensorRT的BERT实时自然语言理解(下) BERT Inference with TensorRT 请参阅Python脚本bert_inference.py还有详细的Jupyter not ...

  6. 基于TensorRT的BERT实时自然语言理解(上)

    基于TensorRT的BERT实时自然语言理解(上) 大规模语言模型(LSLMs)如BERT.GPT-2和XL-Net为许多自然语言理解(NLU)任务带来了最先进的精准飞跃.自2018年10月发布以来 ...

  7. 基于自动驾驶车辆的NVIDIA-TensorRT推理实时优化

    基于自动驾驶车辆的NVIDIA-TensorRT推理实时优化 Optimizing NVIDIA TensorRT Conversion for Real-time Inference on Auto ...

  8. 使用Nucleus SE实时操作系统

    使用Nucleus SE实时操作系统 Using the Nucleus SE real-time operating system 到目前为止,在本系列文章中,我们详细介绍了Nucleus SE提供 ...

  9. 满足实时人工智能的计算需求

    满足实时人工智能的计算需求 Meeting the computational needs of real-time AI 随着实时服务浪潮日益成为日常生活的一部分,计算基础设施正在经历一场重大的转变 ...

最新文章

  1. 带父节点的平衡二叉树_学习数据结构--第四章:树与二叉树(平衡二叉树)
  2. 【AD用户设置系列一】让IT省心省力的漫游配置文件
  3. [导入] 用java把页面日期控件写出来
  4. 安卓开发—根据顾客预算显示食物信息
  5. 设计模式-工厂模式(二)
  6. Java设计模式-装饰者设计模式
  7. TSC打印机标签纸出纸位置调整方法
  8. 安卓应用出海指南--发布到Google Play
  9. 一款音频播放软件设计文档,欢迎提出宝贵
  10. LCD1602单片机(STC51/STM32)驱动程序详解
  11. 大学计算机课程日记,大学计算机实习日记.docx
  12. 如何查找各个手机放序列号
  13. 写给XJTU计算机系大一大二的童鞋
  14. CPM-Nets: Cross Partial Multi-View Networks
  15. 领导合影站位图_领导主席台座次安排图解:政务礼仪
  16. 五笔难拆字拆分方法汇总及详解
  17. 解决Field xxService in x.controller.x required a bean of type ‘x.service.x‘ that could no be found的方法
  18. mysql怎么优化like_MySQL 的 like %关键字怎么优化
  19. DRF路由Routers
  20. 语音增强算法的概述[转]

热门文章

  1. 现在物价虽然高得离谱,但是内存条都白菜价格了,需要调整程序架构的思维“与时俱进” --- 改进系列之一...
  2. 如何使用TreeView控件
  3. Tensorflow(r1.4)API--tf.nn.max_pool
  4. java 计算机程序_跟我学java—什么是计算机程序?
  5. myisam为什么比innodb查询快_mysql存储引擎之MyISAM 和 InnoDB的比较
  6. python sendto(右键发送文件到执行的bat)功能的实现
  7. java 矩阵题目_java练习本(20190611)
  8. delphi如何获得select得到的信息_如何建立闭环的笔记体系
  9. python社区版如何下载库_pycharm社区版在哪里下载
  10. php怎么防止爬虫,PHP语言学习之php 防止爬虫设置