背景技术
电子商务网站作为一个商品交易平台(也可以称为:电子交易平台),每天有许多的卖家发布商品。一些信誉不好的卖家出于自身利益会利用这一平台违规发布一些商品。例如,欺骗消费者的广告商品、夸大宣传效果的商品、骗取网站搜索流量的商品、商品分类摆放不正确的商品等。为此,电子商务网站的管理人员一方面需要能够及时地阻止这些违规商品的发布,这要求从违规商品被发布到被检测的时间应当尽可能地短;另一方面需要对已经发布到网站的所有商品进行扫描,从中检测出违规商品,以便进行相应的处理。
目前对于电子商务网站收到的商品信息的检测,主要有“规则引擎+搜索引擎”的方式和基于数据库的信息检索方式,以下分别介绍这两种方式。
规则引擎是基于规则的专家系统的一部分,其核心是推理机,通过模式匹配器,推导事实与规则的匹配程度,当事实与规则匹配时,将规则装入规则优先级表中;之后,从规则优先级表中进行规则匹配,在匹配到的所有规则中选取优先级最高的规则(或者采用其他规则选择算法来选择规则),并执行相应的运作。典型的规则引擎包括Drools等,并有一些基于Drools的用于排查违规商品的业务系统。规则引擎适合于以流过滤的方式匹配目标数据,当遇到海量商品时,可以采用正向扫描的方式,逐一处理目标商品。
规则引擎可用于实时排查违规商品,搜索引擎可用于全量排查违规商品。但这种“规则引擎+搜索引擎”的方式存在如下缺点:
由于规则引擎和搜索引擎两者相对独立,因此两者的匹配规则之间无法兼容。针对同一个业务需求,需要分别设置两者各自的商品管理规则,导致维护、开发成本较高。
此外,现有的规则引擎语法过于复杂,其维护、编写规则的成本非常高;同时在语法增强方面的能力欠缺。由于正则表达式类型的匹配能力对于排查违规商品至关重要,而搜索引擎在面对需要支持正则表达式类型的匹配时,其实现成本高,性能差。
以下举一个分别用规则引擎和搜索引擎进行处理的例子。
例如,对于商品管理规则:禁止出现在标题中标注了包邮,而实际上商品价格中标注的邮费却不是0元的行为。
对于上述规则,还可以有一条补充规则,例如:标题中含有“江浙沪包邮”、“满100包邮”等在“包邮”之前添加限定词的商品,则不认为是违规商品。
根据上述限定的规则,“包邮五星皇冠手机”是违规的商品标题,而“江浙沪包邮五星皇冠手机”是非违规的商品标题。
对于上述规则的处理,需要用到正则表达式,在现有技术中,规则引擎能够支持正则表达式,采用规则引擎处理时的核心伪代码可以是:
import java.util.*;
rule"baoyouRule"
no-loop false
salience 1
when
a:Auction(postage_price!=0,title matches“.+[]+|[]+包邮.*”,)
then
setCheckStaus(false);
a.setError(“您的商品违反了淘宝的商品管理规则,校验不通过”);
End
以下对正则表达式(“.+[]+|[]+包邮.*”)做出解释。
正则表达式是一种常用的文本匹配的技术。首先按照规则,定义一个模式(字符串);之后可以根据该模式,匹配目标字符串是否符合该模式定义的特征。不同的编程语言,其规则有些许差异,但大致原理相似。
IFDL中的正则表达式规则,与JAVA语言类似。
上述的模式“.+[]+|[]+包邮.*”,其各个字符的意义如下:(“[]”中含有一个空格)
“.”:表示可以匹配任意一个字符;
“+”,“?”,“*”,这三个字符均用于定义数量,“+”表示出现在其之前的字符,数量为1个或1个以上;“?”表示0个或者1个;“*”表示任意个;
“[]”:用中括号括起的一组字符,用于圈定字符范围;
“|”:表示or的关系;
因此根据上述的模式,可以匹配的目标字符串的特征是:
目标字符串含有“包邮”二字;
在“包邮”后面,紧跟着任意个字符(.*);
在“包邮”前面,必须含有“1个或1个以上的空格([]+)”,或者“(|)1个或者1个以上的字符(.+)且后跟着1个或1个以上的空格([]+)”。
因此,可以匹配到的(即认为是违规的)目标字符串举例如下:
“五皇冠包邮诺基亚N73”,“热卖包邮苹果IPHONE4”……
匹配不到的目标字符串(即认为是没有违规的)例如:
“江浙沪包邮诺基亚N73”,“满百包邮诺基亚N73”等。
从上面的代码可以看出,针对一个简单的商品管理规则,规则引擎需要大量的非业务逻辑代码来构建。实际中的商品管理子规则,通常会达到几万的规模甚至更多,由此增加的总体工作量非常惊人,工作效率低下。
使用搜索引擎处理时,需要搜索引擎将现有的商品记录全部索引到其目录中,同时将商品标题、商品邮费添加为搜索引擎的索引字段。在搜索引擎全部索引完商品记录后,即可向搜索引擎发出带有以下查询串的请求,从现有的商品记录中检索出符合规定的违规商品:
q=包邮&filter=postage_price%5B0.01%2C%5D
由于搜索引擎不支持正则表达式,使得返回的商品结果中可能会含有标题的非违规商品,例如,标题为“江浙沪包邮五星皇冠手机”的非违规商品,,因此,需要在搜索引擎返回的商品结果中进行二次过滤,以排除标题合法的商品。
从上述内容可以看出,采用搜索引擎处理的不足之处主要在于:
第一,搜索引擎将现有的全部商品记录索引到其目录中,以现有的电子商务平台的商品规模,通常需要成百上千台的服务器,运行数十个小时才能完成,非常耗时;
第二,为满足商品管理的需要,商品的标题和邮费需要添加为搜索引擎的索引字段,这将给运行搜索引擎的计算机带来较大的存储空间的开销;
第三,如上所述,在搜索引擎返回的结果中,有时需要进行二次过滤,这将大大降低商品标题处理的效率;
第四,由于搜索引擎构建索引需要大量的时间,因此,当搜索引擎中只含有已经发布到电子商务网站的商品记录时,对于当前正在发布到电子商务网站的商品记录,搜索引擎将无法进行实时地监控,难以对最新发布的商品进行检查,将只能在商品发布到电子商务网站之后的十几分钟内,甚至需要更长的时间才能完成检查,这样的检查延迟会使得违规标题被发布一段时间,影响了搜索引擎的处理效果。
具体实施方式
需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本申请。
本实施例中,以电子交易平台(电子商务网站)中发布的商品信息作为网络信息的例子,来说明对违规商品的检查与处理。
首先,结合附图来描述本实施例中用于网络信息处理的系统。图1为用于网络信息处理的系统的结构图,而图2为用于网络信息处理的系统的物理架构图。如图1和图2所示,用于网络信息处理的系统包括:IFD(Issue Feature Define,违规商品特征)任务调度系统、IFD实时服务器集群、hadoop分布式服务器集群、违规商品处理服务器集群以及商品发布服务器集群。
对于hadoop分布式服务器集群而言,Hadoop是一个开源的可运行于大规模集群上的分布式并行编程框架,Hadoop的核心设计思想是:MapReduce和HDFS。MapReduce是Google提出的一个软件架构,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)"和″Reduce(化简)"和它们的主要思想,都是从函数式编程语言借来的,还有从矢量编程语言借来的特性;HDFS是Hadoop Distributed File System的缩写,即:Hadoop分布式文件系统,为分布式计算存储提供底层支持。
下面分别介绍下图1和图2中所示的各个部件的功能。
1.Sailor【IFD任务调度系统】
一个IFD模型的调度平台。Sailor会从数据库中抓取出所有的IFD模型,并组装成特定格式的数据包,例如,xml文件【ifd.xml】,发送到Real-IVM和Full-IVM中,其中,IVM为一个能够解析并执行IFDScript的程序,是运行在java虚拟机之上。
下面对组装成的文件的格式进行说明:
1)文件符合xml的标准,包含ivm-core、ifd-models、ifd-model三个元素;其中,ivm-core为根元素,根元素只能有一个;ifd-models为其子元素,ifd-model为ifd-models的子元素;
2)ifd-models只能有一个;
3)ifd-model可以包含多个,至少有一个;包含一个属性:id,值为数字类型。ifd-model元素的值为一段字符,即对应的ifd模型的程序代码。
2.Real-IVM【IFD实时服务器集群】
用于实时检查单个商品是否为违规商品的IVM,该IVM运行在java虚拟机上。图3示出了Real-IVM所执行的操作流程。
在图3中,IFDClient:IFD客户端对象,运行在商品发布服务器集群中,可以向IFD实时服务器等集群发出检测指令。
IvmCoreFactory:IFD容器内核工厂对象,运行在IFD实时服务器集群中。
IFDScript:IFD脚本对象,运行在IFD实时服务器集群中。
ASTBuilder:抽象语法树构建器,运行在IFD实时服务器集群中。
CompileVisitor:编译器观察者,运行在IFD实时服务器集群中。
ExecutorVisitor:执行器观察者,运行在IFD实时服务器集群中。
图3所示的流程共分两大步:编译和执行,其中,编译过程如下所述:
1)IvmCoreFactory对象接收从Sailor传递过来的ifd.xml文件,读取xml文件中的内容,取出每一个IFD模型的脚本、id等信息;
2)IvmCoreFactory将IFD模型脚本作为参数,调用IFDLScript对象,编译IFD模型;
3)IFDLScript对象调用ASTBuilder对象,根据IFD模型生成抽象语法树对象:AST;
4)执行编译期检查,遍历AST的每一个结点;从而完成AST的构建工作;
5)每一个IFDLScript对象对应于一个IFD模型脚本,并在内存中保存。
也就是说,对应一条用于描述违规商品信息的特征信息,编译成一段IFD模型脚本,并生成一个与IFD模型脚本对应的抽象语法树,用于后续网络信息的检测。
其中,执行过程如下:
1)商品发布系统,调用IFDClient接口;同时将描述商品信息的对象传递到该接口的方法中;
2)IFDClient顺序调用每一个IFDScript对象,IFDScript对象执行运行期检查;将商品信息对象传递到AST结构树中,然后访问其AST中的每一个结点,进行运算;并将运算结果返回到IFDClient。
3.Full-IVM【hadoop分布式集群】
用于检查已经发布到电子交易平台的所有商品,是否存在违规商品的IVM。该IVM运行在hadoop分布式集群环境中。在基于hadoop的分布式集群环境中,系统在Mapper中组织各种需要校验的商品数据,并顺序发送至Reducer。此时Reducer即相当于Real-IVM中的IFDClient,流程等与Real-IVM一致。
4.Loom【违规商品处理服务器集群】
用于处理违规商品的处理系统。Loom是一个对违规商品进行处理的系统;Real-IVM检测到违规商品时,发送消息给Loom,Loom对商品执行下架、删除等操作。
5.商品发布服务器集群
电子交易平台的一个对用户开放的web系统。在该电子交易平台注册的卖家,通过这个系统发布商品,是一个基于web,B/S架构的系统。
在描述完上述用于网络信息处理的系统之后,下面结合上述系统中的各个部件来进一步描述抽象语法树对象的建立和使用方法。
优选的,本申请提供了一种优选的建立抽象语法树的方案,其如图4所示,包括如下步骤:
S402,获取用于描述违规商品信息的特征信息;
例如,上述特征信息可以为:商品邮费在50-100元之间,并且商品的标题不符合正则表达式:“.{1,5}包邮.+”;
S404,将特征信息编译成脚本信息,其中,脚本信息中各语句之间的逻辑关系与特征信息中各特征之间的逻辑关系相对应;
该特征信息编译得到的IFDScript程序代码【核心代码片段S1】可以如下所示:
extern String a_title;
extern Integer a_price;
if((a_price>50&a_price<100)®exp(a_title,”.{1,5}包邮.+”)){define D"您的商品违反了淘宝的商品管理规则,校验不通过";}
S406,按照脚本信息中各语句之间的逻辑关系建立与特征信息对应的抽象语法树,其中,抽象语法树中的每个节点与一个或多个语句相对应,各个节点之间的连接关系与各语句之间的逻辑关系相对应。
在抽象语法树中,根元素为ifdl,包含Statement【语句】,Statement【语句】包括:emptyStatement【空语句】、变量声明、assignmentStatement【赋值语句】、functionStatement【用户自定义方法】、methodStatement【函数】、ifStatement【if控制】、elseStatement【else控制】等等,支持现代高级语言中所有的语法特性:分支控制、流程决策控制、用户自定义方法/函数、赋值等等,通过functionStatemnet还实现了用户自定义方法,从而可以引入复杂的文本匹配等能力。抽象语法树表示了IFDL这门语言的语法描述能力,从中可以看出,其描述能力要比规则引擎、搜索引擎等强大了很多。
搜索引擎的描述能力,无法支持分支流程跳转,无法支持正则表达式一类的匹配,只能支持简单的区间、==一类的匹配。而规则引擎,由于其语法格式是固定,且无法定制,无法支持自定义方法;而且最重要的一点,现有的规则引擎,其性能比较低下,无法满足大型电子商务网站的需要。
IVM执行AST是本申请中最关键的技术环节,这直接决定了本申请的性能和效率。而这是规则引擎和搜索引擎无法做到的。
在IVM启动时,它会把上面的这段IFDScript程序代码【S1】加载到内存中,并且进行语法检查,检查是否符合IFDScript的语法规范。如果符合规范,则生成一个抽象语法树的实例对象BlockSmt。这个实例对象保存了完整的S1,结构和接口继承关系与各语句之间的逻辑关系相对应,其根类是BlockSmt,BlockSmt使用一个属性Statements,记录IFDScript语法范式中包含的所有子语句对应的子类,比如:
IfStm类,对应于if语句的分析语句;
MethodStm类,对应于method方法的分析语句;
SkipStm类,对应于skip语句的分析语句;
DefineStm类,对应于define语句的分析语句;
在实例化抽象语法树BlockSmt这个实例对象时,IVM会根据每一条S1,生成不同的BlockSmt对象,以便用于后续对不同的网络信息进行检测。
优选的,在将特征信息编译成脚本信息之后,以及在按照脚本信息中各语句之间的逻辑关系建立与特征信息对应的抽象语法树之前,将编译得到的脚本信息以xml文件的形式存放到服务器中;在需要建立抽象语法树时,读取以xml文件的形式存储的脚本信息,并从xml文件中解析得到脚本信息。在本实施例中,通过xml的形式来传输和存储脚本信息,可以批量、快速地传递上述的脚本信息。
优选的,本申请提供了一种优选的使用抽象语法树检测网络信息的方案,其如图5所示,网络信息的处理方法包括如下步骤:
S502,按照抽象语法树中的节点所描述的特征信息加载待检测网络信息中对应的字段信息,其中,抽象语法树中的各节点用于描述违规商品信息的特征信息;
例如,加载与特征信息对应的标题字段和/或价格字段等;
S504,根据所加载的字段信息判断抽象语法树中的节点所对应的语句是否成立;若成立,则判断待检测网络信息为违规商品信息。
上述根据所加载的字段信息判断抽象语法树中的节点所对应的语句是否成立的步骤包括:判断加载的字段信息是否满足节点所对应的语句中描述的判断条件;若满足,则判断出抽象语法树中的节点所对应的语句成立;若不满足,则判断出抽象语法树中的节点所对应的语句不成立。
举例来说,在IFD实时集群(justice)和全量端(hadoop分布式集群)中运行时,justice容器和hadoop集群将需要检测的商品的对象,一一发送到IVM中,IVM会将请求转发到BlockSmt这个实例对象。
由于BlockSmt中记录了S1,BlockSmt实例对象首先从第一行代码开始分析:
extern String a_title;->BlockSmt实例对象将要检测的商品对象的标题字段,加载到BlockSmt实例对象的内存空间中
extern Integer a_price;->BlockSmt实例对象将要检测的商品对象的价格字段,加载到BlockSmt实例对象的内存空间中
if(a_price>50&……->BlockSmt实例对象的IfStm类进行分析,判断左变量a_price是否大于50以及其他的判断,如果符合条件判断,则调用DeineStm对象进行处理,DeineStm对象将"您的商品违反了淘宝的商品管理规则,校验不通过"这一字符串put到BlockSmt实例对象的计算结果字段中。
S1中所有的语句运行完成之后,保存在BlockSmt实例对象的计算结果字段中的值,即是该S1语句的执行结果。此时IVM会将该结果返回给调用端:justitce或hadoop集群中。
在本申请各个优选实施方式中,可以先从本地的存储器中获取网络信息。优选的,网络信息可以是用户在电子交易平台上发布的商品信息,其保存在上述服务器中的本地存储器中,当然,本申请不仅限于此,上述商品信息还可以保存在服务器之外的第三方存储设备中;然后使用抽象语法树的实例对象对网络信息进行计算处理,并输出计算结果。
下面将结合具体示例来进一步描述优选的使用抽象语法树对网络信息进行检测的方案。
以前文提到的商品管理规则为例进行说明,例如,将商品管理规则(用于描述违规商品信息的特征信息)定义为:“禁止在标题中标注了包邮,但实际上商品价格中标注的邮费却不是0元的行为”,则在本实施例中对应于特征信息的脚本信息如下所示:
extern String a_title;
extern Integer a_postage_price;
if(a_postage_price>0®exp(a_title,“.+[]+|[]+包邮.*”)){define D"您的商品违反了商品管理规则,校验不通过";}
上述脚本信息包含四行,其中,第一、二行的作用在后文中说明。第三行代码的意思是:商品的邮费非0;商品的标题中含有“包邮”二字,且符合正则表达式“.+[]+|[]+包邮.*”。代码一的第四行的意思是:如果第一行代码中的“if”之后的表达式成立,就定义“D”的含义是“您的商品违反了商品管理规则,校验不通过”。可以看出,相较于现有技术中采用的规则引擎所需的代码来说,上述代码非常简短。
在编译得到具有上述IFDScript程序代码的脚本信息之后,根据语法解析器对编译后的脚本信息进行解析,解析过程中执行语法检查,检查其是否符合上述语法规则,如符合,则生成一个抽象语法树的实例对象,该实例对象中的结构和接口继承关系符合抽象语法树的结构与接口继承关系,其根类中使用一个属性来记录上述IFDScript程序代码中的语句对应的子类。例如,对应于if语句(判断语句)的分析语句,对应于define(定义)语句的分析语句等。生成上述的解析器时,具体可以使用antlr这一工具,生成解析器的结构java代码,实现结构代码中的各个接口等,最后形成解析器程序。
将解析器程序部署到java虚拟机中执行,并将其作为一个接口对外提供服务,该服务是一个解析并执行IFDScript的程序(在此称作IVM),该程序中生成并使用抽象语法树的实例对象来处理网络信息。当客户端的指令指示需要检测一个商品信息是否违规(即,不符合预定的规则)时,调用上述接口,将商品信息作为一个数据流传送到IVM中。优选的,上述商品信息可以来自于网络,由发布商品的用户通过网页交互界面向电子交易平台所在的服务器提供。例如,可以要求该用户填写关于商品信息的表单,在处理商品信息时,先对商品信息进行封装,得到格式适配于抽象语法树的网络信息文件。
在使用抽象语法树的实例对象来处理网络信息时,上述的IFDScript程序代码一将会被加载到计算机内存中,同时该计算机接收包含商品信息的上述数据流。然后,抽象语法树的实例对象分析IFDScript程序代码中的每一行并做出相应处理。与代码一对应的抽象语法树的实例,可以看作是由9个子对象组成,该抽象语法树的实例处理代码一的流程如图6所示,以下对图6的流程加以分析说明。
BlockSmt是对象根,其负责整个流程的执行。在步骤S601中,BlockSmt执行第一行语句即“extern String a_title;”,将该语句交由externalSmt对象执行。然后externalSmt对象从商品信息中读取要检测的商品对象的标题字段,并将该信息保存到BlockSmt对象的上下文中,供后续的语句使用。
在步骤S602中,BlockSmt执行第二行语句,即“extern Integer a_postage_price;”,将该语句交由externalSmt对象执行。externalSmt对象从商品信息中读取要检测的商品对象的邮费,并将该信息保存到BlockSmt对象的上下文当中,供下面的语句使用。
在步骤S603中,BlockSmt执行第三行语句,即“if(a_postage_price>0®exp(a_title,“.+[]+|[]+包邮.*”))”,将该语句交由ifStatement对象执行。
在步骤S604中,ifStatement对象判断出收到的语句属于表达式,然后将该语句交由expression对象执行。
在步骤S605中,expression对象判断收到的语句属于and条件表达式,然后将语句将由conditionAndExpression对象执行。
然后,conditionAndExpression对象分别调用conditionExpression和regexpUDF对象,即步骤S606和步骤S609。
在步骤S607中,conditionExpression执行a_postage_price>0语句,然后在步骤S608中向conditionAndExpression返回执行结果。
在步骤S610中,regexpUDF执行语句regexp(a_title,“.+[]+|[]+包邮.*”),然后在步骤S611中向conditionAndExpression返回执行结果。
然后,conditionAndExpression对象将收到的执行结果层层递归返回给到ifStatement对象,即步骤S612、S613。
在步骤S614中,ifStatement对象根据表达式“a_postage_price>0®exp(a_title,“.+[]+|[]+包邮.*”)”的执行结果,判断是否执行“define D"您的商品违反了商品管理规则,校验不通过";”语句。如果执行,则如步骤S615所示,调用definaExpression执行,并在步骤S616中向BlockSmt对象返回结果。最后BlockSmt对象中保存着整个语句的执行结果。
从以上描述可以看出,对于“禁止在标题中标注了包邮,但实际上商品价格中标注的邮费却不是0元的行为”这样一条商品管理规则,本实施例中以一种较为简单的流程实现了规则的应用,其中涉及的正则表达式对于搜索引擎和数据库检索来说都无法应用,而规则引擎实现的逻辑较为复杂,导致代码的执行效率较低。
以下再举一个商品管理规则的例子。
例如在商品管理规则中,对于商品的邮费有一定的规定,商品的邮费必须在合理的价格区间之内,例如,定义了如下规则:商品的邮费必须小于商品价格的10%。对应的IFDScript程序代码可以是(以下称作“代码二”):
extern Integer a_postprice;
extern Integer a_price;
if(a_postage_price>a_price*0.1){
define D"您的商品违反了商品管理规则,校验不通过";}
上述代码所表达的逻辑,对于搜索引擎来说完全无法实现;基于数据库的信息检索方式,由于数据库的实现原理,在搜索符合条件的数据时,无法利用索引,将会导致需要对全表进行扫描,对于商品数量达到一定规模,例如上亿时,基于数据库的信息检索方式的性能将完全无法满足需要。另外规则引擎的实现也将十分复杂。抽象语法树的实例处理代码二的流程如图7所示,以下对于图7的流程加以分析说明。
类似于图6所示的流程,在图7所示的流程中,BlockSmt是对象根,其负责整个流程的执行。在步骤S701中,BlockSmt开始执行第一行语句“extern Integer a_postprice;”,将该语句交由externalSmt对象执行。externalSmt对象从商品信息中读取要检测的商品对象的邮费,并将该信息保存到BlockSmt对象的上下文当中,供后续的语句使用。
在步骤S702中,BlockSmt执行第二行语句“extern Integer a_price;”,将该语句交由externalSmt对象执行。externalSmt对象从商品信息中读取要检测的商品对象的价格字段,并将该信息保存到BlockSmt对象的上下文当中,供下面的语句使用。
在步骤S703中,BlockSmt执行第三行语句“if(a_postage_price>a_price*0.1)”,将该语句将由ifStatement对象执行。
在步骤S704中,ifStatement对象判断出接收到的语句属于表达式,然后将该语句交由expression对象执行。
在步骤S705中,expression对象判断接收到的语句属于条件表达式,然后将该语句交由conditionExpression对象执行。
在步骤S706中,conditionExpression对象执行a_postage_price>a_price*0.1语句的结果,并在步骤S707中将结果返回。该结果在步骤S708中递归返回到ifStatement对象。
在步骤S709中,ifStatement对象根据表达式a_postage_price>a_price*0.1的执行结果,判断是否执行define D"您的商品违反了商品管理规则,校验不通过"语句。如果执行,则在步骤S710中调用definaExpression执行,并在步骤S711中向BlockSmt对象返回执行结果。最后BlockSmt对象中保存着整个语句的执行结果。
从图6、图7的流程可以看出,本实施例的处理商品信息的方式与现有技术中的规则引擎、搜索引擎以及基于数据库的信息检索方式相比具有诸多进步之处,以下对此加以说明。
如前文所述,针对即使是简单的商品管理规则,规则引擎也需要大量的非业务逻辑代码来构建,而本实施例中的IFDScript程序代码则较为简短,在商品数量与日俱增、商品管理规则日益复杂的现实环境中,本实施例的处理方案较之于规则引擎,能够大量节省代码编写工作量以及维护代码所需的成本。
搜索引擎的处理方式主要是在商品信息的目录中按照索引字段进行搜索,而本实施例的技术方案中,是针对各条商品管理规则分别进行检查,这样无需专门构建一个目录并将商品记录全部索引到该目录中,在商品数量非常庞大的情况下能够有效节约计算机的存储空间。并且更重要的是,搜索引擎不能支持正则表达式,因而无法应用较为复杂的规则来处理商品信息,从而限制了应用范围。
相比于基于数据库的信息检索方式,本实施例的技术方案无需在多张商品信息列表之间进行数据关联映射以及查找,有助于避免因数据量过大而导致的处理效率降低。
此外,应用本实施例的技术方案,可以在收到用户所发布的商品之后立即对商品信息进行处理,应用这种方式,一条编写好的商品处理方式的脚本可以立即部署在商品发布的实时端,直接阻止违规商品的发布,因此对于违规商的发布的响应非常快,具有很高的处理效率。另外也可以从已接收的历史商品信息中提取商品信息进行处理,这种方式能够对于所有的商品信息做出处理,是一种全量的处理方式。
进一步,上述图6和图7所示出的处理网络信息的方法中还包括了:对分支程序(分支流)的处理方法。分支程序是程序的一种逻辑跳转,一般使用if(…){…}或if(…){…}else{…}语句,或者switch(…){case…break…}来定义。
以图6所示的处理网络信息的方法为例,该方法中所包括的分支流之间的关系如图8所示。在图6所示的实施例中,ifStatement对象所执行的判断操作,以及根据不同的判断结果来决定是否将语句交由expression对象进行执行,这就构成了一个分支程序,如以下代码所示,if(expression){statement}即构成了一个分支,意味着expression的结果为true时,即执行statement语句。
此外,本申请中的各个实施例还可以使用更加复杂的分支程序,例如,采用IFDScript编写的下列代码:
在上述图6和图7所示出的实施例中,通过分支流可以组合出多种流程分支,实现跳转控制,而这是搜索引擎等完全无法实现的一种逻辑。
本申请还保护一种优选的抽象语法树的建立装置,如图9所示,其包括:
1)获取单元902,用于获取用于描述违规商品信息的特征信息,
例如,上述特征信息可以为:商品邮费在50-100元之间,并且商品的标题不符合正则表达式:“.{1,5}包邮.+”;
2)编译单元904,与获取单元902连接,用于将所述特征信息编译成脚本信息,其中,所述脚本信息中各语句之间的逻辑关系与所述特征信息中各特征之间的逻辑关系相对应;
该特征信息编译得到的IFDScript程序代码【核心代码片段S1】可以如下所示:
extern String a_title;
extern Integer a_price;
if((a_price>50&a_price<100)®exp(a_title,”.{1,5}包邮.+”)){define D"您的商品违反了淘宝的商品管理规则,校验不通过";}
3)建立单元906,与编译单元904连接,用于按照所述脚本信息中各语句之间的逻辑关系建立与所述特征信息对应的抽象语法树,其中,所述抽象语法树中的每个节点与一个或多个语句相对应,各个节点之间的连接关系与所述各语句之间的逻辑关系相对应。
优选的,本实施例中的抽象语法树的建立装置还包括:存储单元908,与编译单元904连接,用于在将所述特征信息编译成脚本信息之后,以及在按照所述脚本信息中各语句之间的逻辑关系建立与所述特征信息对应的抽象语法树之前,将编译得到的脚本信息以xml文件的形式存放到服务器中;解析单元910,与存储单元908和建立单元906连接,用于在需要建立所述抽象语法树时,读取以xml文件的形式存储的脚本信息,并从所述xml文件中解析得到所述脚本信息。在本实施例中,通过xml的形式来传输和存储脚本信息,可以批量、快速地传递上述的脚本信息。
优选的,本实施例中的抽象语法树的建立装置还包括:加载单元912,与建立单元906连接,用于在按照所述脚本信息中各语句之间的逻辑关系建立与所述特征信息对应的抽象语法树之后,按照所述抽象语法树中的节点所描述的特征信息加载待检测网络信息中对应的字段信息;判断单元914,与加载单元912连接,用于根据所加载的字段信息判断所述抽象语法树中的节点所对应的语句是否成立;若成立,则判断所述待检测网络信息为违规商品信息。
优选的,本实施例中的判断单元914包括:判断模块9141,用于判断所述加载的字段信息是否满足所述节点所对应的语句中描述的判断条件;若满足,则判断出所述抽象语法树中的节点所对应的语句成立;若不满足,则判断出所述抽象语法树中的节点所对应的语句不成立。
本实施例中抽象语法树的建立装置可以位于图1和图2中的一个硬件设备上,也可以分布式地位于图1和图2中的多个硬件设备上。此外,本实施例中抽象语法树的建立装置所执行具体的过程可以参考上述方法实施例中的描述(例如,上述对图1-8的描述),在此不再赘述。
本申请还保护一种优选的网络信息的处理装置,如图10所示,其包括:
1)加载单元1002,用于按照抽象语法树中的节点所描述的特征信息加载待检测网络信息中对应的字段信息,其中,所述抽象语法树中的各节点用于描述违规商品信息的特征信息;
2)判断单元1004,与加载单元1002连接,用于根据所加载的字段信息判断所述抽象语法树中的节点所对应的语句是否成立;若成立,则判断所述待检测网络信息为违规商品信息。
优选的,本实施例中的网络信息的处理装置还包括:获取单元1006,用于在按照抽象语法树中的节点所描述的特征信息加载待检测网络信息中对应的字段信息之前,获取用于描述违规商品信息的特征信息,例如,上述特征信息可以为:商品邮费在50-100元之间,并且商品的标题不符合正则表达式:“.{1,5}包邮.+”;编译单元1008,与获取单元1006连接,用于将所述特征信息编译成脚本信息,其中,所述脚本信息中各语句之间的逻辑关系与所述特征信息中各特征之间的逻辑关系相对应;建立单元1010,与编译单元1008和判断单元1004连接,用于按照所述脚本信息中各语句之间的逻辑关系建立与所述特征信息对应的抽象语法树,其中,所述抽象语法树中的每个节点与一个或多个语句相对应,各个节点之间的连接关系与所述各语句之间的逻辑关系相对应。
优选的,本实施例中的网络信息的处理装置还包括:存储单元1012,与编译单元1008连接,用于在将所述特征信息编译成脚本信息之后,以及在按照所述脚本信息中各语句之间的逻辑关系建立与所述特征信息对应的抽象语法树之前,将编译得到的脚本信息以xml文件的形式存放到服务器中;解析单元1014,与存储单元1012和建立单元1010连接,用于在需要建立抽象语法树时,读取以xml文件的形式存储的脚本信息,并从所述xml文件中解析得到所述脚本信息。
优选的,本实施例中的判断单元1004包括:判断模块10041,用于判断所述加载的字段信息是否满足所述节点所对应的语句中描述的判断条件;若满足,则判断出所述抽象语法树中的节点所对应的语句成立;若不满足,则判断出所述抽象语法树中的节点所对应的语句不成立。
本实施例中网络信息的处理装置可以位于图1和图2中的一个硬件设备上,也可以分布式地位于图1和图2中的多个硬件设备上。此外,本实施例中抽象语法树的建立装置所执行具体的过程可以参考上述方法实施例中的描述(例如,上述对图1-8的描述),在此不再赘述。
根据本申请的技术方案,使用抽象语法树来判断待检测的网络信息是否属于违规商品信息。由于抽象语法树描述对于商品的处理方式时,可以采用分支流、复杂的文本匹配例如正则匹配等语法特性来编写商品处理方式的脚本,因此对于电子商务系统中的商品信息的处理具有良好的性能。此外,一条编写好的商品处理方式的脚本可以立即部署在商品发布的实时端,直接阻止违规商品的发布,因此对于违规商的发布的响应非常快,具有很高的处理效率。
显然,本领域的技术人员应该明白,上述的本申请的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本申请不限制于任何特定的硬件和软件结合。
以上所述仅为本申请的优选实施例而已,并不用于限制本申请,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。