基于Spark的大数据精准营销中搜狗搜索引擎的用户画像挖掘.doc_第1页
基于Spark的大数据精准营销中搜狗搜索引擎的用户画像挖掘.doc_第2页
基于Spark的大数据精准营销中搜狗搜索引擎的用户画像挖掘.doc_第3页
基于Spark的大数据精准营销中搜狗搜索引擎的用户画像挖掘.doc_第4页
基于Spark的大数据精准营销中搜狗搜索引擎的用户画像挖掘.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于Spark的大数据精准营销中搜狗搜索引擎的用户画像挖掘近期参加了CCF举办的“大数据精准营销中搜狗用户画像挖掘”竞赛,最终得到复赛第32名。正好这学期机器学习与数据挖掘课程需要一个实验报告的大作业,于是就那它来写了。本博文会在这几周不断的完善更新ing1. 选题背景与意义1.1 用户画像与精准营销“用户画像”是近几年诞生的名词。很多营销项目或很多广告主,在打算投放广告前,都要求媒体提供其用户画像。在以前,大多媒体会针对自身用户做一个分类,但是有了大数据后,企业及消费者行为带来一系列改变与重塑,通过用户画像可以更加拟人化的描述用户特点。 用户画像,即用户信息标签化,就是企业通过收集与分析消费者社会属性、生活习惯、消费行为等主要信息的数据之后,完美地抽象出一个用户的商业全貌,可以看作是企业应用大数据技术的基本方式。用户画像为企业提供了足够的信息基础,能够帮助企业快速找到精准用户群体以及用户需求等更为广泛的反馈信息。 消费方式的改变促使用户迫切希望尽快获取自己想要了解的信息,所以说,基于用户画像上的精准营销不管对企业还是对用户来说,都是有需求的,这会给双方交易带来极大便捷,也为双方平等沟通搭建了一个畅通平台。1.2 搜索引擎下用户画像的挑战在搜索引擎下,由于搜索引擎本身使用方式的特殊性、用户的流动性、查询的实时性等,带来了与企业传统的对用户信息进行收集与分析有着巨大的不同、更加艰巨的挑战。 例如,我们实时获取到的是用户的查询语句,而由于用户的流动性,并不能直接获取到如年龄、性别、学历等用户的标签信息。这么一来,也就无法根据用户属性对用户进行分群处理,而后再通过推荐系统进行产品上的优化1.3 本文内容概要本文内容概要如下:第1章:简介用户画像与搜索引擎下用户画像的精准营销的挑战。第2章:说明实验集群、数据与课题研究目标。第3章:介绍使用分词工具对用户的搜索词列进行分词,以及相关的优化方案。第4章:介绍在分词的基础上,对文本进行特征的抽取与转换,以及相关的优化方案。第5章:介绍在原始特征向量上,进行聚类与降维。第6章:介绍实验中试验过各分类模型第7章:介绍模型参数调优第8章:总结本课题研究中不足与展望后续的优化方案第9章:参考文献2. 课题实验准备2.1 Spark集群节点备注cdh018核,32G内存,角色:Spark Master,HDFS NameNode,Spark Worker,HDFS DataNodecdh028核,12G内存,角色:Spark Worker,HDFS DataNodecdh038核,12G内存,角色:Spark Worker,HDFS DataNodecdh048核,12G内存,角色:Spark Worker,HDFS DataNode2.2 数据集数据文件备注Train.csv带标注的训练集Test.csv测试集2.3 数据介绍本数据来源于搜狗搜索数据,ID经过加密,训练集中人口属性数据存在部分未知的情况(需要解决方案能够考虑数据缺失对算法性能的影响)。数据所有字段如下表所示:字段说明ID加密后的IDage0:未知年龄; 1:0-18岁; 2:19-23岁; 3:24-30岁; 4:31-40岁; 5:41-50岁; 6: 51-999岁Gender0:未知1:男性2:女性Education0:未知学历; 1:博士; 2:硕士; 3:大学生; 4:高中; 5:初中; 6:小学Query List搜索词列表2.4 数据示例对于train.csv中的数据记录:00627779E16E7C09B975B2CE13C088CB 4 2 0 钢琴曲欣赏100首 一个月的宝宝眼睫毛那么是黄色 宝宝右眼有眼屎 小儿抽搐怎么办 剖腹产后刀口上有线头 属羊和属鸡的配吗2.5 课题任务描述根据提供的用户历史一个月的查询词与用户的人口属性标签(包括性别、年龄、学历)做为训练数据,通过机器学习、数据挖掘技术构建分类算法来对新增用户的人口属性进行判定。3. 查询词分词3.1 NLPIRNLPIR汉语分词系统(又名ICTCLAS2013),主要功能包括中文分词;词性标注;命名实体识别;用户词典功能;支持GBK编码、UTF8编码、BIG5编码。新增微博分词、新词发现与关键词提取;张华平博士先后倾力打造十余年,内核升级10次。 全球用户突破20万,先后获得了2010年钱伟长中文信息处理科学技术奖一等奖,2003年国际SIGHAN分词大赛综合第一名,2002年国内973评测综合第一名。 我们传入每个用户的搜索词列,表经过NLPIR分词工具得到的分词。之后,我们做个进一步的优化策略:3.1.1 去停用词我们根据分词后词语所带的词性,对一些特征代表性不够强的词语进行过滤: for (int i = 0; i sbtmp.length(); +i) char cc = sbtmp.charAt(i); if (cc = ) sbtmp.deleteCharAt(i); -i; else if (cc = /) / 去词条件 Boolean isdel = / 1. 去标点 (i + 1 sbtmp.length() & sbtmp.charAt(i + 1) = w) / 2. 疑问词 | (i + 2 sbtmp.length() & sbtmp.charAt(i + 1) = r & sbtmp.charAt(i + 2) = y) / 3. 数字 | (i + 1 sbtmp.length() & sbtmp.charAt(i + 1) = m) / 4. 连词 | (i + 1 sbtmp.length() & sbtmp.charAt(i + 1) = c) / 5. 副词 | (i + 1 sbtmp.length() & sbtmp.charAt(i + 1) = d) / 6. 叹词 | (i + 1 sbtmp.length() & sbtmp.charAt(i + 1) = e) / 7. 拟声词 | (i + 1 sbtmp.length() & sbtmp.charAt(i + 1) = o) / 8. 介词 | (i + 1 sbtmp.length() & sbtmp.charAt(i + 1) = p) / 9. 量词 | (i + 1 sbtmp.length() & sbtmp.charAt(i + 1) = q) / 10. 助词 | (i + 1 sbtmp.length() & sbtmp.charAt(i + 1) = u) / 11. 纯动词 | (i + 2 sbtmp.length() & sbtmp.charAt(i + 1) = v & 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 sbtmp.length() & sbtmp.charAt(i + 2) = n) while (i + 1 = 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.length() - 1; +i) if (sbtmp.charAt(i) = , & (sbtmp.charAt(i - 1) = , | sbtmp.charAt(i + 1) = ,) sbtmp.deleteCharAt(i); -i; / 去中间单个字 else if (sbtmp.charAt(i - 1) = , & sbtmp.charAt(i + 1) = ,) sbtmp.deleteCharAt(i); sbtmp.deleteCharAt(i); -i; / 去首个单个字 else if (sbtmp.charAt(i) = , & i = 1) sbtmp.deleteCharAt(i - 1); sbtmp.deleteCharAt(i - 1); -i; 3.1.2 提取关键词分词并不能很好的将常用的短语提取出来,如词语“用户画像”,使用分词工具更倾向于将其分成“用户”和“画像”,而失去了词语本身的含义。NLPIR还提供了提取一段话的关键词的功能,我们可以使用它:int numofIm = 1000;String nativeByte = CLibrary.Instance.NLPIR_GetKeyWords(sInput, numofIm, false); 经过分词后,平均每位用户搜索词列所得到的词量在600个左右,这里我们设置提取1000个关键词,但实际上一个用户的关键词提取的数量在60200左右。由于关键词的很强的特征性,并且提取出的数量又少,若后续我们直接使用如词语的词频作为用户的特征属性进行分类的话,很可能各个用户特征属性有巨大的差异,即用户之间拥有的相同关键词过少。3.1.3 混合提取在用户搜索词列分词基础上,在增加N次对其进行M个关键词提取的结果。3.2 “结巴”分词jieba,即“结巴”中文分词,一个优秀的开源的分词工具,一直致力于做最好的 Python 中文分词组件。我们直接使用它对用户搜索词列进行1000个关键词的提取,所能提取到的关键词比NLPIR数量有所提高。显然,关键词提取的数量增加,每个关键词的代表性就有所减弱。但在后续的分类实验中证明了,使用该分词方案,对比上节的各个分词方案,在模型相同的情况下,会有2%5%的准确率的提升。 关键词抽取可基于以下两种算法,后续实验实践证明基于 TF-IDF 算法的关键词的抽取,在该数据集和我们后续所选择的模型中会得到更好的效果。3.2.1 基于 TF-IDF 算法的关键词抽取import jieba.analysejieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=()sentence 为待提取的文本topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20withWeight 为是否一并返回关键词权重值,默认值为 FalseallowPOS 仅包括指定词性的词,默认值为空,即不筛选jieba.analyse.TFIDF(idf_path=None) 新建 TFIDF 实例,idf_path 为 IDF 频率文件代码示例 (关键词提取)import syssys.path.append(./)import jiebaimport jieba.analysefrom optparse import OptionParserUSAGE = usage: python extract_tags.py file name -k top kparser = OptionParser(USAGE)parser.add_option(-k, dest=topK)opt, args = parser.parse_args()if len(args) val temp = line.split(t) if (temp.length = 5) temp(4) else val diffTest = Testdata.map line = val temp = line.split(t) if (temp.length = 5) temp(1) else val diffAll = diffTrain.union(diffTest).flatMap(_.split(,).map(_, 1).reduceByKey(_ + _).collect.filter(line = line._1 != & line._2 14).map(line = line._1)val cvm = new CountVectorizerModel(diffAll).setInputCol(tokenizer.getOutCol).setOutputCol(features) 4.3 StopWordsRemover在上一章中,我们提到了分词时,根据分词结果所带的词性,对其进行去停用词。而后,我们发现使用”结巴”分词进行TF-IDF算法对用户搜索词列进行1000个关键词的提取对于后续的分类模型效果会更好。但是,我们在“结巴”关键词提取的结果却发现了类似于“什么”“即使”等不具有代表性的词语。于是我们1119个停用词,使用Spark的StopWordsRemover,对分词结果进行去停用词:val Stopdata = sc.textFile(hdfs:/cdh01:8020/user/data/sogou2/stop,128).collect()val remover = new StopWordsRemover().setInputCol(words).setOutputCol(filtered).setStopWords(Stopdata)4.4 权值规范化设想两个不同的用户A和用户B,用户A的搜索词列中只有1句查询语句,分词后得到了3个词语W和总共10个词。而用户B的搜索词列中有10句查询语句,分词后得到了10个词语W和总共100个词。很显然,B中W的TF远高于A中的W的TF,但我们知道词语W在A中比在B中更具有代表性。 为了解决上述问题,我们使用了最大-最小规范化:将所有特征向量线性变换到用户指定最大-最小值之间。但注意在计算时还是一个一个特征向量分开计算的。通常将最大,最小值设置为1和0,这样就归一化到0,1。Spark中可以对min和max进行设置,默认就是0,1。 这里写图片描述在后续,当我们对特征矩阵进行聚类后,得到的特征值可能为负值,可是很多分类器模型需要特征值为非负值。使用以上方法也可以解决这个问题。4.5 同义词替换设想当一个用户的搜索词列的分词结果中出现了一些意思相近的词语,如“恋爱”与“爱情”、“菠萝”与“凤梨”。而我们的模型将其辨别为不同的特征属性,这无疑大量的增加了特征向量的维度和平分了同一意思的词语具有的代表性。 为了解决上述问题,我们搜集了近4万条同义词词典,将意思相近的词语由1个词语来替换掉。该优化帮助原本的特征向量减少了3万以上的维度,降低了后续训练模型时所需的内存,而且凝聚了属性的代表性,增加了预测的准确度: val sqlContext = new org.apache.spark.sql.SQLContext(sc) import sqlContext.implicits._ val train = sc.textFile(hdfs:/cdh01:8020/user/data/sogou2/JBtrain, 400) val test = sc.textFile(hdfs:/cdh01:8020/user/data/sogou2/JBtest, 400) val same = sc.textFile(hdfs:/cdh01:8020/user/data/sogou2/same, 400) same.filter x = !x.contains(=) .count() val sameWord = same.map line = val valuekey = line.split(=) (valuekey(1), valuekey(0) .collect() val broadcastVar = sc.broadcast(sameWord) val diffTrain = train.map line = val broad = broadcastVar.value val regex = d+$.r val temp = line.split(t) val wordArray = temp(4).split(,) var str = for (word line._1.equals(word) if (keyVal.length 0) val oneKeyVal = keyVal(0) str = str + # + oneKeyVal._2 else if (regex.findFirstMatchIn(word) = None) str = str + # + word (temp(0), temp(1), temp(2), temp(3), str) diffTrain.toDF().coalesce(1).write.csv(hdfs:/cdh01:8020/user/data/sogou2/ReplaceJBtrain) val diffTest = test.map line = val broad = broadcastVar.value val regex = d+$.r val temp = line.split(t) val wordArray = temp(1).split(,) var str = for (word line._1.equals(word) if (keyVal.length 0) val oneKeyVal = keyVal(0) str = str + # + oneKeyVal._2 else if (regex.findFirstMatchIn(word) = None) str = str + # + word (temp(0), str) diffTest.toDF().coalesce(1).write.csv(hdfs:/cdh01:8020/user/data/sogou2/ReplaceJBtest)4.6 形近词替换设想当一个用户的搜索词列的分词结果中出现了一些形近的词语,如“iPhone5”与“iPhone6”、“杭州”与“杭州站”。该问题和上节所提出的问题类似,为了解决这个问题,我们先来介绍“编辑距离算法”。 编辑距离算法,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。例如,计算X字符串 与 Y字符串 的 编辑距离。dpij 为 X串的前i个字符 和 Y串的前j个字符 的编辑距离:if(X i - 1 = Yj - 1) dpij = dpi - 1j - 1; /最后字符相同 else int t1 = dpi - 1j; /删除X第i个字符 t1 = t1 dpij - 1 ? t1 : dpij - 1; /删除Y第j个字符 t1 = t1 dpi - 1j - 1 ? t1 : dpi - 1j - 1;/最后字符改相同 dpij = 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(da

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论