具体实施方式
本申请实施例提供一种甄别重复实体数据的方法和系统。
为了使本技术领域的人员更好地理解本申请中的技术方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
本申请涉及的系统结构可以如图1所示,包括服务器和数据库。
以下介绍本申请甄别重复实体数据方法实施例,图2示出了该方法实施例的流程,如图2所示:
S201:服务器获取待甄别的实体数据。
这里的实体在可以具体化为店铺,在后续中以店铺实体为例进行说明。
待甄别的店铺实体的数据包括店铺名称、店铺地址和店铺电话号码等属性的数据。这些数据可以作为比较待甄别店铺是否与数据库中已有店铺重复的依据。
S202:服务器将待甄别的实体数据与数据库中预定量的实体数据逐一比较实体名称,该逐一比较过程包括:
利用预置的不同词性的分词词库对待甄别实体名称及数据库中的实体名称进行分词并确定词性;其中,数据库中的实体名称分词、确定词性可以提前完成;
将经过分词并确定词性的待甄别店名及数据库中的实体名称分别填入预定的模板;
通过比较待甄别店名和数据库中实体店名在所述模板中对应词性的词是否相同得到实体名称比较的评分。
S203:服务器通过比较评分与预定标准分来判断所述待甄别的实体数据与数据库中的实体数据是否重复。
以下具体介绍S202中实体名称比较的实现方式,其是将待甄别的实体的名称与数据库中的实体名称进行比较,这个比较过程,包括图4所示的步骤:
S401:利用预置的不同词性的分词词库对待甄别实体名称及数据库中的实体名称进行分词并确定词性。
通过分词词库将店名进行分词,将店名中的各个词按其所属的预定义词库,并按照该预定义词库的词性,为店名中的词标记词性(这里的例子中设定不同词性标记为S、P、C、O、N、X等)。
例如,“西安华德餐饮有限公司德克士高新餐厅”这样的店名通过店名分词处理可以得到“西安_S华德_X餐饮有限公司_O德克士_N高新_S餐厅_O”这样的结果。
为了对实体名称进行分词,并在分词之后能够标识各个分词标识属性(地点、机构、行业等),需要预先保存按词性分类的分词库,比如地域词库,地点词库,机构词库,行业词库,方位词库、主店名、分店名等。为了提高分词准确率,添加品牌分词库,在该词库中收集了店铺的店铺品牌名称,例如,麦当劳,肯德基,外婆家等店铺的品牌名称。
本实施例的例子中,对实体名称(如店铺名称)做以下维度切分:
表2
以下分别对上面的各分词库加以介绍:
地域词库:其中收录的是全中国各省,市,镇,乡,村的名称。另外在该词库中还会保留一份去除地区谓词的分词,例如,会同时收录浙江省和浙江,杭州市和杭州,萧山市和萧山,华西村和华西。省,市,镇,乡,旗,村也作为地域分词收录在本词库中。本词库相对比较固定不会有很大变化。
地点词库:其中收录地点中以街道,社区,路,街,巷,里,弄,大道,新村,市场,广场,大厦,厂房,店,路口,胡同结尾的地点名词,街道,社区,路,街,巷,里,弄,大道,新村,市场,广场,大厦,厂房,店,路口,胡同本身也是该词库中的分词。
机构词库:将所有机构词分成8个类别。分别是综合服务,休闲娱乐,购物广场,餐饮美食,生活资讯,出行/旅游,地物,公司/工厂。另外,对于店铺的分类存在模糊区域,就是一家店有可能既属于生活资讯类别又属于出行/旅游类别。在这种情况下对机构词分类采用优先匹配的原则,如图5所示。通过图5所示,机构词分类优先级别按照箭头所指的方向由高到低排列。例如,有一个机构分词“网吧”既有可能出现在休闲娱乐类别中,也有可能出现在生活资讯中。按照图5优先级所示,休闲娱乐的有限级要比生活资讯的优先级高,因此,“网吧”应该属于休闲娱乐类的机构分词。本申请对机构的分类方法以及机构分类的优先匹配原则并不做限定。
行业词库:类似于店,分店,总店,苑,轩,多个行业类别公用的分词会放入一个独立的词库。例如:杭州东方建材公司萧山分店,和知味观上城分店,店名中都有“分店”这个词,但是“分店”既属于公司/工厂有属于餐饮,所以并不能将“分店”收入在其中一个词库中,必须将“分店”这个词收录到一个无行业机构的单独的文件词库中。类似于“分店”的词还有,店,队,楼,城,座,社,行,店,会,堂,室,铺等。
主店名词库、分店名词库:为了提高分词准确率,添加品牌分词库,在该库中搜集了口碑网(www.koubei.com)所有店铺的店铺品牌名称,例如,麦当劳,肯德基,外婆家店铺的品牌名称。
词库中的词有以下特点,品牌词小于两个字,或者大于六个字的不收录。不能存在和店铺行业或者机构词库中已经存在的分词。
这里对词性作出介绍:
N品牌词
O机构词
C行业词
S地域词
P地点词
X未分出的词
SN分店名品牌词
PS地域词
FN附属机构分词
对于FN,例如某酒店XX洗浴中心,其中XX的词性就是FN,再例如某公司XX停车场,其中的XX的词性就是FN。
利用上述分词词库对待甄别实体名称及数据库中的实体名称进行分词并确定词性,具体可以如下执行:
A1:利用预置的不同词性的分词词库对待甄别实体名称及数据库中的实体名称进行正向分词和反向分词。
正向分词是按照词库将店名从左到右进行分词,反向分词是按照词库将店名从右到左进行分词。例如,将店名为“洋芋餐馆航天桥店”的店铺按照正向分词得到的结果为“洋芋_餐馆_航_天桥_店”,按照反向分词得到的结果为“洋芋_餐馆_航天_桥_店”。“洋芋餐馆航天桥店”分别进行正向分词和反向分词得到的词表如下面表3和表4所示:
分词 |
词长度 |
词性 |
洋芋 |
2 |
N |
餐馆 |
2 |
C |
航天 |
2 |
N |
桥 |
1 |
N |
店 |
1 |
N |
表3.正向分词结果
分词 |
词长度 |
词性 |
洋芋 |
2 |
N |
餐馆 |
2 |
C |
航 |
1 |
N |
天桥 |
2 |
N |
店 |
1 |
N |
表4.反向分词结果
这里分词采用短路方法,每个词只有一个词性。所谓短路方法,就是在第一步分词,到词库中查找匹配的词,如果找到了匹配的词就马上退出,进而转向下一词的匹配,这样就能保证按照词库分出词的词性没有二义性。
最大匹配字数可以设定为10,从左到右对这最大为10个字的词进行分词。一次性获取这10个字,在词库中验证这10个字是否是一个词,如果是,则将这10个字组成的词标注词性并且结束,如果不是,则从左到右取9个字,验证是否能组成一个词,经过验证如果能在词库中找到匹配的词,则结束。如果不是则将原字串减少一个字,再到词库中进行匹配,以此类推直到字串中只剩下一个字为止。
由上面的例子,显然的,通过正向分词和反向分词得到了不同的分词结果,那么就需要一个选择采纳哪个结果作为最后分词结果的处理流程。这个流程就是下一步需要说明的消歧。
A2:对正向分词和反向分词得到的词表进行消歧处理以得到唯一的分词结果。
这里消岐处理包括如下三个规则:
规则I:以划分出非X词性的词为主进行消岐。
例如:上海_S南站_P餐馆_O,上_X海南_S站_X餐馆_O,其中歧义词是“上海_S南站_P”,“上_X海南_S站_X”,这时取第一个分出非X词性的词即“上海_S南站_P”为正确结果。
规则II:以X词性最少的词为主进行消岐。如对“美食馆”按照A1进行正向分词和反向分词的结果分别为“美食_C馆_O”,“美_X食馆_O”,而,前者分出的词性“美食_C馆_O”中X词性的词最少,按照规则II,以“美食_C馆_O”为准。
规则III:以反向分词结果为正确结果。
分词 |
词长度 |
词性 |
洋芋 |
2 |
N |
餐馆 |
2 |
C |
航 |
1 |
N |
天桥 |
2 |
N |
店 |
1 |
N |
表5.进行消岐处理后得到的分词结果
另外,分词优先顺序可以设定为如下:品牌(N),机构(O),行业(C),无行业机构(O),地点(P),地域(S)。例如,如果在词库中在品牌库和机构库的字典中都有一个词是“小店”,此时正好有一个店铺叫“美食小店”,那么分词之后的结果是“美食_C小店_N”,而不是“美食_C小店_O”,因为N词库中的优先级比词库O词库中的词的优先级高。
还可以包括A3:单字词处理过程。
消歧之后可能存在无法识别的部分,当不能识别的X词性部分的长度只有一个字的时候就需要进行单字词处理,以识别其词性。例如:
如果右单字词是餐饮行业后缀词,左词是行业词或品牌词,左词和右词合并,词性以左词为准。
如上例,分词结果为”航天C_桥X_店O”,将中间的“桥”消歧之后与左词和右词合并成为一个新的词“航天桥店_C”
如果右词是餐饮行业前缀词,右后词(右词后第一个词)是行业词或品牌词,将右词与右后词合并,以右后词词性为准。
如果右词是机构后缀词,左词是机构词或品牌词,将左,右词合并,以左词词性为谁。
如果右词是机构前缀词,右后词是机构或品牌词性,右词和右后词合并,以右后词词性为准。
S402:将经过分词并确定词性的待甄别店名及数据库中的实体名称分别填入预定的模板。
例如,模板的格式可以如下,其中的数字表示该词性在这个模板中的前后顺序排序号:
0:N 1:S 2:P 3:PS 4:C(描述主店行业)5:O 6:SN(描述SN的行业)7:C 8:O9:FN
将得到的分词结果,即前述经过分词并确定词性的待甄别店名及数据库中的实体名称,按照词性填入模板之中。
例如,待甄选的店铺分别为“佐登妮丝国际美容建国店”和“佐登妮丝”。
“佐登妮丝国际美容建国店”分词分成:0-N|1-C|2-SN|3-O(品牌|行业|分店|机构)
“佐登妮丝”分词分成:0-N(品牌)
将这两个待甄选的店铺名称填入模板后结果为:
表6
S403:通过比较待甄别店名和数据库中实体店名在所述模板中对应词性的词是否相同得到实体名称比较的评分。
通过比较待甄别店名和数据库中实体店名在所述模板中对应词性的词是否相同,可以得到实体名称比较的评分。例如:
将填入模板的待甄别店名与实体店名进行比较,具体的,每个位进行比较,1是相同,0是不同;将各位比较结果存放在一个二进制数组中,将二进制数组转化为十进制数作为比较结果的一部分返回。
标记店铺两两比较过程中各个分店名,主行业,主机构词是否是相同状态,所谓是否是相同状态,就是两个分店名是否都是空或者是否都是有数据的。
店名比较评分结果是依据店名各词性的比较结果来决定的,比较规则如下:
至于如何得到实体名称比较的评分,这里仅给出一些示例性的例子,例如:
I:如果店铺的店名主体不相等的话直接返回0;
II:如果比较结果是511(511通过二进制转换得来,转换方式参考下文论述),且4个位上的比较结果都是1,那么店名判断结果为完全相等,返回100;
否则:
各个位比较的结果与16进行与操作,结果不等于16,则返回75;或,
各个位比较的结果与32进行与操作或与64进行与操作,如有一个以上的结果为0,则返回75;或,
各个位比较结果中分店名的状态(SN)返回为0,则返回75;或,
各个位比较的结果与1进行与操作,如果结果为0,则返回2;或,
各个位比较的与8进行与操作,如果结果为0,则返回2;或,
各个位比较的结果如果大于0,则返回75;或,
其它情况返回0。
按照上述规则,将表6中的各分词词性进行比较,可以得到下面的表7,其中y表示相同:
N |
S |
P |
PS |
C |
O |
SN |
C |
O |
FN |
y |
y |
y |
y |
y |
y |
y |
y |
y |
y |
表7
各个词性比较结果如上所示。
如果两个词性相同的分词比较结果是y则权值为1,并且得分要去除最前面的品牌词N。留下9位比较结果为111111111,得分为1×29+1×28+1×27+1×26+1×25+1×24+1×23+1×22+1×2+1×20=511。最后得分为511,说明店名完全相等,返回100。
再例如,有待甄选的店铺如下:
店铺名称 |
店铺地址 |
电话号码 |
水晶月设计中心 |
文一路217号(杭州师范学院斜对面) |
88828282 |
水晶月发艺沙龙 |
文一路217号 |
88828282 |
表8
以上表格中两家店铺进行比较首先将店名进行分词:
“水晶月设计中心”分词分成:1-N|2-O(品牌|机构)
“水晶月发艺沙龙”分词分成:1-N|2-O(品牌|机构)
按照店名比较规则将分词之后的各分词词性进行比较如下表:
N |
S |
P |
PS |
C |
O |
SN |
C |
O |
FN |
y |
y |
y |
y |
y |
n |
y |
y |
y |
y |
表9
按照比较结果主店名机构不相等,比较结果为495,与25做与操作的结果为0,因此店名不相等。
但是对于表8中的例子,根据店铺地址和电话号码,很明显的,“水晶月设计中心”和“水晶月发艺沙龙”这两个实体为重复实体。对于这种情况,在实体名称比较评分的基础上,还可以包括:根据实体名称比较结果和电话号码确定实体数据是否重复,或根据实体名称比较结果和地址确定实体数据是否重复。如上面表8的例子中,尽管名称比较结果的评分为不重复,但是参考电话号码为相同,可以确定结果为重复。再或者,尽管名称比较结果的评分为不重复,但是参考地址为相同,可以确定结果为重复。
S401中还可以包括:
S401’:将经过分词并确定词性的待甄别店名及数据库中的实体名称分别进行模式匹配,从模式规则文件中找到该规则所匹配的模式规则,从而将名称中的分词标记上词性。
经过S401处理后,店名中还有部分词我们无法识别,而且,标识为N的词可能是店铺主店名,也可能是店铺分店名,而分店名和主店名在店铺名称对比过程中起的作用是不同的。这样,就需要将分词结果匹配成不同的模式。比如,“西安_S华德_X餐饮有限公司_OD德克士_N高新_S餐厅_OD”的规则是S-X-O-N-S-O,在已经得到结果中规则是S-X-O-N-S-O,大部分的结果都可以将第二个X认定为一个品牌,第四个N认定为SN分店名称,所以,可以将S-X-O-N-S-O规则匹配为0-S|1-N|2-O|3-SN|4-S|5-O,经过统计这些规则可以枚举出将近400条,占到了总规则的90%以上。
以下是存在的一些常用规则:
其中,X表示未确定词性的分词。
以上是截取了规则文件中的某一段规则,每条规则的格式以等号为分界分为左右两部分,左边的是店名分词之后标注了词性的分词结果(词性标识顺序,按照分词在店名中的先后顺序排列),右边部分是将左边分词结果按照概率统计的原则匹配成的规则模式。
生成这份规则文件的过程如下:
B1:将现有所有黄页店铺的店名用分词模块分词并且标注词性。
B2:将分词结果按照词性分类。
例如,将所有分词结果属性为“X-O-O”的分到一个组中,并且统计每组中的个数。
B3:剔除个数不超过一个的低频率组不作后续处理。因为这些店铺名称不具有共性因而不具有参考价值。
还可以引入人工操作,凭借人工的经验,判断分词结果中的“X”部分应该标为哪个词性。也有可能,原先是“C”、“O”、“P”词性的分词根据判断有可能应该为其他词性。
规则匹配的作用就是将原先机器判断有可能失误,通过实现人工筛选校验生成规则文件,在自动化处理的时候有效地纠正机器的错误判断,因此可以提高最终分词判断的正确性。
在本处理步骤执行中,当得到一个规则,就从模式规则文件中查找该规则所匹配的模式规则,当找到后就可以将店名中的分词标记上词性了。
所述方法实施例还可以包括:
S204:服务器将判断为不重复的实体数据添加入所述数据库中。
S202中,以店铺作为实体为例,存储现有黄页店铺数据可以采用postgresql数据库,由于postgresql支持全文索引,并且支持分布式集群,由于这两个优点,可以在本步骤中使用postgresql数据库来存储现有店铺数据。图3示出了postgresql数据库集群拓扑图。在进行店铺去重之前首先需要将现有所有黄页店铺数据存入四个数据节点,具体一个店铺数据保存在哪个数据节点上,是按照事先定好的hash算法规则制定的,规则如下:
店铺id是32位的guid,取主键的第一位,当第一位的值为0~3存储在newkoubei节点上,当第一位的值为4~7存储在datanode1节点上,当第一位的值为8~b存储在datanode2节点上,当第一位的值为c~f存储在newkoubei节点上。
S202中,所述数据库中预定量的实体数据,可以是数据库中的所有实体数据。这样意味着S202中需要将待甄别的实体数据与数据库中所有的实体数据进行逐一的比较。
此外,数据库中预定量的实体数据,可以是数据库中的部分实体数据,例如,本实施例中给出,这个部分实体数据为从数据库的所有实体数据中筛选出来的怀疑实体数据。这样意味着,S202中将待甄别的实体数据与筛选出的怀疑实体数据进行逐一对比。
实体以店铺为例,部分实体数据这里具体为怀疑店铺。怀疑店铺,基于上述利用postgresql数据库的全文索引机制进行全文匹配查找,可以找到所有匹配的店铺数据。
在系统构建过程中,可以将所有黄页店铺数据导入到图3所示的分布式数据库中,根据数据分发hash算法会将所有黄页店铺数据平均地分发到图3的四个数据节点中。
每个数据节点中可以保存有黄页店铺的表,表的结构可以如下所示:
表1
以上表格中的indexcontent字段的数据类型是tsvector类型的,在系统初始化过程中会将店铺名称与地址名通过分词处理,生成以空格符作为分界的字符串作为indexcontent字段的初始化值。
查找怀疑店铺的流程分为以下步骤:
将待查找的黄页店铺的店铺名和分店名以空格连接,生成以空格分界的分词串;
通过上述得到的分词串,与表1中的indexcontent(倒排索引类型字段)进行匹配查找;
合并各个数据节点上的查询结果,生成怀疑店铺查询结果集合。例如这里是四个数据节点。
生成怀疑店铺查询结果集,可以按照分词串在各个数据节点上1中的indexcontent进行匹配得到。具体过程可以是:首先通过上一步生成的以空格分隔的查询字符串和店铺所在城市id(city)组合生成sql语句。例如,有一家店铺的名称为“水晶月设计中心”将店名分词之后得到“水晶月_N,发艺_X,设计中心_OB”的结果,然后将分词属性去掉,组装成“水晶月设计中心”,然后组装生成sql语句:
用该sql语句对数据节点进行查询,生成的结果集就是下一步需要的店铺重复怀疑对象。
由以上本申请实施例提供的技术方案可见,服务器获取待甄别的实体数据,服务器将待甄别的实体数据与数据库中预定量的实体数据对实体名称逐一进行比较并得到评分,服务器通过比较评分与预定标准分来判断所述待甄别的实体数据与数据库中的实体数据重复,可以高效的甄别出重复的实体数据。
以下介绍本发明一种服务器的实施例,图6示出了该服务器实施例的框图,包括:
获取单元61,用于获取待甄别的实体数据;
名称比较单元62,用于将待甄别实体数据的名称与数据库中预定量的实体数据的名称通过下述方式逐一比较实体名称:
利用预置的不同词性的分词词库对待甄别实体名称及数据库中的实体名称进行分词并确定词性;将经过分词并确定词性的待甄别店名及数据库中的实体名称分别填入预定的模板;通过比较待甄别店名和数据库中实体店名在所述模板中对应词性的词是否相同得到实体名称比较的评分;其中,数据库中的实体名称分词、确定词性可以提前完成;
判断单元63,用于通过比较评分与预定标准分来判断所述待甄别的实体数据与比较的数据库中的实体数据是否重复;
添加单元64,用于将判断为不重复的实体数据添加入所述数据库中。
优选地,所述数据库中预定量的实体数据包括数据库中的所有实体数据或部分实体数据。
优选地,所述部分实体数据包括从所述数据库的所有实体数据中的筛选出来的怀疑实体的数据。
优选地,所述服务器还可以如图7所示,还包括筛选单元65,用于将待查找出的店铺名和分店名以空格连接,生成以空格分界的分词串;
通过上述所得到分词串,与表1中的indexcontent(即倒排索引类型字段)进行匹配查找;
合并四个数据节点上的查询结果,生成怀疑店铺查询结果集合。
优选地,所述服务器还可以如图8所示,所述名称比较单元62包括:
分词单元621,利用预置的不同词性的分词词库对待甄别实体名称及数据库中的实体名称进行分词并确定词性;
模板单元622,将经过分词并确定词性的待甄别店名及数据库中的实体名称分别填入预定的模板;
评分单元623,通过比较待甄别店名和数据库中实体店名在所述模板中对应词性的词是否相同得到实体名称比较的评分。
优选地,所述服务器还可以如图9所示,所述分词单元621包括正向分词单元6211和反向分词单元6212,分别利用预置的不同词性的分词词库对待甄别实体名称及数据库中的实体名称进行正向分词和反向分词;
相应地,所述分词单元621还包括消岐单元6213,用于对正向分词和反向分词得到的词表进行消歧处理以得到唯一分词结果。
优选地,所述服务器还可以如图10所示,还包括模式匹配单元624,用于将经过分词并确定词性的待甄别店名及数据库中的实体名称分别进行模式匹配,从预置的模式规则文件中找到所述名称所匹配的模式规则,从而将所述名称中的分词标记上词性。
为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本发明时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本发明可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例或者实施例的某些部分所述的方法。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本发明可用于众多通用或专用的计算系统环境或配置中。例如:个人计算机、服务器计算机、手持设备或便携式设备、平板型设备、多处理器系统、基于微处理器的系统、置顶盒、可编程的消费电子设备、网络PC、小型计算机、大型计算机、包括以上任何系统或设备的分布式计算环境等等。
本发明可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本发明,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
虽然通过实施例描绘了本发明,本领域普通技术人员知道,本发明有许多变形和变化而不脱离本发明的精神,希望所附的权利要求包括这些变形和变化而不脱离本发明的精神。