## sougou用户画像数据分析与数据挖掘####
## 数据预处理和数据探索
## 分词文件



##设置工作文件夹
setwd("/Users/Daitu/数据分析/CCF/Sogou画像")
getwd()
## [1] "/Users/daitu/数据分析/CCF/Sogou画像"
## 加载所需要的包
library(readr)
library(readxl)
library(jiebaR)
## Loading required package: jiebaRD
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(parallel)
library(stringr)
library(plyr)
## -------------------------------------------------------------------------
## You have loaded plyr after dplyr - this is likely to cause problems.
## If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
## library(plyr); library(dplyr)
## -------------------------------------------------------------------------
## 
## Attaching package: 'plyr'
## The following objects are masked from 'package:dplyr':
## 
##     arrange, count, desc, failwith, id, mutate, rename, summarise,
##     summarize
## 读取数据####
## 读取训练集
filename <- "traindata.txt"
traindata <- readLines(filename,encoding = "UTF8")
## 读取测试集
filename <- "testdata.txt"
testdata <- readLines(filename,encoding = "UTF8")
## 对测试集和训练集进行预处理
## 便携一个处理每条训练数据的函数####
split_strs <- function(str1,n = 5){
  ## 该函数用来切分字符串,并返回一个向量
  ## str1 :所要分解的字符串
  ## n:要输出的向量个数
  strvec <- vector()
  # str1 <- traindata[1]
  str1s <- str_split(str1,pattern = "\t",simplify = FALSE)
  ## 对训练集进行处理
  if(n == 5){
    strvec[1] <- str1s[[1]][1]
    strvec[2] <- str1s[[1]][2]
    strvec[3] <- str1s[[1]][3]
    strvec[4] <- str1s[[1]][4]
    strvec[5] <- str_c(str1s[[1]][5:length(str1s[[1]])],collapse=",")
  }
  if(n == 2){
    strvec[1] <- str1s[[1]][1]
    strvec[2] <- str_c(str1s[[1]][2:length(str1s[[1]])],collapse=",")
  }
  return(strvec)
}

split_strs(traindata[1])
## [1] "22DD920316420BE2DF8D6EE651BA174B"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
## [2] "1"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
## [3] "1"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
## [4] "4"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
## [5] "柔和双沟,女生,中财网首页 财经,http://pan.baidu.com/s/1plpjtn9,周公解梦大全查询2345,曹云金再讽郭德纲,总裁大人行行好,中财网第一财经传媒,教师节全文,男子砸毁15墓碑,黄岩岛最新填海图,引起的疲,缘来未迟落跑甜心不好惹,梁朝伟与替身同框,笑傲江湖电视剧任贤齐,小起名字女孩名字,海运行李到堪培拉,确定,诱爱99天 司少的天价宝贝,什么是遥控魔棒,徽信表情动态搞笑图片,教师节征文100字,安微联通网上营业厅,甜宠百分百:校草的萌萌未婚妻,豪门重生之暖爱成婚,nikehypershift和kd5哪个好看,韭菜炒鸡蛋,陈赫玩王者荣耀,虎牙楚河,三国演义小说txt下载,威县欧派,炒馍花怎么做好吃,黄岩岛最新消息2016年,中秋节诗句大全祝福,教师节征文,菜谱,柔和双沟卖的怎么样,七位数开奖结果,以色列停车场坍塌,天龙家庭农场,7.22什么星座,新旧约圣经和合本下载,4π,wifi万能钥匙,威灵仙图片,临泉长官天龙家庭农场,早安总统大人,百合,莲藕的做法,花街,无锡,蚬壳胃散怎么吃,触手忆寒,中秋节的诗句,孟州电信 电子发票,鸡丝汤的做法,我等你,临泉长官镇桥口李小刚农场,朋仇,全民k歌,炸葱花,蒜苔炒肉,冰川的图片,kd5,…,若风,好奇纸尿裤,清蒸鱼,189.8是谁的平方,重庆餐馆发生爆炸,捡手机被失主抢劫,https://yunpan.cn/ocsqfgtfya2ewj,炒馍花的家常做法,三国演义小说百度云,总裁掠爱小舅别太坏,:https://yunpan.cn/cmh8tmeyraiww,周公解梦,查坦克冰川,凉拌藕片的做法,投票,鸡丝炒什么好吃,被时光掩埋的秘密小说下载,中国电信电子发票,张续豪,关于月亮的诗句,用酵母蒸馒头的方法,赵丽颖碧瑶坐,触手兵长,图集 下载腾讯新闻,看街头混战武警,厦门航空,蚬壳胃散,炒茄子做法,身份类别怎么填,最好的我们里面的方特在哪里,牢里面的生活是怎样的,强迫症有哪些表现,白袍法师暖暖图片,朋仇广场舞,小宇热游,蒸馒头的方法,狡滑的意思,黄石大冶东岳派出所服务电话,三国演义小说下载txt,http://zxjhjc9088.1688.com,松柏道馆,10.1高速免费几天,三国演义小说txt,柔和双沟业务待遇,酵母蒸馒头的方法,初中家教一对一辅导,口子窖,中秋节祝福诗句,侠岚,文王国窖42度价格表1001文王国窖42度价格表,批注是什么意思,殿下专属小丫头,无锡爆炸,炸茄子做法,http://pan.baidu.com/s/1cor7gy,大件行李邮寄,烟火陈翔,没想到,真没想到作文,安徽滁州石坝镇,虎牙小宇,驾校培训跑长途,骨质性关节炎,左膝盖内侧疼是怎么回事,虎皮尖椒的做法大全,陈翔的女朋友吻照,q我的世界、5,23.04的平方根,神将世界表情包,寻找成龙,柔和双沟卖的,三国演义txt百度云,一般现在时,澳洲邮寄行李费用,触手若月,1991年11月26日是什么星座,校草成长记,暮光女向女友求婚,钢弩的价格图片,乐乐课堂,宠妻成瘾老婆你要乖,魔手tv,梅河口到济南的火车票,临泉长官镇,君子兰,南洋十大邪术电影,肚,炸油条的做法和配方,根号6等于多少,笑笑昨日帝王骗,吃惊的什么填词语,50字教师节征文,朝阳区黑庄户邮编,千百鲁,1991年农历11月26日是什么星座,圣经和合本免费下载,水煮花生米的做法,http://pan.baidu.com/s/1jhbv9pg,十字弓,徽信表情含义,天才小熊猫微博长图,宠冠六宫:帝王的娇蛮皇妃,去广告软件 安卓版,萌妻娇俏帝少我嘴挑,总裁霸爱小小新娘要逃婚,花生怎么煮好吃,中国证券网,柔和双沟销售,中秋节的诗句图片,男子怪病喝洗洁精,4π等于多少,服装批发5元,怀孕33周肚子隐隐作痛怎么回事,百度云,酱炒蒜苔的家常做法,水煮花生米,天才小熊猫作品,袁姗姗,临泉长官镇桥口,呼作白玉盘的上一句,微信表情包搞笑图片,滴滴快车司机端,教师节手抄报简单好看,大冶公安局 派出所,柔和双沟业务待遇怎么样,为什么哺乳期不会有月经,临泉长官水上乐园,忐忑不安的意思,临泉长官李小刚家庭农场,电信电子发票怎么报销,岳不群,:http://pan.baidu.com/s/1plefcb5,临泉长官镇桥口李天龙农场,凉拌水煮花生米的做法,威灵仙的功效与作用,http://pan.baidu.com/s/1o7hnpmy,鸽子汤的做法,战神伪高冷 天降医妃拐回家,白颠疯初期症状,天才小熊猫,首席萌妻咬一口,弩弓枪商城,三国演义小说,临泉长官镇桥口植物养殖基地,邮储银行手机银行客户端下载,煮花米怎么做好吃,英语在线翻译,糖醋鲤鱼,www.2016yg.com,搞笑微信表情图片带字,新婚甜似火:鲜妻,二胎生一对,三国演义,关于教师节的手抄报,http://m37189.mustfollow.vx.mvote.net/wx,文王国窖42度价格表,鱼汤的做法,http://www.cswanda.com/weixin/game1/2016,临泉长官镇桥口私人农场,临泉长官镇桥口镇杨营,临泉长官李天龙家庭农场,李子树根部有脓包怎么回事,单手高速转牌,医学院在什么路上,徽信早上好动态表情,宝宝小名大全2016洋气,寂寞男女聊天记录截图,https://yunpan.cn/oc6nhvmrg5j2ur,神将世界,美丽的秋天作文300字,http://pan.baidu.com/s/1nu9uizn,钢弩,冰川世纪电影,全文,触手蓝烟,鱼的做法,金罐加多宝20罐,澳洲托运行李规定,15346171303@189.cn,炒蒜苔的家常做法,被时光掩埋的秘密,根号13.6等于几,方特东方神画,粉红花朵图片,qq号申请,千亿盛宠 大叔吻慢点,http://linjiada1989.1688.com,东方财富网首页,http://pan.baidu.com/s/1hraemhe,动力煤价格,手机遥控魔棒,jzg,http://pan.baidu.com/s/1o8cxpmm,行李托运到澳洲,蚬壳胃散副作用,红烧鲤鱼,触手tv,中国财经信息网中财网,立方根800,美食菜谱,笑傲江湖电视剧,柔和双沟怎么样,笑傲江湖,花的品种名字及图片,滴滴司机端,奇怪君,鸡蛋灌饼,天龙农家乐园,吉拉拉歌词,陈翔的女朋友,牢解场的生活,微微一笑很倾城,豪门少奶奶谢少的心尖宠妻"
## 处理训练数据集
traindata <- lapply(traindata, split_strs)
traindata <- plyr::ldply(traindata)
names(traindata) <- c("ID","Age","Gender","Education","QueryList")
## 处理测试数据集
testdata <- lapply(testdata, split_strs,n=2)
testdata <- ldply(testdata)
names(testdata) <- c("ID","QueryList")
## 数据预处理###
## 1:准备停用词
# file_coding("中文停用词库.txt")
filename <- "中文停用词库.txt"
file_coding(filename)
## [1] "gb2312"
stopwordchinese <- read.csv(file = "中文停用词库.txt",header = FALSE,sep = "\n",
                            fileEncoding = file_coding("中文停用词库.txt"),
                            stringsAsFactors = FALSE)
stopworbaidu <- read.csv(file = "百度停用词列表.txt",header = FALSE,sep = "\n",
                         fileEncoding = file_coding("百度停用词列表.txt"),
                         stringsAsFactors = FALSE)
stopworsichuan <- read.csv(file = "四川大学机器智能实验室停用词库.txt",header = FALSE,sep = "\n",
                           fileEncoding = file_coding("四川大学机器智能实验室停用词库.txt"),
                           stringsAsFactors = FALSE)
## 融合停用词
mystopword <- unique(c(stopwordchinese$V1,stopworbaidu$V1,stopworsichuan$V1))

## 查看每类型的数量
traindata$Age <- as.numeric(traindata$Age)
traindata$Gender <- as.numeric(traindata$Gender)
traindata$Education <- as.numeric(traindata$Education)
summary(traindata)
##       ID                 Age            Gender        Education    
##  Length:20000       Min.   :0.000   Min.   :0.000   Min.   :0.000  
##  Class :character   1st Qu.:1.000   1st Qu.:1.000   1st Qu.:3.000  
##  Mode  :character   Median :2.000   Median :1.000   Median :4.000  
##                     Mean   :2.068   Mean   :1.389   Mean   :3.906  
##                     3rd Qu.:3.000   3rd Qu.:2.000   3rd Qu.:5.000  
##                     Max.   :6.000   Max.   :2.000   Max.   :6.000  
##   QueryList        
##  Length:20000      
##  Class :character  
##  Mode  :character  
##                    
##                    
## 
## 剔除信息缺失的数据
sum(traindata$Age == 0 | traindata$Gender == 0 | traindata$Education == 0 )
## [1] 2337
## 存在2337个样本存在未知的信息
## 因为2337个样本量很少,所以先将这些含有未知的数据剔除
traindata <- traindata[!(traindata$Age == 0 | traindata$Gender == 0 | traindata$Education == 0 ),]


## 选折样本进行分词处理 ####
## 另一种快速的分词方法
## 构建分词工作器
lincsep <- jiebaR::worker(type = "mix")
traindatasample <- sample_n(traindata,size = 1000)
# fenci <- apply_list(as.list(traindatasample$QueryList),lincsep)
system.time({
  fenci <- apply_list(as.list(traindatasample$QueryList),lincsep)
  # fenci <- apply(data.frame(traindatasample$QueryList), 1, segment,lincsep)
  fenci <- sapply(fenci, filter_segment,filter_words = mystopword)
})
##    user  system elapsed 
##  23.599   0.037  23.639
traindatasample$QueryList[10]
## [1] "火星,哺乳期乳房有硬块,碰到会痛,boss凶猛老公领证吧,董文华老公张楠简历,16099期双色球,九月英文,胸口的英文单词,邪王的倾城狂妻鬼妃天下,天上的星星贾平凹,透视高手,火星单词,胸口的单词,muzza,boss凶猛:老公,喂不饱,我认为你不仅仅是我的老师,你还是我的朋友 ,哦漫画,天上的星星 贾平凹,斗破苍穹,古代寓言二则,冰心纸船阅读答案,教师节英语作文带翻译,贾平凹,),小学英语单词怎么写,某个玻璃饰品的外形是简单多面体,七年级上册语文书苏教版,所示的八棱柱,我希望用每一天去感谢你 用英语怎么说,斗罗大陆的,小学,斗罗大陆3龙王传说,spacecraft,天上的星星贾平凹读后感,代孕婚妻,圆锥体怎么用卡纸做,adventure什么意思,太原鲁艺,muz,李帅,古代寓言二则翻译,sm,鲁艺,货币发展的四个阶段,贾平凹天上的星星主要内容,罗摩衍那读音,逆天邪神,murray,发射器的英文单词,游世无双漫画,写出冰心纸船一诗的中心句,货币的发展四个阶段,汽车超人1分钱汽车,李帅画家,古代皇帝玩妃子,顾若莫离,发射器的英文,天上的星星全文概括,安恩和奶牛,天上的星星 贾平凹全文概括,逆天透视眼,mars,muz的意思,我叠纸船为什么含着泪,捡个杀手做老婆,圆锥体怎么用卡纸做图片,太空飞船的单词,七年级上册语文书,program,德奥拉夫人,天上的星星读后感,天上的星星,火星的英文单词,小学英语"
fenci[[10]]
##   [1] "火星"       "哺乳期"     "乳房"       "硬块"       "碰到"      
##   [6] "会痛"       "boss"       "凶猛"       "老公"       "领证"      
##  [11] "董文华"     "老公"       "张楠"       "简历"       "16099"     
##  [16] "双色球"     "九月"       "英文"       "胸口"       "英文单词"  
##  [21] "邪王"       "倾城"       "狂妻"       "天下"       "天上"      
##  [26] "星星"       "贾平凹"     "透视"       "高手"       "火星"      
##  [31] "单词"       "胸口"       "单词"       "muzza"      "boss"      
##  [36] "凶猛"       "老公"       "老师"       "朋友"       "漫画"      
##  [41] "天上"       "星星"       "贾平凹"     "斗破"       "苍穹"      
##  [46] "古代"       "寓言"       "二则"       "冰心"       "纸船"      
##  [51] "阅读"       "答案"       "教师节"     "英语"       "作文"      
##  [56] "翻译"       "贾平凹"     "小学"       "英语单词"   "玻璃"      
##  [61] "饰品"       "外形"       "简单"       "多面体"     "七年级"    
##  [66] "上册"       "语文"       "苏教版"     "所示"       "棱柱"      
##  [71] "希望"       "感谢"       "英语"       "斗罗"       "大陆"      
##  [76] "小学"       "斗罗"       "大陆"       "龙王"       "spacecraft"
##  [81] "天上"       "星星"       "贾平凹"     "读后感"     "代孕"      
##  [86] "婚妻"       "圆锥体"     "卡纸"       "adventure"  "太原"      
##  [91] "鲁艺"       "muz"        "李帅"       "古代"       "寓言"      
##  [96] "二则"       "翻译"       "sm"         "鲁艺"       "货币"      
## [101] "发展"       "四个"       "阶段"       "贾平凹"     "天上"      
## [106] "星星"       "内容"       "罗摩衍那"   "读音"       "逆天"      
## [111] "邪神"       "murray"     "发射器"     "英文单词"   "游世"      
## [116] "无双"       "漫画"       "写出"       "冰心"       "纸船"      
## [121] "一诗"       "中心"       "货币"       "发展"       "四个"      
## [126] "阶段"       "汽车"       "超人"       "分钱"       "汽车"      
## [131] "李帅"       "画家"       "古代"       "皇帝"       "妃子"      
## [136] "顾若莫离"   "发射器"     "英文"       "天上"       "星星"      
## [141] "全文"       "概括"       "安恩"       "奶牛"       "天上"      
## [146] "星星"       "贾平凹"     "全文"       "概括"       "逆天"      
## [151] "透视"       "mars"       "muz"        "我叠"       "纸船"      
## [156] "含着泪"     "杀手"       "老婆"       "圆锥体"     "卡纸"      
## [161] "图片"       "太空"       "飞船"       "单词"       "七年级"    
## [166] "上册"       "语文"       "program"    "奥拉夫"     "天上"      
## [171] "星星"       "读后感"     "天上"       "星星"       "火星"      
## [176] "英文单词"   "小学"       "英语"
## 并行版本
system.time({
  fenci <- apply_list(as.list(traindatasample$QueryList),lincsep)
  cl <- makeCluster(4)  # 初始化四核心集群
  results <- parLapply(cl = cl,fenci,filter_segment,filter_words = mystopword) # lapply的并行版本
  stopCluster(cl) # 关闭集群
})
##    user  system elapsed 
##   1.050   0.031   7.523
## 测试分词和去停用词时间
system.time({
  fenci <- apply_list(as.list(traindatasample$QueryList),lincsep)
})
##    user  system elapsed 
##   0.921   0.010   0.932
system.time({
  fenci <- sapply(fenci, filter_segment,filter_words = mystopword)
})
##    user  system elapsed 
##  22.881   0.022  22.906
## 并行版本
system.time({
  fenci <- apply_list(as.list(traindatasample$QueryList),lincsep)
})
##    user  system elapsed 
##   0.900   0.012   0.911
system.time({
  cl <- makeCluster(4)  # 初始化四核心集群
  results <- parLapply(cl = cl,fenci,filter_segment,filter_words = mystopword) # lapply的并行版本
  stopCluster(cl) # 关闭集群
})
##    user  system elapsed 
##   0.128   0.021   6.622
## 对训练进行分词和去停用词处理
# 用system.time来返回计算所需时间
## 并行版本
system.time({
  fenci <- apply_list(as.list(traindata$QueryList),lincsep)
})
##    user  system elapsed 
##  17.568   0.196  17.772
system.time({
  cl <- makeCluster(4)  # 初始化四核心集群
  results <- parLapply(cl = cl,fenci,filter_segment,filter_words = mystopword) # lapply的并行版本
  stopCluster(cl) # 关闭集群
})
##    user  system elapsed 
##   2.567   0.300 113.775
## 保存分词的结果
resultsID <- traindata[c("ID","Age","Gender","Education")]

save(results,file = "训练集分词结果.RData")
save(resultsID,file = "训练集分词标记.RData")

## 对测试集进行分词-----------------------------------------------------
# 用system.time来返回计算所需时间

## 并行版本
system.time({
  fencitest <- apply_list(as.list(testdata$QueryList),lincsep)
})
##    user  system elapsed 
##  19.898   0.235  20.136
system.time({
  cl <- makeCluster(4)  # 初始化四核心集群
  resultstest <- parLapply(cl = cl,fencitest,filter_segment,filter_words = mystopword) # lapply的并行版本
  stopCluster(cl) # 关闭集群
})
##    user  system elapsed 
##   3.215   0.354 130.462
resultstestID <- testdata["ID"]

## 保存分词结果
save(resultstest,file = "预测集分词结果.RData")
save(resultstestID,file = "预测集分词标记.RData")