基于Spark的大数据精准营销中搜狗搜索引擎的用户画像挖掘_搜狗引擎提交
基于Spark的大数据精准营销中搜狗搜索引擎的用户画像挖掘由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“搜狗引擎提交”。
基于Spark的大数据精准营销中搜狗搜索引擎的用户画像挖掘
近期参加了CCF举办的“大数据精准营销中搜狗用户画像挖掘”竞赛,最终得到复赛第32名。正好这学期《机器学习与数据挖掘》课程需要一个实验报告的大作业,于是就那它来写了。本博文会在这几周不断的完善更新ing
1.选题背景与意义
1.1 用户画像与精准营销
“用户画像”是近几年诞生的名词。很多营销项目或很多广告主,在打算投放广告前,都要求媒体提供其用户画像。在以前,大多媒体会针对自身用户做一个分类,但是有了大数据后,企业及消费者行为带来一系列改变与重塑,通过用户画像可以更加拟人化的描述用户特点。
用户画像,即用户信息标签化,就是企业通过收集与分析消费者社会属性、生活习惯、消费行为等主要信息的数据之后,完美地抽象出一个用户的商业全貌,可以看作是企业应用大数据技术的基本方式。用户画像为企业提供了足够的信息基础,能够帮助企业快速找到精准用户群体以及用户需求等更为广泛的反馈信息。
消费方式的改变促使用户迫切希望尽快获取自己想要了解的信息,所以说,基于用户画像上的精准营销不管对企业还是对用户来说,都是有需求的,这会给双方交易带来极大便捷,也为双方平等沟通搭建了一个畅通平台。
1.2 搜索引擎下用户画像的挑战
在搜索引擎下,由于搜索引擎本身使用方式的特殊性、用户的流动性、查询的实时性等,带来了与企业传统的对用户信息进行收集与分析有着巨大的不同、更加艰巨的挑战。
例如,我们实时获取到的是用户的查询语句,而由于用户的流动性,并不能直接获取到如年龄、性别、学历等用户的标签信息。这么一来,也就无法根据用户属性对用户进行分群处理,而后再通过推荐系统进行产品上的优化
1.3 本文内容概要
本文内容概要如下:
第1章:简介用户画像与搜索引擎下用户画像的精准营销的挑战。第2章:说明实验集群、数据与课题研究目标。
第3章:介绍使用分词工具对用户的搜索词列进行分词,以及相关的优化方案。第4章:介绍在分词的基础上,对文本进行特征的抽取与转换,以及相关的优化方案。第5章:介绍在原始特征向量上,进行聚类与降维。第6章:介绍实验中试验过各分类模型 第7章:介绍模型参数调优
第8章:总结本课题研究中不足与展望后续的优化方案 第9章:参考文献 2.课题实验准备
2.1 Spark集群
节点 cdh01 cdh02 cdh03 cdh04 备注
8核,32G内存,角色:Spark Master,HDFS NameNode,Spark Worker,HDFS DataNode 8核,12G内存,角色:Spark Worker,HDFS DataNode 8核,12G内存,角色:Spark Worker,HDFS DataNode 8核,12G内存,角色:Spark Worker,HDFS DataNode 2.2 数据集
数据文件 备注
Train.csv 带标注的训练集 Test.csv 测试集 2.3 数据介绍
本数据来源于搜狗搜索数据,ID经过加密,训练集中人口属性数据存在部分未知的情况(需要解决方案能够考虑数据缺失对算法性能的影响)。数据所有字段如下表所示:
字段 ID age 说明 加密后的ID 0:未知年龄;1:0-18岁;2:19-23岁;3:24-30岁;4:31-40岁;5:41-50岁;6: 51-999岁
Gender 0:未知1:男性2:女性
Education 0:未知学历;1:博士;2:硕士;3:大学生;4:高中;5:初中;6:小学 Query List 搜索词列表 2.4 数据示例
对于train.csv中的数据记录:
00627779E16E7C09B975B2CE13C088CB 4 2 0 钢琴曲欣赏100首 一个月的宝宝眼睫毛那么是黄色 宝宝右眼有眼屎 小儿抽搐怎么办 剖腹产后刀口上有线头 属羊和属鸡的配吗 2.5 课题任务描述
根据提供的用户历史一个月的查询词与用户的人口属性标签(包括性别、年龄、学历)做为训练数据,通过机器学习、数据挖掘技术构建分类算法来对新增用户的人口属性进行判定。
3.查询词分词
3.1 NLPIR
NLPIR汉语分词系统(又名ICTCLAS2013),主要功能包括中文分词;词性标注;命名实体识别;用户词典功能;支持GBK编码、UTF8编码、BIG5编码。新增微博分词、新词发现与关键词提取;张华平博士先后倾力打造十余年,内核升级10次。
全球用户突破20万,先后获得了2010年钱伟长中文信息处理科学技术奖一等奖,2003年国际SIGHAN分词大赛综合第一名,2002年国内973评测综合第一名。
我们传入每个用户的搜索词列,表经过NLPIR分词工具得到的分词。之后,我们做个进一步的优化策略:
3.1.1 去停用词
我们根据分词后词语所带的词性,对一些特征代表性不够强的词语进行过滤:
for(int i = 0;i
char cc = sbtmp.charAt(i);
if(cc == ' '){
sbtmp.deleteCharAt(i);
--i;
} else if(cc == '/'){
// 去词条件
Boolean isdel =
// 1.去标点
(i + 1
// 2.疑问词
||(i + 2
&& sbtmp.charAt(i + 2)== 'y')
// 3.数字
||(i + 1
// 4.连词
||(i + 1
// 5.副词
||(i + 1
// 6.叹词
||(i + 1
// 7.拟声词
||(i + 1
// 8.介词
||(i + 1
// 9.量词
||(i + 1
// 10.助词
||(i + 1
// 11.纯动词
||(i + 2
&& sbtmp.charAt(i + 2)== ' ');
// 去词
if(sbtmp.charAt(i + 1)!= 'n' && sbtmp.charAt(i + 1)!= 'i' && sbtmp.charAt(i + 1)!= 'j'
&& sbtmp.charAt(i + 1)!= 'h'
&&!(i + 2
while(i + 1
sbtmp.deleteCharAt(i + 1);
}
while(i >= 0 && sbtmp.charAt(i)!= ','){
sbtmp.deleteCharAt(i);
--i;
}
}
// 若无需去词,把‘/’转为‘,’,并去除随后的词性标志
else {
sbtmp.setCharAt(i, ',');
while(sbtmp.charAt(i + 1)!= ' '){
sbtmp.deleteCharAt(i + 1);
}
}
}
}
for(int i = 1;i
sbtmp.deleteCharAt(i);
--i;
}
// 去中间单个字
else if(sbtmp.charAt(i1);
sbtmp.deleteCharAt(i1] == Y[j1][j1][j];
//删除X第i个字符
t1 = t1
//删除Y第j个字符
t1 = t1
dp[i][j] = t1 + 1;
这里我们所使用的优化方案为:
对整个训练集和测试集的搜索词列做分词后的词频统计表
对每个用户的搜索词列分词后的各个词与词频统计表各词(排除前者自身)进行编辑距离计算。得到词频统计表中编辑距离与该词编辑距离最小词,在这些词中在选择一个词频最高的词将该词替代。4.7 额外增加数据量
在大数据时代背景下,只要数据量足够的大,反而我们所选用的不同的算法模型对最终的预测准确率的影响会变小,获取更多数据会使模型更完善更准确。我们这里用不同方案所得到的分词结果,人为的增加训练集的数据。如将10万条记录的训练集进行NLPIR分词得到结果,与进行”结巴”提取关键词得到的结果拼接,就将训练集记录人为的翻倍了。后续的分类实验中证明了,使用该方案,在模型相同的情况下,相比原来会有1%左右的准确率的提升。
5.聚类与降维
2009年结束的Nexfix竞赛表明,很多参数团队用到的高等矩阵因子分解对模型提高预测准确略非常有帮助。模型使用矩阵因子分解方法从特征矩阵中抽取一组潜在的属性,并通过这些属性来描述用户。20世纪80年代后期,利用潜在的”语义”属性的思想被成功的应用于信息检索领域。Deerwesteret al.在1990年提出使用奇异值分解(SVD)方法发现文档中的潜在的属性。[2]而本课题在实验中会使用到LDA方法。
5.1 LDA
隐含狄利克雷分配(LDA,Latent Dirichlet Allocation)是一种主题模型(Topic Model,即从所收集的文档中推测主题)。甚至可以说LDA模型现在已经成为了主题建模中的一个标准,是实践中最成功的主题模型之一。那么何谓“主题”呢?,就是诸如一篇文章、一段话、一个句子所表达的中心思想。不过从统计模型的角度来说,我们是用一个特定的词频分布来刻画主题的,并认为一篇文章、一段话、一个句子是从一个概率模型中生成的。也就是说 在主题模型中,主题表现为一系列相关的单词,是这些单词的条件概率。形象来说,主题就是一个桶,里面装了出现概率较高的单词(参见下面的图),这些单词与这个主题有很强的相关性。这里写图片描述
LDA可以用来识别大规模文档集或语料库中潜藏的主题信息。它采用了词袋的方法,这种方法将每一篇文档视为一个词频向量,从而将文本信息转化为了易于建模的数字信息。但是词袋方法没有考虑词与词之间的顺序,这简化了问题的复杂性,同时也为模型的改进提供了契机。每一篇文档代表了一些主题所构成的一个概率分布,而每一个主题又代表了很多单词所构成的一个概率分布。
LDA可以被认为是如下的一个聚类过程:
各个主题(Topics)对应于各类的“质心”,每一篇文档被视为数据集中的一个样本。
主题和文档都被认为存在一个向量空间中,这个向量空间中的每个特征向量都是词频(词袋模型)
与采用传统聚类方法中采用距离公式来衡量不同的是,LDA使用一个基于统计模型的方程,而这个统计模型揭示出这些文档都是怎么产生的。5.1.1 模型训练
Spark API 参数介绍:
K:主题数量(或者说聚簇中心数量)
maxIterations:EM算法的最大迭代次数,设置足够大的迭代次数非常重要,前期的迭代返回一些无用的(极其相似的)话题,但是继续迭代多次后结果明显改善。我们注意到这对EM算法尤其有效。,至少需要设置20次的迭代,50-100次是更合理的设置,取决于数据集。
docConcentration(Dirichlet分布的参数α):文档在主题上分布的先验参数(超参数α)。当前必须大于1,值越大,推断出的分布越平滑。默认为-1,自动设置。topicConcentration(Dirichlet分布的参数β):主题在单词上的先验分布参数。当前必须大于1,值越大,推断出的分布越平滑。默认为-1,自动设置。checkpointInterval:检查点间隔。maxIterations很大的时候,检查点可以帮助减少shuffle文件大小并且可以帮助故障恢复。
val lda=new LDA()
.setK(20)
.setOptimizer(“online”)
.setCheckpointInterval(10)
.setMaxIter(100)
val model=lda.fit(dataset_lpa)
5.1.2 模型评价
生成的model不仅存储了推断的主题,还包括模型的评价方法。模型的评价指标:logLikelihood,logPerplexity。logLikelihood越大越好,logPerplexity越小越好
val ll = model.logLikelihood(dataset_lpa)
val lp = model.logPerplexity(dataset_lpa)
用评价方法,在online 方法下,对setMaxIter进行调参:
for(i
val lda=new LDA()
.setK(3)
.setTopicConcentration(3)
.setDocConcentration(3)
.setOptimizer(“online”)
.setCheckpointInterval(10)
.setMaxIter(i)
val model=lda.fit(dataset_lpa)
val ll = model.logLikelihood(dataset_lpa)
val lp = model.logPerplexity(dataset_lpa)
println(s“$i $ll”)
println(s“$i $lp”)}
可以看到,logPerplexity在减小,LogLikelihood在增加,最大迭代次数需要设置50次以上,才能收敛:
5.1.3 对语料的主题进行聚类
val topicsProb=model.transform(dataset_lpa)
topicsProb.select(“label”, “topicDistribution”)show(false)
/**
+-----++
|label|topicDistribution
|
+-----++
|0.0 |[0.***,0.***147,0.***77] |
|1.0 |[0.***3,0.***623,0.***]
|
|2.0 |[0.***7,0.***417,0.***]
|
...*/
label是文档序号,文档中各主题的权重,我们可以将该DataFrame带入后续的分类器中,进行训练。
5.1.4 其他聚类与降维
Spark在基于RDD的MLlib中还提供了SVD、PCA的降维方法,而基于DataFrame的聚类方法还包括k-means、Bisecting k-means和Gauian Mixture,其中Gauian Mixture提供的API类似与LDA,可以直接为我们返回文档中各主题的权重,以便于后续的分类。但是由于LDA在主题聚类上的典型性,我们的课题实验只试验了LDA的方案