学校网站建设发展规划,福田建网站,青海高端网站建设公司,公司网站客户案例看书标记——R语言 Chapter 9 文本挖掘——点评数据展示策略9.1项目背景、目标和方案9.1.1项目背景9.1.2项目目标9.1.3项目方案1.建立评论文本质量量化指标2.建立用户相似度模型3.对用户评论进行情感性分析 9.2项目技术理论简介9.2.1评论文本质量量化指标模型1.主题覆盖量2.评论… 看书标记——R语言 Chapter 9 文本挖掘——点评数据展示策略9.1项目背景、目标和方案9.1.1项目背景9.1.2项目目标9.1.3项目方案1.建立评论文本质量量化指标2.建立用户相似度模型3.对用户评论进行情感性分析 9.2项目技术理论简介9.2.1评论文本质量量化指标模型1.主题覆盖量2.评论文本分词数量3.评论点赞数4.评论中的照片数5.评论分值偏移 9.2.2用户相似度模型1.pearson相关系数2.欧几里得距离3.夹角余弦相似度4.马氏距离 9.2.3情感性分析1.文本挖掘基础知识2.基于规则情感性分析方法3.词汇极性判断4.关键词提取 9.2.4R语言实例代码1.分词2.配置词典3.增加自定义词典4.增加停用词词典5.关键词提取TF-IDF6.词性标注 9.3项目实践9.3.1若干自定义函数1.数据清理3.分词 9.3.2文本质量量化指标模型9.3.3用户相似度模型9.3.4情感词分析1.导入评论数据并清洗分词2.关联情感词、否定词和程度副词3.对片段进行窗口期判定及综合打分 9.3.5总结 【R语言数据分析项目精解理论、方法、实战 9】 Chapter 9 文本挖掘——点评数据展示策略
9.1项目背景、目标和方案
9.1.1项目背景
评论内容无效、评论数据千人一面有必要对评论显示策略做出一定的调整
9.1.2项目目标
(1对评论文本的质量进行监控和量化将一些无效评论的显示顺序滞后。 (2制定用户相似度模型将用户的评论给与他相似的用户看达到千人百面的效果。 (3对评论所表达的情感进行分析综合评分和情感两个方面对评论进行排序。
9.1.3项目方案
1.建立评论文本质量量化指标
对评论文本进行分析评论文本质量量化指标主要考虑如下几个因素。 (1主题覆盖量 主要考虑评论文本中对产品专有主题的覆盖情况。 (2评论文本分词数量 评论文本写得越详细、内容越多对访问者的帮助可能就越大删除过渡词后看剩余文本单词的数量数量越多该条评论的信息量就越大。 (3评论点赞数 评论点赞数越多该条评论对用户就越有用。 (4评论中的照片数量 很好理解有照片的评论显然要比没有照片的评论更加真实和有用。 (5评论分值偏移 用户给该产品人为打的一个主观评价分但并不是评分分值越高该条评论的质量就越高若用户的打分有失公允那么该条评论的质量也就不算高了。
2.建立用户相似度模型
用户行为及用户属性相似度计算建立相似度模型
3.对用户评论进行情感性分析
基于词典的情感分析对评论文本进行分析。
9.2项目技术理论简介
9.2.1评论文本质量量化指标模型
1.主题覆盖量
指定五个主题每个主题都有收集对应的相关词汇用于描述相关主题。每涉及一项主题为0.2满分为1。
2.评论文本分词数量
去除停用词得到相对真实的论文文本然后分词统计词频最后计算五分位数每个分位数区间的数从小到大赋予0.2、0.4、0.6、0.8、1分。
3.评论点赞数
计算评论点赞数也计算五分位数然后赋值0~1分。
4.评论中的照片数
有照片记为1分反之为0。
5.评论分值偏移
评论分值偏移就是计算评论分值与所有评论中位数的偏移程度。首先计算所有评分的中位数然后计算每个分值与中位数的差值绝对值接着分别计算这些差值绝对值的20%、40%、60%、80%分位数最后以如下标准计分依中心递减在中位数加减20%分位数内为1分、在中位数减去40%分位数和中位数减去20%分位数之间及中位数加上20%分位数和中位数加上40%分位数之间的记为0.8分以此类推在每个区间依次递减0.6、0.4和0.2分而之所以选择中位数作为中心点是为了防止异常值的影响针对主题也可以与需求方商讨赋予不同的权重。
9.2.2用户相似度模型
用户相似度模型可以让用户优先看到与之相似的用户的评论数关于相似度的计算本质上就是计算两个向量的距离两个向量的距离越近它们的相似度就越大。
1.pearson相关系数
衡量两个定距变量线性相关性的统计量优缺点皮尔逊相关系数较易理解且计算方便但是在使用过程中需要假设数据是成对地取自于正态分布并且从指标的几何意义上来说它反映了两个向量线性方向的相关关系成比例关系非线性的相关关系无法体现。
2.欧几里得距离
优缺点欧几里德距离是所有距离公式中广为人知且最简单的一种但是就大部分统计问题而言其效果不甚理想。每个维度对其贡献都是相等的并且容易受单位量纲的影响没有考虑到总体变异对距离远近的关联。为了弥补单位量纲上的差异可以先对每个维度做标准化处理然后计算欧几里德距离。
3.夹角余弦相似度
与欧几里得距离不同夹角余弦相似度侧重于两向量之间方向差异的度量对量纲上的铭感度较小所以适用于对绝对数值不敏感、主观评价等数据。
4.马氏距离
本质上是数据协方差距离考虑了不同维度之间的关系。优缺点马氏距离去除了各维度之间的相关性这点也是马氏距离最大的优点。若两个向量中多个维度相关性较高则某个维度的影响会被多次使用这显然会对最后的结果产生误差。
9.2.3情感性分析
1.文本挖掘基础知识
1分词模型最大概率模型、隐马尔科夫模型、混合模型 2词典若干单词组成的库可在知网词典获取停用词、副词、否定词
2.基于规则情感性分析方法
针对每个片段判断其情感极性得分汇总计算得到情感累计得分
3.词汇极性判断
介绍一种算法SO-PMI可以有效地从大量词汇中找出那些接近正向或负向的情感词然后人为地进行最终判定从而大大减少人工识别的时间。具体步骤如下选自《基于平滑SO-PMI算法的微博情感词典构建方法研究》。
4.关键词提取
TF-IDF词频-逆文档频率依据TF给单词赋予IDF的权重结果从大到小排序得到关键性排序列表TF-IDF与词在文档中出现的次数呈正比与该词在整个语句中出现次数成反比。这种算法的优点为简单快速结果比较符合实际情况。这种算法也有相应的缺点单纯以“词频”衡量一个词的重要性不够全面有时重要的词可能出现的次数并不多而且这种算法无法体现词的位置信息出现位置靠前的词与出现位置靠后的词都被视为重要性相同这是不正确的一种解决方法是对全文的第一段和每一段的第一句话给予较大的权重。
9.2.4R语言实例代码
中文常用的是“jiebaR”程序包。
1.分词
worker() typemix混合模型、mp最大概率模型、hmmHMM模型、query索引模型 dictDICTPATH系统词典 hmmHMMPATHHMM模型路径 userUSERPATH用户词典 idfIDFPATH idf词典 stop_wordSTOPPATH停用词词典 writeT是否将文件分词结果写入文件默认为FALSE qmax20最大成词的字符数默认为20个字符 topn5关键词数默认为5个 encoding“UTF-8”输入文件的编码默认为UTF-8 detectT是否编码检查,默认为 TRUE symbolF是否保留符号默认为FALSE lines1e05每次读取文件为最大行数 outputNULL输出路径 bylinesF按行输出 user_weight“max”用户权重
#加载包
install.packages(jiebaR)
library(jiebaR)#加载分词环境
wk-worker()
wk[爸妈第一次出国很放心他们告诉我会很开心我就心满意足了]
wk #查看分词引擎配置2.配置词典
show_dictpath() #查看默认词典位置
dir(show_dictpath()) #查看目录#打开系统词典文件jieba.dict.utf8并打印前10行
scan(fileC:/Program Files/R/R3.2.5/library/jiebaRD/dict/jieba.dict.utf8,whatcharacter(),nlines10,sep\n,encodingutf-8,fileEncodingutf-8)#打开用户自定义词典文件user.dict.utf8并打印前10行
scan(fileC:/Program Files/R/R3.2.5/library/jiebaRD/dict/user.dict.utf8,whatcharacter(),nlines10,sep\n,encodingutf-8,fileEncodingutf-8)3.增加自定义词典
需要针对添加某些特定的词即用户自定义词典。自定义词典在TXT文件中需要UTF-8编码词典中第一行读不进去需要从第二行开始读
#增加自定义词典
wk[我喜欢量子号的邮轮]#设定空间默认路径
setwd(C:\\Users\\用户路径)
#用户自定义词典名称
userdic-trip_dic.txt
#加载分词引擎导入自定义词典
wk worker(useruserdic,bylinesTRUE,lines5000000)
#分词
wk[我喜欢量子号的邮轮]4.增加停用词词典
进一步对文本数据进行处理
#用户自定义词典和停用词词典名称
userdic-trip_dic.txt
stopword-stopword_adj.txt
wk worker(useruserdic,stop_wordstopword,bylinesTRUE,lines5000000) #加载分词引擎导入自定义词典
wk[我喜欢量子号的邮轮]5.关键词提取TF-IDF
#jiebaRuserdic-trip_dic.txt #用户自定义词典名称stopword-stopword_adj.txt wk - worker(useruserdic,stop_wordstopword,lines5000000) #加载分词引擎导入自定义词典segment-wk[R的极客理想系列文章涵盖了R的思想使用工具创新等的一系列要点以我个人的学习和体验去诠释R的强大。] #分词segmentfreq(segment) #计算词频
keys-worker(keywords,topn5) #设置关键词数量
vector_keywords(segment,keys) #计算关键词分值TF-IDF的计算
6.词性标注
SO-PMI算法的第一步是找出相应词性的词汇可以在work函数中设置tag来输出词性。
#用户自定义词典名称userdic-trip_dic.txtstopword-stopword_adj.txtwk worker(useruserdic,stop_wordstopword,tag,lines5000000) #加载分词引擎导入自定义词典segment-wk[爸妈第一次出国很放心他们告诉我会很开心我就心满意足了] #分词
segment9.3项目实践
9.3.1若干自定义函数
1.数据清理
“脏数据”指类似于url、空格、换行符、时间、英文字母、空值、字符长度过小等。
######################################################################
#函数功能清理文本数据
#参数说明text文本向量
dataclean-function(text){text- gsub(patternhttp:[a-zA-Z\\/\\.0-9],,text) #去除urltext - gsub(pattern , replacement , text) #gsub是字符替换函数去空格text - gsub(\t|\r|\v|\f|\n|\\\t, , text) #有时需要使用\\\t text- gsub(pattern([0-9]{4}年)?([0-9]*月)?[0-9]{1,}日,,text)text- gsub(pattern([0-9]{4}年),,text)text- gsub(pattern([0-9]{1,}月),,text)text- gsub(pattern[0-9]{1,},,text)text - gsub([a-zA-Z], , text) #清除英文字符text - text[!is.na(text)] #清除对应sentence里面的空值文本内容要先执行文本名 text - text[!nchar(text) 2] #文本长度过小return(text)
}
##### 2.分句并打上相应标号######################################################################
#函数功能分片段并打上标识
#参数说明text文本向量
splitsentence-function(text){commentdata-data.frame(idseq(1,length(text),1),termtext)commentdata$term-as.character(commentdata$term)#以标点符号作为分隔符把句子分成片段subcon-strsplit(text,,|\\.|!|\\?|;|~||。||\\|||…|﹏﹏|。。。。。。|\\.\\.\\.\\.\\.\\.)temp-unlist(lapply(subcon,length)) #计算每条评论片段数id-rep(commentdata$id,temp) #生成每条评论标号标号数量和片段数相同term-unlist(subcon) #把片段结果对象变成向量#打上分句idgroupid-function(x){subid-seq(1:x)return(subid)}#生成片段标识subid-paste(id,-,unlist(lapply(temp,groupid)),seq)subcondata-data.frame(idid,termterm,subidsubid)subcondata$term-as.character(subcondata$term)subcondata$subid-as.character(subcondata$subid)return(subcondata)
}根据标点符号分段为每个片段打上标签用于识别是否属于一条评论。
3.分词
######################################################################
#函数功能分词
#参数说明useridc用户自定义词典文件名、stopword停用词词典文件名、subdf数据框需要分词的数据每一行为一条文本片段
library(jiebaR)segword_trn-function(userdic,stopword,subdf){wk worker(useruserdic,stop_wordstopword,tag,bylinesTRUE,lines5000000) #载入分词空间tt-wk[subdf$term] #分词函数temp_fc-unlist(lapply(tt,length)) #给每个分词标号id_fc-rep(subdf[,subid],temp_fc)term_fc-unlist(tt)segterm_fc-data.frame(idid_fc,termterm_fc,cxnames(unlist(tt)))segterm_fc$id-as.character(segterm_fc$id)segterm_fc$term-as.character(segterm_fc$term)segterm_fc$cx-as.character(segterm_fc$cx)segterm_fc$id_tot-as.numeric(unlist(lapply(strsplit(segterm_fc$id,-),function(x) x[1])))return(segterm_fc)
}载入jiebaR包》载入分词空间及自定义词典和停用词词典》wk函数分词》打标号辨识是否为同一评论。
9.3.2文本质量量化指标模型
library(jiebaR)
library(plyr)
library(dplyr)userdic-trip_dic.txt #用户字典
stopword-stopword_adj.txt #停止词
qualitydic-质量标准.csv #质量标准
qualityword-read.csv(qualitydic,headerTRUE,stringsAsFactorsFALSE) #导入质量指标相关词词典
content-read.csv(评论数据.csv,headerTRUE,stringsAsFactorsFALSE) #导入文本
commenttext-content$term
commenttext-dataclean(commenttext) #数据清理
subcondata-splitsentence(commenttext) #分句并转换成数据框并且表上subid
segworddata-segword_trn(userdic,stopword,subcondata) #分词#文本质量评分
#1、主题覆盖量
qualitterm-join(segworddata,qualityword)
qualitynum-as.data.frame(qualitterm %% group_by(id_tot) %% summarise(n_distinct(class,na.rmTRUE)))
names(qualitynum)[2]-quality_num
qualitynum$qualitynum_flag-qualitynum$quality_num
attach(qualitynum)
qualitynum[which(quality_num 1), ]$qualitynum_flag-0.2
qualitynum[which(quality_num 2), ]$qualitynum_flag-0.4
qualitynum[which(quality_num 3), ]$qualitynum_flag-0.6
qualitynum[which(quality_num 4), ]$qualitynum_flag-0.8
qualitynum[which(quality_num 5), ]$qualitynum_flag-1
detach(qualitynum)#2 文本分词数量
segwordnum-as.data.frame(segworddata %% group_by(id_tot) %% summarise(n_distinct(term,na.rmTRUE)))
names(segwordnum)[2]-segword_numsegword_num-segwordnum$segword_num
segword_num_q2-quantile(segword_num,0.2)
segword_num_q4-quantile(segword_num,0.4)
segword_num_q6-quantile(segword_num,0.6)
segword_num_q8-quantile(segword_num,0.8)
segword_num_q10-quantile(segword_num,1)segwordnum$segwordnum_flag-segwordnum$segword_numattach(segwordnum)
segwordnum[which(segword_num 0 segword_num segword_num_q2), ]$segwordnum_flag-0.2
segwordnum[which(segword_num segword_num_q2 segword_num segword_num_q4), ]$segwordnum_flag-0.4
segwordnum[which(segword_num segword_num_q4 segword_num segword_num_q6), ]$segwordnum_flag-0.6
segwordnum[which(segword_num segword_num_q6 segword_num segword_num_q8), ]$segwordnum_flag-0.8
segwordnum[which(segword_num segword_num_q8 segword_num segword_num_q10), ]$segwordnum_flag-1
detach(segwordnum)#3 评论点赞数
positive_num-content$positivenum
positive_num_q2-quantile(positive_num,0.2)0.001
positive_num_q4-quantile(positive_num,0.4)0.001
positive_num_q6-quantile(positive_num,0.6)0.001
positive_num_q8-quantile(positive_num,0.8)0.001
positive_num_q10-quantile(positive_num,1)0.001positivenum-data.frame(id_totcontent$id,positive_numcontent$positivenum,positivenum_flagpositive_num)attach(positivenum)
positivenum[which(positive_num 0 positive_num positive_num_q2), ]$positivenum_flag-0.2
positivenum[which(positive_num positive_num_q2 positive_num positive_num_q4), ]$positivenum_flag-0.4
positivenum[which(positive_num positive_num_q4 positive_num positive_num_q6), ]$positivenum_flag-0.6
positivenum[which(positive_num positive_num_q6 positive_num positive_num_q8), ]$positivenum_flag-0.8
positivenum[which(positive_num positive_num_q8 positive_num positive_num_q10), ]$positivenum_flag-1
detach(positivenum)#4 评论中照片数量
photonum-data.frame(id_totcontent$id,isphotocontent$isphoto,photo_flagcontent$isphoto)attach(photonum)
photonum[which(isphoto 0), ]$photo_flag-0
photonum[which(isphoto 1), ]$photo_flag-1
detach(photonum)#5评论分值偏移
score_num-data.frame(id_totcontent$id,scorecontent$score,score_flag0)
score-content$score
median_score-median(score)
diffscore-abs(score-median_score)diffscore_q2-quantile(diffscore,0.2)0.001
diffscore_q4-quantile(diffscore,0.4)0.001
diffscore_q6-quantile(diffscore,0.6)0.001
diffscore_q8-quantile(diffscore,0.8)0.001
diffscore_q10-quantile(diffscore,1)0.001
###0.001是为了避免集合空集的情况
attach(score_num)
score_num[which(scoremedian_score-diffscore_q2 scoremedian_scorediffscore_q2), ]$score_flag-1
score_num[which((scoremedian_score-diffscore_q4 scoremedian_score-diffscore_q2)|(scoremedian_scorediffscore_q2 scoremedian_scorediffscore_q4)), ]$score_flag-0.8
score_num[which((scoremedian_score-diffscore_q6 scoremedian_score-diffscore_q4)|(scoremedian_scorediffscore_q4 scoremedian_scorediffscore_q6)), ]$score_flag-0.6
score_num[which((scoremedian_score-diffscore_q8 scoremedian_score-diffscore_q6)|(scoremedian_scorediffscore_q6 scoremedian_scorediffscore_q8)), ]$score_flag-0.4
score_num[which((scoremedian_score-diffscore_q10 scoremedian_score-diffscore_q8)|(scoremedian_scorediffscore_q8 scoremedian_scorediffscore_q10)), ]$score_flag-0.2
detach(score_num)#6 整合评论分
qualityscore-join(qualitynum,segwordnum)
qualityscore-join(qualityscore,positivenum)
qualityscore-join(qualityscore,photonum)
qualityscore-join(qualityscore,score_num)
qualityscore-qualityscore[,c(id_tot,qualitynum_flag,segwordnum_flag,positivenum_flag,photo_flag,score_flag)]attach(qualityscore)
qualityscore$score_tot-qualitynum_flag*0.3segwordnum_flag*0.2positivenum_flag*0.2photo_flag*0.2score_flag*0.1
detach(qualityscore)qualityscore[order(qualityscore$score_tot),]可以具体查看一下得分较高的评论原文。
9.3.3用户相似度模型 uiddesc-read.csv(用户数据.csv,headerTRUE,stringsAsFactorsFALSE) #导入用户特征数据#计算欧式距离
eu_dist-function(a,b){dist-sqrt(sum((a-b)^2))return (dist)
}
sample_uid-c(4,3,6,4) #新用户
simindex_chain-c() #建立相似度初始向量
#计算新用户与每个评论用户相似度
for (i in 1:nrow(uiddesc)){eudist-eu_dist(sample_uid,unlist(uiddesc[i,-1])) ###欧式距离simindex-1/(1eudist)simindex_chain-c(simindex_chain,simindex)
}#相似度结果
simiindex_df-data.frame(idc(1:nrow(uiddesc)),simindexsimindex_chain)
simiindex_df[order(-simiindex_df$simindex),]根据得分用户将会优先看到排名在前面的用户的评论。
9.3.4情感词分析
1.导入评论数据并清洗分词
library(jiebaR)
library(plyr)
library(dplyr)
userdic-trip_dic.txt #用户字典
stopword-stopword_adj.txt #停止词
postivedic-postive.txt #正向情感词
negtivedic-nagative.txt #负向情感词
advworddic-程度副词.csv #程度副词字典
denyworddic-否定词.csv #否定词字典#导入情感词并附上权重
postivereadLines(postivedic,encodingUTF-8)
nagtivereadLines(negtivedic,encodingUTF-8)
pos-data.frame(termpostive,weightrep(1,length(postive)))
neg-data.frame(termnagtive,weightrep(-1,length(nagtive)))
posneg_tot-rbind(pos,neg)advword-read.csv(advworddic,headerTRUE,stringsAsFactorsFALSE) #导入程度副词、否定词
denyword-read.csv(denyworddic,headerTRUE,stringsAsFactorsFALSE)content-read.csv(评论数据.csv,headerTRUE,stringsAsFactorsFALSE) #导入文本
commenttext-content$termcommenttext-dataclean(commenttext) #数据清理
subcondata-splitsentence(commenttext) #分句并转换成数据框并且表上subid
segworddata-segword_trn(userdic,stopword,subcondata) #分词2.关联情感词、否定词和程度副词
#关联情感词、程度副词和否定词
tstterm-join(segworddata,posneg_tot)
tstterm-join(tstterm,advword)
names(tstterm)[length(names(tstterm))]-adv_score
tstterm-join(tstterm,denyword,byterm)
names(tstterm)[length(names(tstterm))]-deny_score
tstterm$adv_score[!complete.cases(tstterm$adv_score)]--999
tstterm$deny_score[!complete.cases(tstterm$deny_score)]--999
tstterm$id_tot-as.numeric(gsub( ,,tstterm$id_tot))3.对片段进行窗口期判定及综合打分
#####################################################################
#函数功能对片段进行情感性打分
#参数说明idname片段标号、fliename带有否定词、副词和正负情感词的文本
word_segment - function(idname,filename){ #-- 打行号#抽取片段filepart subset(filename,ididname)#对片段中每个分词打上idwordfile data.frame(filepart,idx1:nrow(filepart) )wordindex wordfile$idx[!is.na(wordfile$weight)] #找出正负情感词在片段中的位置#-- 上下限表citeration data.frame(wordindex,left wordindex-3,right wordindex3,leftidx c(wordindex[1]-4,head(wordindex,-1)),rightidx c(tail(wordindex,-1),wordindex[length(wordindex)]4),left_upc(tail(wordindex-3,-1),wordindex[length(wordindex-3)]3))#窗口期判定函数computevalue - function(i,citeration,wordindex,filepart){left ifelse(citeration$left[wordindexi]0,0,citeration$left[wordindexi])right citeration$right[wordindexi]leftidx ifelse(citeration$leftidx[wordindexi]0,0,citeration$leftidx[wordindexi])rightidx citeration$rightidx[wordindexi]left_upciteration$left_up[wordindexi]wdidxciteration$wordindex[wordindexi]result cbind(ifelse(rightrightidx,max((filepart$adv_score[max(left,leftidx1):max(wdidx,left_up-1)]),na.rmT),max(filepart$adv_score[max(left,leftidx1):wdidx],na.rmT)),ifelse(rightrightidx,max(filepart$deny_score[max(left,leftidx1):max(wdidx,left_up-1)],na.rmT),max(filepart$deny_score[max(left,leftidx1):wdidx],na.rmT)))return(result)}#--计算值result data.frame(t(sapply(wordindex,computevalue,citeration,wordindex,filepart)))names(result) c(adv,deny)final_result data.frame(ididname ,posnegfilepart$weight[wordindex],result)return(final_result)
}#####################################################################
#函数功能综合计算每条评论总得分
#参数说明texttb评论文本打上情感词、否定词和副词标签后的#情感词综合打分
valuefun-function(texttb){#抽取正负情感词所在的片段idnotnull-data.frame(idunique(texttb$id[complete.cases(texttb$weight)]))idnotnull$id-as.character(idnotnull$id)tstterm_nnid-join(texttb,idnotnull,typeinner)word_index-unique(tstterm_nnid$id)system.time(score_combine-lapply(word_index,word_segment,tstterm_nnid))score_combine_tb-do.call(rbind, score_combine) score_combine_tb$id-as.character(score_combine_tb$id)score_combine_tb$adv[score_combine_tb$adv-999]-1score_combine_tb$deny[score_combine_tb$deny-999]-1score_combine_tb$value-score_combine_tb$posneg*score_combine_tb$adv*score_combine_tb$denysubconvalue-aggregate(score_combine_tb$value,bylist(score_combine_tb$id),sum)subconvalue$idtot-as.numeric(unlist(lapply(strsplit(subconvalue$Group.1,-),function(x) x[1])))commentvalue-aggregate(subconvalue$x,bylist(subconvalue$idtot),sum)names(commentvalue)[1]-idcommentvalue$x-round(commentvalue$x,2)return(commentvalue)
}
system.time(valuetb-valuefun(tstterm))9.3.5总结
至此可以根据用户相似度让用户看到与他相似用户的评论并且可以按照文本质量评分及情感性分值根据产品策略进行排序。从技术运维的角度来说算法的结束并不是技术的终结后期自定义词库及调整打分权重都需要分析师根据实际样本做出调整在数据分析领域永远没有完结的项目除非业务被终结了。