基于某Spark地大大数据精准营销中搜狗搜索引擎地用户画像挖掘Word文档格式.docx

上传人:b****6 文档编号:18719351 上传时间:2022-12-31 格式:DOCX 页数:15 大小:26.24KB
下载 相关 举报
基于某Spark地大大数据精准营销中搜狗搜索引擎地用户画像挖掘Word文档格式.docx_第1页
第1页 / 共15页
基于某Spark地大大数据精准营销中搜狗搜索引擎地用户画像挖掘Word文档格式.docx_第2页
第2页 / 共15页
基于某Spark地大大数据精准营销中搜狗搜索引擎地用户画像挖掘Word文档格式.docx_第3页
第3页 / 共15页
基于某Spark地大大数据精准营销中搜狗搜索引擎地用户画像挖掘Word文档格式.docx_第4页
第4页 / 共15页
基于某Spark地大大数据精准营销中搜狗搜索引擎地用户画像挖掘Word文档格式.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

基于某Spark地大大数据精准营销中搜狗搜索引擎地用户画像挖掘Word文档格式.docx

《基于某Spark地大大数据精准营销中搜狗搜索引擎地用户画像挖掘Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于某Spark地大大数据精准营销中搜狗搜索引擎地用户画像挖掘Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。

基于某Spark地大大数据精准营销中搜狗搜索引擎地用户画像挖掘Word文档格式.docx

总结本课题研究中不足与展望后续的优化方案

第9章:

参考文献

2.课题实验准备

2.1Spark集群

节点备注

cdh018核,32G存,角色:

SparkMaster,HDFSNameNode,SparkWorker,HDFSDataNode

cdh028核,12G存,角色:

SparkWorker,HDFSDataNode

cdh038核,12G存,角色:

cdh048核,12G存,角色:

2.2数据集

数据文件备注

Train.csv带标注的训练集

Test.csv测试集

2.3数据介绍

本数据来源于搜狗搜索数据,ID经过加密,训练集中人口属性数据存在部分未知的情况(需要解决方案能够考虑数据缺失对算法性能的影响)。

数据所有字段如下表所示:

字段说明

ID加密后的ID

age0:

未知年龄;

1:

0-18岁;

2:

19-23岁;

3:

24-30岁;

4:

31-40岁;

5:

41-50岁;

6:

51-999岁

Gender0:

未知1:

男性2:

女性

Education0:

未知学历;

博士;

硕士;

大学生;

高中;

初中;

小学

QueryList搜索词列表

2.4数据示例

对于train.csv中的数据记录:

00627779E16E7C09B975B2CE13C088CB420钢琴曲欣赏100首一个月的宝宝眼睫毛那么是黄色宝宝右眼有眼屎小儿抽搐怎么办剖腹产后刀口上有线头属羊和属鸡的配吗

2.5课题任务描述

根据提供的用户历史一个月的查询词与用户的人口属性标签(包括性别、年龄、学历)做为训练数据,通过机器学习、数据挖掘技术构建分类算法来对新增用户的人口属性进行判定。

3.查询词分词

3.1NLPIR

NLPIR汉语分词系统(又名ICTCLAS2013),主要功能包括中文分词;

词性标注;

命名实体识别;

用户词典功能;

支持GBK编码、UTF8编码、BIG5编码。

新增微博分词、新词发现与关键词提取;

华平博士先后倾力打造十余年,核升级10次。

全球用户突破20万,先后获得了2010年钱伟长中文信息处理科学技术奖一等奖,2003年国际SIGHAN分词大赛综合第一名,2002年国973评测综合第一名。

我们传入每个用户的搜索词列,表经过NLPIR分词工具得到的分词。

之后,我们做个进一步的优化策略:

3.1.1去停用词

我们根据分词后词语所带的词性,对一些特征代表性不够强的词语进行过滤:

for(inti=0;

i<

sbtmp.length();

++i){

charcc=sbtmp.charAt(i);

if(cc=='

'

){

sbtmp.deleteCharAt(i);

--i;

}elseif(cc=='

/'

//去词条件

Booleanisdel=

//1.去标点

(i+1<

sbtmp.length()&

&

sbtmp.charAt(i+1)=='

w'

//2.疑问词

||(i+2<

r'

&

sbtmp.charAt(i+2)=='

y'

//3.数字

||(i+1<

m'

//4.连词

c'

//5.副词

d'

//6.叹词

e'

//7.拟声词

o'

//8.介词

p'

//9.量词

q'

//10.助词

u'

//11.纯动词

v'

);

//去词

if(sbtmp.charAt(i+1)!

='

n'

sbtmp.charAt(i+1)!

i'

j'

h'

!

(i+2<

)){

while(i+1<

sbtmp.deleteCharAt(i+1);

}

while(i>

=0&

sbtmp.charAt(i)!

'

//若无需去词,把‘/’转为‘,’,并去除随后的词性标志

else{

sbtmp.setCharAt(i,'

while(sbtmp.charAt(i+1)!

for(inti=1;

sbtmp.length()-1;

if(sbtmp.charAt(i)=='

(sbtmp.charAt(i-1)=='

||sbtmp.charAt(i+1)=='

//去中间单个字

elseif(sbtmp.charAt(i-1)=='

//去首个单个字

elseif(sbtmp.charAt(i)=='

i==1){

sbtmp.deleteCharAt(i-1);

3.1.2提取关键词

分词并不能很好的将常用的短语提取出来,如词语“用户画像”,使用分词工具更倾向于将其分成“用户”和“画像”,而失去了词语本身的含义。

NLPIR还提供了提取一段话的关键词的功能,我们可以使用它:

intnumofIm=1000;

StringnativeByte=CLibrary.Instance.NLPIR_GetKeyWords(sInput,numofIm,false);

经过分词后,平均每位用户搜索词列所得到的词量在600个左右,这里我们设置提取1000个关键词,但实际上一个用户的关键词提取的数量在60~200左右。

由于关键词的很强的特征性,并且提取出的数量又少,若后续我们直接使用如词语的词频作为用户的特征属性进行分类的话,很可能各个用户特征属性有巨大的差异,即用户之间拥有的相同关键词过少。

3.1.3混合提取

在用户搜索词列分词基础上,在增加N次对其进行M个关键词提取的结果。

3.2“结巴”分词

jieba,即“结巴”中文分词,一个优秀的开源的分词工具,一直致力于做最好的Python中文分词组件。

我们直接使用它对用户搜索词列进行1000个关键词的提取,所能提取到的关键词比NLPIR数量有所提高。

显然,关键词提取的数量增加,每个关键词的代表性就有所减弱。

但在后续的分类实验中证明了,使用该分词方案,对比上节的各个分词方案,在模型相同的情况下,会有2%~5%的准确率的提升。

关键词抽取可基于以下两种算法,后续实验实践证明基于TF-IDF算法的关键词的抽取,在该数据集和我们后续所选择的模型中会得到更好的效果。

3.2.1基于TF-IDF算法的关键词抽取

importjieba.analyse

jieba.analyse.extract_tags(sentence,topK=20,withWeight=False,allowPOS=())

sentence为待提取的文本

topK为返回几个TF/IDF权重最大的关键词,默认值为20

withWeight为是否一并返回关键词权重值,默认值为False

allowPOS仅包括指定词性的词,默认值为空,即不筛选

jieba.analyse.TFIDF(idf_path=None)新建TFIDF实例,idf_path为IDF频率文件

代码示例(关键词提取)

importsys

sys.path.append('

../'

importjieba

fromoptparseimportOptionParser

USAGE="

usage:

pythonextract_tags.py[filename]-k[topk]"

parser=OptionParser(USAGE)

parser.add_option("

-k"

dest="

topK"

opt,args=parser.parse_args()

 

iflen(args)<

1:

print(USAGE)

sys.exit

(1)

file_name=args[0]

ifopt.topKisNone:

topK=10

else:

topK=int(opt.topK)

content=open(file_name,'

rb'

).read()

tags=jieba.analyse.extract_tags(content,topK=topK)

print("

"

.join(tags))

3.2.2基于TextRank算法的关键词抽取

jieba.analyse.textrank(sentence,topK=20,withWeight=False,allowPOS=(‘ns’,‘n’,‘vn’,‘v’))直接使用,接口相同,注意默认过滤词性。

jieba.analyse.TextRank()新建自定义TextRank实例

基本思想[1]:

将待抽取关键词的文本进行分词

以固定窗口大小(默认为5,通过span属性调整),词之间的共现关系,构建图

计算图中节点的PageRank,注意是无向带权图

4.特征抽取与转换

4.1TF-IDF

TF(TermFrequency)词频

DF(DocumentFrequency)词语出现的文档数目

N总共的文档数目

IDF(InvertDocumentFrequency)逆文档频率

这里写图片描述

IDF反映了一个特征词在整个文档集合中的情况,出现的愈多IDF值越低,这个词区分不同文档的能力越差。

示例代码:

importorg.apache.spark.ml.feature.{HashingTF,IDF,Tokenizer}

valsentenceData=spark.createDataFrame(Seq(

(0,"

HiIheardaboutSpark"

),

IwishJavacouldusecaseclasses"

(1,"

Logisticregressionmodelsareneat"

)).toDF("

label"

"

sentence"

valtokenizer=newTokenizer().setInputCol("

).setOutputCol("

words"

valwordsData=tokenizer.transform(sentenceData)

valhashingTF=newHashingTF().setInputCol("

rawFeatures"

).setNumFeatures(20)

valfeaturizedData=hashingTF.transform(wordsData)

validf=newIDF().setInputCol("

features"

validfModel=idf.fit(izedData)

valrescaledData=idfModel.transform(featurizedData)

rescaledData.select("

).take(3).foreach(println)

/*输出结果为:

[(20,[0,5,9,17],[0.6931471805599453,0.6931471805599453,0.28768207245178085,1.3862943611198906]),0]

[(20,[2,7,9,13,15],[0.6931471805599453,0.6931471805599453,0.8630462173553426,0.28768207245178085,0.28768207245178085]),0]

[(20,[4,6,13,15,18],[0.6931471805599453,0.6931471805599453,0.28768207245178085,0.28768207245178085,0.6931471805599453]),1]

*/

值得一提的是,Spark所提供的TF并不是数组,而是一个使用MurmurHash3函数的哈希表。

其默认向量维度为2^18=262,144。

我们运行上节示例代码可以发现,我们将哈希表大小设置成了20,第二条sentence:

”IwishJavacouldusecaseclasses”有7个不同的单词,经过hash函数却被映射成了只有5个属性为非零值,即有2个位置放了2个不同的单词。

这具有很大的随机性,将两个无关词义的词语,甚至词义相反的词语,如“男”与“女”,映射到哈希表的同一位置,作为相同的用户属性来处理。

4.2CountVectorizer

为了解决上节所提到的HashingTF哈希函数映射后导致词语重叠问题,我们使用了Spark的CountVectorizer。

我们会先想CountVectorizer传入一个互斥的字符串数组,文本经过CountVectorizer转换后,会对该数组中所有的词语进行与属性的一一对应。

我们对互斥的字符串数组进行的优化,过滤掉了词频为1的词语,将CountVectorizer的维度减少到原来的50%,极大的降低了后续训练模型时所需的存,而且除去的数据噪音,增加了预测的准确度:

valdiffTrain=Triandata.map{line=>

valtemp=line.split("

\t"

if(temp.length==5)temp(4)else"

"

valdiffTest=Testdata.map{line=>

if(temp.length==5)temp

(1)else"

valdiffAll=diffTrain.union(diffTest).flatMap(_.split("

)).map((_,1)).reduceByKey(_+_).collect.filter(line=>

line._1!

="

line._2>

14).map(line=>

line._1)

valcvm=newCountVectorizerModel(diffAll).setInputCol(tokenizer.getOutCol).setOutputCol("

4.3StopWordsRemover

在上一章中,我们提到了分词时,根据分词结果所带的词性,对其进行去停用词。

而后,我们发现使用”结巴”分词进行TF-IDF算法对用户搜索词列进行1000个关键词的提取对于后续的分类模型效果会更好。

但是,我们在“结巴”关键词提取的结果却发现了类似于“什么”“即使”等不具有代表性的词语。

于是我们1119个停用词,使用Spark的StopWordsRemover,对分词结果进行去停用词:

valStopdata=sc.textFile("

hdfs:

//cdh01:

8020//user/data/sogou2/stop"

128).collect()

valremover=newStopWordsRemover().setInputCol("

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万以上的维度,降低了后续训练模型时所需的存,而且凝聚了属性的代表性,增加了预测的准确度:

valsqlContext=neworg.apache.spark.sql.SQLContext(sc)

importsqlContext.implicits._

valtrain=sc.textFile("

8020//user/data/sogou2/JBtrain"

400)

valtest=sc.textFile("

8020//user/data/sogou2/JBtest"

valsame=sc.textFile("

8020//user/data/sogou2/same"

same.filter{x=>

x.contains('

='

)}.count()

valsameWord=same.map{line=>

valvaluekey=line.split('

(valuekey

(1),valuekey(0))

}.collect()

valbroadcastVar=sc.broadcast(sameWord)

valdiffTrain=train.map{line=>

valbroad=broadcastVar.v

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1