大论文微博个性化
1,提取出每个节目下的用户列表
2,将用户id列表与用户的profile进行对应
实现脚本如下:
1 #/bin/sh 2 3 program_dir=/home/minelab/liweibo/raw_data 4 user_file=/home/minelab/liweibo/springNightUser/sina_user.data 5 6 program_list=`ls $program_dir` 7 8 for program in $program_list 9 do 10 #对每个节目生成两个文件 11 #节目名称_userid_times.map 字段:用户id 用户发表该节目相关的微博的次数 12 #节目名称_userid_times_profile 字段:用户id 用户提到该节目的次数 用户昵称 用户性别 用户地域 用户生日 用户关注数目 用户粉丝数目 用户发布微博数目 用户标签 13 rm -rf $program_dir/$program/$program"_userid_times.map" 14 rm -rf $program_dir/$program/$program"_userid_times_profile.map" 15 cat $program_dir/$program/$program.data| awk -F'\t' '{print $2}' | sort | uniq -c | sort -r -n | sed 's/^ *//g' | sed 's/ /\t /g' | awk -F'\t' '{print $2"\t"$1}' | sort >$program_dir/$program/$program"_userid_times.map" 16 join -t $'\t' $program_dir/$program/$program"_userid_times.map" $user_file >$program_dir/$program/$program"_userid_times_prof ile.map" 17 18 echo $program is done! 19 done 20 21 echo "all is done!"
3,对节目信息进行编号
#!/bin/sh program_dir=/home/minelab/liweibo/raw_data inter_dir=/home/minelab/liweibo/inter_data result_file=$inter_dir/id_program.map program_list=`ls $program_dir` rm -rf $result_file i=1 for program in $program_list do echo $i" "$program>>$result_file i=$[$i+1] done echo "done"
得到的id_program.map文件
1 百花争妍 2 倍儿爽 3 春晚是什么 4 答案 5 扶不扶 6 符号中国 7 光荣与梦想 8 欢歌 9 剑心书韵 10 卷珠帘 11 康定情歌 12 空空拜年 13 老阿姨 14 练兵舞 15 玫瑰人生 16 梦蝶 17 魔幻三兄弟 18 难忘今宵 19 年味儿 20 青春舞曲 21 情非得已 22 群发的我不回 23 扰民 24 人到礼到 25 舌尖上的春晚 26 时间都去哪儿 27 说你什么好 28 套马杆 29 天下黄河九十九道弯 30 天耀中华 31 同光十三绝 32 团圆饭 33 万马奔腾 34 万泉河水 35 我的要求不算高 36 我的中国梦 37 我就这么个人 38 想你的365天 39 小马欢腾 40 野蜂飞舞 41 英雄赞歌 42 英雄组歌 43 在那遥远的地方 44 站在高岗上 45 张灯结彩 46 最好的夜晚
4,建立节目id_用户矩阵
#!/bin/bash #最终得到的文件格式是节目id" "评论该节目的用户数目" "评论该节目的用户id列表(不同id之间使用空格分开) #如果一个用户多次评论某个节目,当作一次进行处理 program_dir=/home/minelab/liweibo/raw_data inter_dir=/home/minelab/liweibo/inter_data result_file=$inter_dir/programid_userlist.map tmp_file=$inter_dir/programid_userlist.tmp program_list=`ls $program_dir` rm -rf $result_file rm -rf $tmp_file i=1 for program in $program_list do user_list=`cat $program_dir/$program/$program"_userid_times_profile.map" | awk -F'\t' '{printf("%s ",$1);}End{print;}'` line_num=`cat $program_dir/$program/$program"_userid_times_profile.map" | wc -l | awk '{print $1}'` echo $i" "$line_num" "$user_list >>$tmp_file i=$[$i+1] done #根据节目流行度进行排序 cat $tmp_file | sort -t $'\t' -k 2 -r -n > $result_file rm -rf $tmp_file echo "done"
从中抽取出用户id列表文件,共有用户
据此,可以统计节目下节目的流行度(根据节目下评论的人数,这个在/home/minelab/liweibo/inter_data/programid_userlist.map这个文件中第二列有记录)
5,建立用户_节目id矩阵
#!/bin/bash #最终得到的用户id和用户评论节目的文件格式是 #用户id 用户评论节目的个数 用户评论节目的id列表 inter_dir=/home/minelab/liweibo/inter_data programid_userlist_file=$inter_dir/programid_userlist.map result_file=$inter_dir/userid_programlist.map tmp_file=$inter_dir/userid_programlist.tmp userIdList=$inter_dir/userid.list rm -rf $tmp_file rm -rf $result_file while read userid do cat $programid_userlist_file | grep $userid | awk -F'\t' 'BEGIN{printf("%s\t","'$userid'")}{printf("%s ",$1)} END{printf("\t%s\n",NR);}' | awk -F'\t' '{print $1"\t"$3"\t"$2}' | sed 's/ *$//g' >> $tmp_file done < $userIdList #对结果文件根据用户的活跃度进行排序 cat $tmp_file | sort -r -n -t $'\t' -k 2 > $result_file rm -rf $tmp_file echo "done"
据此,可以统计用户的活跃度(一百多万个用户,现在还没有跑完)
8,统计每个节目下的热门词汇top200
#!/bin/bash data_dir=/home/minelab/liweibo/springNightForLargePaper fenci_dir=$data_dir/springNightFenci data_list=`ls $fenci_dir` top_word_dir=$data_dir/topWordForProgram for program in $data_list do rm -rf $top_word_dir/$program.words cat $fenci_dir/$program | sed 's/ /\n/g' | grep -v '^$'| sort | uniq -c | sort -r -n | head -n 200 | sed 's/^ *//g'|sed 's/ /\t/g' >$top_word_dir/$program.words echo $program" 热门词频统计完毕!" done echo "done!"
/home/minelab/liweibo/springNightForLargePaper/topWordForProgram有记录
9,统计每个节目对应用户标签的top200
统计节目下用户标签(按照频率大小排序)
#!/bin/bash raw_data_dir=/home/minelab/liweibo/raw_data result_dir=/home/minelab/liweibo/springNightForLargePaper/topLabelForProgram program_list=`ls $raw_data_dir` for program in $program_list do rm -rf $result_dir/$program".label" cat $raw_data_dir/$program/$program"_userid_times_profile.map" | awk -F'\t' '{print $11}' | sed 's/ /\n/g' | grep -v null | sort | uniq -c | sort -r -n | sed 's/^ *//g' | sed 's/ /\t/g' > $result_dir/$program".label" echo $program" label is done!" done echo "done!"
/home/minelab/liweibo/springNightForLargePaper/topLabelForProgram是结果
10,对每一个节目进行分词处理
package com.bobo.DataPre; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import com.bobo.util.Constants; import com.bobo.util.Fenci; import com.bobo.util.StopwordsRemover; import com.bobo.util.StringUtil; import com.bobo.util.UtilityForRemoveAtName; public class ProgramDataPre { // 处理团圆饭.sample文件, // 其中正样本为569,负样本为615 public static void main(String[] args) { long start = System.currentTimeMillis(); for(String programName : Constants.ProgramNameList){ String inFilePath = Constants.DataDir + File.separator + programName + ".data"; String outFilePath = Constants.fenciDir + File.separator + programName + ".fenci"; ProgramDataPre pre = new ProgramDataPre(); pre.dataSetAndRmStop(inFilePath, outFilePath); long end = System.currentTimeMillis(); System.out.println(programName+"数据预处理,分词、去处停用时、去除@花费的时间为:" + (end - start) / 1000); } } // 第一步,进行分词、去除停用词、去除@后的用户名称? private void dataSetAndRmStop(String inFilePath, String outFilePath) { FileReader fr = null; BufferedReader br = null; FileWriter fw = null; BufferedWriter bw = null; PrintWriter pw = null; String line = null; Fenci fenci = new Fenci(); fenci.initial(); StopwordsRemover stop = new StopwordsRemover(); stop.setStoppingListSet(stop .loadStoppingListSet("./conf/stopwords.list")); try { fr = new FileReader(inFilePath); br = new BufferedReader(fr); fw = new FileWriter(outFilePath); bw = new BufferedWriter(fw); pw = new PrintWriter(bw); while ((line = br.readLine()) != null) { String[] lineArr = line.split("\t"); if (lineArr.length != 7) { continue; } if (StringUtil.isNullOrEmpty(lineArr[6])) { continue; } String fenciString = stop.removeStoppingWords(fenci .testICTCLAS_ParagraphProcess((UtilityForRemoveAtName .removeName(lineArr[6])))); if (!StringUtil.isNullOrEmpty(fenciString)) { pw.println(fenciString); } } } catch (Exception e) { e.printStackTrace(); System.out.println("RemoveUrlUtil.java文件去除链接出现异常"); } finally { try { br.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } pw.close(); } } }
11,准备lda的数据
#bin/bash root_dir=`pwd` filenames=`ls ${root_dir}/springNightFenci | awk -F'.' '{print $1}'` i=1 for filename in $filenames do echo $filename rm -rf $root_dir/lda_result/$i mkdir $root_dir/lda_result/$i wc -l $root_dir/springNightFenci/$filename.fenci | awk -F' ' '{print $1}' > $root_dir/lda_result/$i/train.data cat $root_dir/springNightFenci/$filename.fenci | sed 's/^ *//g' | sed 's/ /\t/g' | sed 's/^M$//g' | grep -v '^$' >> $root_dir/lda_result/$i/train.data # i=$[$i+1] let i=i+1 done
12,对每一个节目跑一遍LDA
#!/bin/bash root_dir=`pwd` lda_dir='/home/minelab/cctv2014/calculate_result/Src/shaoxianlei/lda' for i in `seq 1 46` do echo $i $lda_dir/lda -est -alpha 6.25 -beta 0.01 -ntopics 8 -niters 300 -savestep 100 -perplexity_step 310 -twords 30 -dfile $root_dir/lda_result/$i/train.data done