zoukankan      html  css  js  c++  java
  • 大论文微博个性化

    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'	' '{print $2}' | sort | uniq -c | sort -r -n | sed 's/^ *//g' | sed 's/ /	    /g' | awk -F'	' '{print $2"	"$1}' | sort >$program_dir/$program/$program"_userid_times.map"
     16     join -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'	' '{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 $'	' -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'	' 'BEGIN{printf("%s	","'$userid'")}{printf("%s ",$1)} END{printf("	%s
    ",NR);}' | awk -F'	' '{print $1"	"$3"	"$2}' | sed 's/ *$//g' >> $tmp_file
    done < $userIdList
    
    #对结果文件根据用户的活跃度进行排序
    cat $tmp_file | sort -r -n -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/ /
    /g' | grep -v '^$'| sort | uniq -c | sort -r -n | head -n 200 | sed 's/^ *//g'|sed 's/ /	/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'	' '{print $11}' | sed 's/ /
    /g' | grep -v null | sort | uniq -c | sort -r -n | sed 's/^ *//g' | sed 's/ /	/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("	");
                    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/ /	/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运行脚本
  • 相关阅读:
    macOS 的 rootless 机制的关闭与打开
    关于 Android 9.0 ClassNotFoundException: Didn't find class "org.apache.http.protocol.BasicHttpContext"
    Android 笔记
    AS apk 安装不了问题
    关于 android.view.WindowLeaked: 窗体泄露
    AS 解决support-annotations版本冲突
    Android xml 设置半透明
    macOS 配置 adb 和 Android Studio 配置夜神模拟器
    iOS 获取控件相对屏幕(父N级)坐标位置
    NSInternalInconsistencyException attempt to delete row 2 from section 4 which only contains 0 rows before the update 问题原因
  • 原文地址:https://www.cnblogs.com/bobodeboke/p/3832366.html
Copyright © 2011-2022 走看看