大论文微博个性化

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!"
节目用户信息处理extractUserForLargePaper.sh

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

得到的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    最好的夜晚
id_program.map

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_用户矩阵

 从中抽取出用户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"
得到用户id和节目列表的倒排矩阵

 据此,可以统计用户的活跃度(一百多万个用户,现在还没有跑完)

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!"
统计节目下热门词汇top200

/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
为跑LDA做准备

 

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
LDA运行脚本

 

 

 

 

posted @ 2014-07-08 21:13  bobo的学习笔记  阅读(252)  评论(0编辑  收藏  举报