论文网
首页 理科毕业石油矿藏正文

一种基于中文分词和数据聚合的餐饮行为特征挖掘方法

  • 投稿叶草
  • 更新时间2015-09-29
  • 阅读量416次
  • 评分4
  • 44
  • 0

刘为怀 才华 何东杰

(中国银联电子支付研究院 上海 201201)

摘 要 针持卡人使用银行卡进行日常交易时,通过商户类别码(MCC)可以判断交易商户是否为餐饮商户,但是无法进一步细分交易商户所属菜系。为了分析持卡人餐饮行为特征,提出了一种银联数据与外部数据相结合的数据聚合方法。选择百度地图餐饮数据作为外部数据,对不同菜系的餐馆名进行中文分词、清洗,形成区分不同菜系的教育期刊网 http://www.jyqkw.com
关键词 组。以银联大数据平台为基础,百度数据与银联数据通过MapReduce技术进行聚合。百度菜系的教育期刊网 http://www.jyqkw.com
关键词 组对银联餐饮商户进行菜系划分,带有菜系标签的银联餐饮商户数据与银联持卡人日常交易数据进行聚合,挖掘出持卡人餐饮行为特征。

教育期刊网 http://www.jyqkw.com
关键词 大数据,中文分词,数据挖掘,数据聚合,餐饮行为特征

中图分类号 TP3 文献标识码 A

doi:10.3969/j.issn.1674-7933.2015.04.006

作者简介:刘为怀,男,1981 年生,硕士,助理经理,主要从事及研究领域:大数据平台数据挖掘及数据聚合的研究,Email :liuweihuai@unionpay.com ;

才华,硕士,工程师;

何东杰,硕士,工程师。

0 引言

为了丰富持卡人画像,根据持卡人日常消费行为,对持卡人进行打标签。我们选择衣食住行中的食——餐饮进行研究,以2014年上海市持卡人消费数据作为研究对象,分析上海市持卡人在餐饮行业的消费行为特征。

银联数据只能识别商户是否为餐饮类,而无法进一步区分商户是中餐馆还是西餐馆等详细的菜系信息。因此,需要借助外部数据,补充银联商户菜系划分信息,并与银联交易数据相结合,形成持卡人餐饮基础数据,在此基础上,挖掘持卡人餐饮行为特征。

1 相关技术

本节主要介绍中文分词和数据聚合的相关知识,选择结巴分词进行中文分词,数据聚合使用基于Hadoop平台的MapReduce编程模型。

1.1 结巴分词

结巴分词是一个Python中文分词组件[1],结巴分词包含以下三种算法[2]:

1) 基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG);

2) 采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合;

3) 对于未登录词,采用了基于汉字成词能力的隐马尔科夫模型(HMM),使用了Viterbi算法。

结巴分词过程分为三步[3],具体如下:

1) 加载字典,生成trie树;

2) 给定待分词的句子,使用正则获取连续的中文字符和英文字符,切分成短语列表,对每个短语使用DAG查字典和动态规划,得到最大概率路径,对DAG中那些没有在字典中查到的字,组合成一个新的片段短语,使用HMM模型进行分词,识别字典外的新词;

3) 使用Python的yield语法生成一个词语生成器,逐词语返回。

1.2 MapReduce编程模型

MapReduce是Google于2004年提出的一个编程模型[4],是一个能够处理和生成超大数据集的算法模型的相关实现。为了能够快速处理超过1TB的数据,模型使用并行的方法将任务分配到数百个甚至千个计算节点。

MapReduce编程模型的原理是:利用一个输入key/value集合产生一个输出的key/value集合。MapReduce库的用户用两个函数表达这个计算:map和reduce。

map函数接受一个输入的key/value值,然后产生一个中间key/value值的集合。MapReduce把所有具有相同中间key值I的中间value值集合在一起后传递给reduce函数。

reduce函数接受一个中间key的值I和相关的一个value值的集合。reduce函数合并这些value值,形成一个较小的value值的集合。一般的,每次reduce函数只产生0或1个输出value值。

map和reduce函数概括如表1所示:

MapReduce的执行过程如图1所示,图左边是map任务运行示意图,右边是reduce任务运行示意图。

如图1所示,左边map阶段,当map任务开始运算并产生中间数据后,中间数据并非直接而简单的写入磁盘,MapReduce利用内存对中间数据进行缓存,并在内存中对中间数据进行一些预排序,优化整个map的性能。右边reduce阶段则经历了三个阶段:Copy→Sort→Reduce。我们能明显看出,其中Sort阶段采用的是归并排序,即merge sort。

2 特征挖掘

本节首先介绍餐饮行为挖掘流程,其次介绍分词、清洗,最后介绍了数据聚合以及在聚合数据基础上进行的特征挖掘。

2.1 挖掘流程

餐饮行为特征挖掘流程如图2所示,首先对百度餐饮数据进行分词、清洗,形成菜系教育期刊网 http://www.jyqkw.com
关键词 组,然后与银联商户数据进行聚合,形成带菜系标签的银联商户数据,然后与银联交易数据进行聚合,形成餐饮基础数据,以此为基础,挖掘出餐饮行为特征。

2.2 分词

调用百度地图Place API接口[5],下载不同菜系的餐馆详细信息,主要包括餐馆名称、经纬度、具体地址、联系电话、菜系分类、客户评价信息等。

从百度地图获取的餐饮数据包含了很多信息,但我们只需要其中的餐馆名称。通过字符串拆分、截断等技术提取含有餐馆名称的字段,存放在菜系文件中。

使用Python语言编写一个分词脚本,引入结巴中文分词模块,所有51个菜系的餐馆名称文件,逐一遍历,对餐馆名称进行分词,分词后的教育期刊网 http://www.jyqkw.com
关键词 ,存放在对应菜系的分词文件中。

2.3 清洗

分词后的教育期刊网 http://www.jyqkw.com
关键词 ,有很多无用符号、通用词语以及道路、街道、地区、学校、小区、商场的名称。上述教育期刊网 http://www.jyqkw.com
关键词 在各个菜系的分词文件中均有出现,导致不同菜系的教育期刊网 http://www.jyqkw.com
关键词 区分度下降,因此,需要对分词后的所有菜系的教育期刊网 http://www.jyqkw.com
关键词 进行清洗。

清洗工作分两个部分进行,首先建立一个过滤数组,将无用符号、通用词语以及道路、街道、地区、小区、学校、商场的名称放入过滤数组,然后对所有菜系的分词文件进行遍历,将分词文件中含有过滤数组的教育期刊网 http://www.jyqkw.com
关键词 进行剔除。

2.4 数据聚合

MapReduce实现数据聚合,本质上是通过MapReduce编程实现两个数据文件的笛卡尔乘积(join)。Hadoop中MapReduce过程按照先后顺序依次为:读取数据分块,map操作,shuffle操作,reduce操作,输出结果。简单来说,MapReduce的本质在于大而化小,分拆处理。为了实现两个数据文件的join,需要将两个数据文件中键值相同的元组放到同一个reduce结点进行连接。

在map阶段,map函数同时读取文件1和文件2,为了区分两种来源的key/value数据对,对每条数据打一个标签(如图3中的Tag)[6],比如:Tag=Customers表示来自文件1,Tag=Orders表示来自文件2。同时将map操作输出的key值设为两个数据文件的连接键(如图3中的Group key),即map阶段的主要任务是对不同文件中的数据进行打标签和设置连接键。

在shuffl e阶段,Hadoop中默认的partitioner会将key值相同的map输出发送到同一个reduce结点。

在reduce阶段,reduce函数获取key值相同的来自文件1和文件2的value list, 然后对于同一个key,对文件1和文件2中的数据进行join,即reduce阶段进行实际的连接操作。整个join过程如图3所示。

在餐饮行为特征挖掘过程中,共有两次数据聚合,第一次是银联商户数据与百度菜系教育期刊网 http://www.jyqkw.com
关键词 的聚合,第二次是银联交易数据与带菜系标签的银联商户数据的聚合。

银联商户数据与百度菜系教育期刊网 http://www.jyqkw.com
关键词 的聚合,由于只有51个菜系,每个菜系的教育期刊网 http://www.jyqkw.com
关键词 数量有限,因此将不同菜系教育期刊网 http://www.jyqkw.com
关键词 转换为二维动态数组,数组第一维表示菜系,数组第二维表示各个菜系的教育期刊网 http://www.jyqkw.com
关键词 。MapReduce逐条读取银联商户数据,获取餐饮商户名称,遍历所有菜系教育期刊网 http://www.jyqkw.com
关键词 ,判断商户名称是否包含菜系教育期刊网 http://www.jyqkw.com
关键词 ,将商户打上对应的菜系标签,形成带菜系标签的银联商户数据。

银联交易数据与带菜系标签的银联商户数据的聚合,由于两个数据文件都很大,因此需要MapReduce实现join。在map阶段,设置银联交易数据的Tag=0,带菜系标签的银联商户数据的Tag=1,商户号作为Groupkey,在reduce阶段实现了银联交易数据与带菜系标签的银联商户数据的join,形成餐饮基础数据。

2.5 特征挖掘

经过对持卡人餐饮行为的分析和调研,总结出六种餐饮行为特征: 菜系分布、爱吃菜系、青睐口味、就餐人群、就餐档次、就餐时间。分别对每一个特征进行挖掘。

1) 菜系分布,表示持卡人在不同菜系餐馆的消费分布情况。餐饮基础数据包含所有银联持卡人在餐饮行业的消费记录,以及所有餐馆所属菜系。通过MapReduce程序,以餐饮基础数据作为输入,持卡人卡号为key,统计持卡人在所有菜系的消费情况,包括消费次数和消费金额,形成持卡人菜系分布数据。以持卡人菜系分布数据作为输入,通过MapReduce程序,持卡人卡号为key,统计持卡人年度消费菜系个数。

2) 爱吃菜系,表示持卡人在所有菜系中最爱吃哪一个菜系。通过MapReduce程序,以持卡人菜系分布数据作为输入,持卡人卡号为key,优先比较消费次数,次数相同则比较消费金额,找出持卡人消费次数或金额最多的菜系,即是持卡人爱吃菜系。

3) 青睐口味,表示持卡人喜欢吃什么口味的菜。口味分为酸、甜、咸、辣、海鲜、淡六种。根据菜系本身的特点,将其划分到对应的口味。青睐口味计算需要两步,分别用两个MapReduce任务依次实现。第一步,以持卡人菜系分布数据作为输入,持卡人卡号为key,每一个口味对应的所有菜系就餐次数进行累加,形成持卡人口味分布数据;第二步,以持卡人口味分布数据作为输入,持卡人卡号为key,比较所有口味的就餐次数,就餐次数最多的口味,即是持卡人青睐口味。

4) 就餐人群,表示通过持卡人就餐行为将持卡人划分为不同就餐人群。就餐人群主要分为爱吃中餐、爱吃西餐、爱吃料理、爱吃东南亚菜、工作餐、爱吃零食六种。参考百度地图餐饮、大众点评等对菜系的分类,中餐、西餐、料理、东南亚菜、零食分别包含不同的菜系,工作餐通过快餐来定义。持卡人所属就餐人群计算,通过MapReduce程序,以餐饮基础数据作为输入,持卡人卡号为key,在map阶段,每一个就餐人群对应的所有菜系次数进行累加,在reduce阶段,对每一个持卡人,比较其在六种就餐人群的消费次数,消费次数最多的就餐人群,即可确定为该持卡人所属就餐人群。

5) 就餐档次,按照持卡人次均消费金额划分为五个档次。大众点评按照人均消费划分为五个档次,本文引入了大众点评的人均消费划分,按照每次2~3人就餐,作为次均消费金额划分标准,如表2所示。通过MapReduce程序,以银联交易数据作为输入,持卡人卡号为key,在map阶段,统计持卡人每次消费金额,消费次数设为1,在reduce阶段,首先对持卡人消费金额和消费次数进行累加,计算出次均消费金额,然后根据次均消费金额判断持卡人所属就餐档次。

6) 就餐时间,表示持卡人在什么时间最爱外出就餐。就餐时间分为早餐、午餐、晚餐、夜宵四个时间段,如表3所示。通过MapReduce程序,以银联交易数据作为输入,持卡人卡号为key,在map阶段,获取持卡人消费时间属于四个时间段中的哪一个,设置持卡人四个时间段对应的消费金额和次数,在reduce阶段,首先分别累加四个时间段的消费金额和消费次数,然后优先比较消费次数,找出次数最多的一个时间段,如果次数相同,则比较消费金额,找出对应的时间段,即为持卡人最爱外出就餐时间。

3 结果分析

对2014年上海持卡人在餐饮行业的消费行为进行挖掘,分析持卡人在菜系分布、爱吃菜系、青睐口味、就餐人群、就餐档次、就餐时间等餐饮行为特征,挖掘出如下几个规律。

1) 上海人最爱吃粤菜

首先计算出所有持卡人的最爱菜系,然后计算51个菜系的消费人群数量,结果如图4所示,上海人最爱吃的菜系前三名分别是粤菜、披萨、中式快餐。

2) 上海人爱吃酸

以持卡人青睐口味数据为基础,进行口味挖掘,发现上海地区,爱吃酸的人群最多,六种口味分布如图5所示。

3) 上海人最爱在一个菜系消费,年度消费菜系最多达到39个

以持卡人菜系分布数据为基础,统计上海人2014年度消费的菜系个数,只在一个菜系消费过的人数排在第一,数据优势明显,如图6所示,其中拖尾部分,有持卡人2014年共在多达39个菜系消费过。

4) 超过一半的上海人,次均就餐金额小于100元次均就餐金额小于100元的人群占53.8%,超过一半,如图7所示,其中另一个有意思的现象是,次均就餐金额大于400元的人群排在第二位,超过二、三、四档就餐人群。

5) 和早餐比,上海人更爱吃夜宵首先计算出持卡人在哪个时间段最爱外出就餐,然后统计4个时间段最爱外出就餐人数,发现爱吃夜宵的人数多于爱吃早餐的。

6) 除了中西餐,上海人最爱工作餐以持卡人就餐人群数据为基础,分别统计爱吃中餐、爱吃西餐、爱吃料理、爱吃东南亚菜、工作餐、爱吃零食六种就餐人群,除了大家达成共识的中餐、西餐,在上海,工作餐人数最多,工作餐主要是以中式快餐和西式快餐构成,从侧面反映了上海是一个快节奏的城市。

4 总结

持卡人餐饮行为特征从饮食的角度,刻画了持卡人日常行为,由于银联交易数据的限制,无法直接进行餐饮行为特征挖掘,因此,从外部发掘餐饮数据,对其进行分词,清洗,以银联大数据平台为基础,补充银联商户数据,与银联交易数据进行数据聚合,形成银联餐饮行为特征基础数据,进行餐饮行为特征挖掘工作。数据结果显示,按照此方法,不仅可以挖掘出持卡人个体的餐饮行为特征,而且能够挖掘出某一地区持卡人群体的餐饮行为特征。

教育期刊网 http://www.jyqkw.com
参考文献

GitHub.结巴中文分词. h t t p : / / w w w. i t e y e . c o m /news/26184-jieba

Django梦之队. 对Python中文分词模块结巴分词算法过程的理解和分析. http://ddtcms.com/blog/archive/2013/2/4/69/jieba-fenci-suanfa-lijie/

CSDN. jieba 分词源代码研读.

http://blog.csdn.net/rav009/article/details/12220977OSDI´04, MapReduce:Simplified Data Processing onLarge Clusters.

百度. Place API开发指南.

http://developer.baidu.com/map/index.php?title=webapi/guide/webservice-placeapiITEYE. MapReduce之Join操作.

http://bjyjtdj.iteye.com/blog/1453410