Skip to main content

关于应用分类的一点思考及实践

问题

这周遇到了一个有点意思的小需求:将用户安装的应用作为用户的一个特征,基于这类的特征对用户进行分析。我们可以得到的数据有:包的名称(例如,jwws.jhwdagtcom.zhihu)和应用名称(例如,微信、搜狐新闻等)。初步统计了一下,唯一的应用名称就有20多万个,很显然,如果直接将应用名称或者包名称作为一个维度的话,可能会面临两个问题:

  • 维度过大,计算时间可能比较多
  • 数据过于稀疏,可能每个应用覆盖的用户数差别会很大,多的特别多,少的特别少,数据可靠性不能保证

解决思路

第一个想法是:对这些应用进行聚类或者分类,把它们抽象一层,按照各应用的功能对各应用进行一个简单的划分。然后基于这个抽象的层次来对刻画用户的属性特征,这样既能降低维度又能缓解数据的稀疏性问题。

有想过直接从某些应用商店直接爬取各大应用分类及分类下对应的各应用的名称,可是稍微看了下,发现列举出来的应用有限,而且分类规则也各不相同,没有一个很统一的标准。因此,在这里,我还是打算对一些数据进行下分析,看能不能找出一些规律。

定义分类模式

调研了下各应用商店的不同层级划分,发现基本上差别不大,这里提供一个我觉得还比较合理的一个划分(当然,可以根据具体的目的来采取不同的分类架构):

上图中第一列表示一级分类(共21个),第二列表示二级分类(共137个)。

开始分类

有了这个分类体系之后,接下来面临的问题是:怎么将这些应用划分到对应的分类中呢?回顾下,目前已有的信息是:包名+应用名的对应关系还有已经定义好的分类架构。这里直接说下思路:将分类名称进行分词(在这里,我们直接使用的是jieba分词进行中文分词),作为该分类的向量,例如:搜索下载这个分类可以初始表示为:[搜索、下载]

20.5    即时战略    即时,即时战略,战略
20.6    消除游戏    游戏,消除
20.7    角色扮演    扮演,角色扮演,角色
20.8    棋牌游戏    游戏,棋牌
20.9    赛车跑酷    赛车,跑酷
20.1    策略游戏    策略,游戏
20.11   体育竞技    竞技,体育,体育竞技
20.12   卡牌游戏    卡牌,游戏
20.13   塔防守卫    卫,防守,塔
20.14   其他游戏    游戏,其他

啰嗦一点,发现jieba分词还是挺好用的,可以简单地使用以下三种方式进行分词,三种方式的差别可以具体参考:Python中结巴分词使用手记

import jieba

#卫,防守,塔
app_list = jieba.cut_for_search("塔防守卫")

app_list_1 = jieba_cut("XXX", cut_all=False)

app_list_2 = jieba_cut("XXX", cut_all=True)

初始向量示例

这样,我们可以得到各二级分类的初始词库,将应用的名称和二级分类的初始词库进行匹配,将匹配度大于1且最高的二级分类作为该应用的分类。

这样,我们就可以得到一个初步的训练集(当然,这么严格的条件下,大概只有1w4的应用都能匹配到),人工检查了下具体的分类,正确率基本上在90%以上。

www.clanguage.com   菜鸟学C语言  14.2|语言学习 
ru.stivenappsandgames   3D战车模拟驾驶    20.4|模拟经营 
com.juhu.activity   快递E栈    6.5|快递物流 
com.boyaa.engineliaochengqp 震东聊城棋牌  20.8|棋牌游戏 
foxth.qp.Glory  神龙娱乐    19.4|影音娱乐 
air.com.kooland 光头强开火车  11.4|火车服务 
com.ledscreen   屏幕LED手电筒    18.4|手电筒 
com.stv.supervod    我的电视台   0.4|电视直播
com.meichu.food 美厨美食    6.2|餐饮美食 
com.XiaoYaoYouXi    乐游竞技    20.11|体育竞技

初步分类结果示例

很明显,如果只有中文应用名称匹配的话,能匹配到的应用非常有限。经过观察,我们可以发现很多应用的包名也包含一定的信息量,例如:如果包名中包含game,很有可能是表明该应用属于游戏,而health则有可能表明该应用与健康有关。

于是,我们基于上面得到的初步分类训练集对各二级分类进行了个统计:发现很多二级分类中出现最多的基本上都是很通用的单词,例如com,cnandroid等。因此,我们需要把这些词给过滤掉,使用了两种方式:

  • 人工提取了一些词:
blackWords = {"." : 1, "com" : 1, "cn": 1, "android":1, "app":1, "net": 1, "dkmodel": 1, "_":1,"org":1, "mobile": 1, "main":1, "pub":1, "?":1 }
  • 统计过滤:将同时出现在超过5个二级分类中的单词作为黑名单单词,不作为特征

过滤后统计的结果示例如下:


二级分类-英文词映射关系

得到相应的映射关系之后,我们将这些包名中的英文单词作为二级分类的向量,与待分类中的应用包名进行匹配,计算余弦相似度,将余弦相似度大于0.1并且最高的那个二级分类作为该应用的二级分类,于是乎,我们就得到了第二个训练集(大概1.9w个应用有了分类)。

com.jjsy.zjh    美女炸金花   20.8|棋牌游戏 
cn.dream.android.fullMark   黄冈家教    2.0|购物商城 
com.zipt.web    ZipTool 4.3|体育资讯 
com.dingyou.ddmj    叮叮3D麻将  20.8|棋牌游戏 
com.nxp.nfc android-filechooser 11.5|公交服务 
com.bihu.driver 司机无线    20.4|模拟经营 
com.poketec.landlord_tt 天天斗地主   3.0|搜索下载 
com.night.cat   夜猫  3.7|语音助手 
com.king86.GodOfWar 战神之刃    20.3|动作格斗 
com.dh  口袋梦三国   20.8|棋牌游戏

再次分类结果示例

很显然,这个覆盖度仍然不够。因此,我们考虑可以将训练集中已分好类的应用中文名称作为输入,统计在中文名称中出现过的词语及词频,示例如下:


二级分类拓展匹配示例

接下来,我们就可以同时使用上述的三种方法对应用进行分类,取余弦相似度最高的那个最为最终的评估标准。最后得到一些结果如下所示:

duanxin 短信电骚机   16.3|网络短信   chExpSet|0.692939535194
com.cjfx    奔跑吧小飞侠  1.4|论坛贴吧    chExpSet|0.38680784005
com.litao   手电筒最强版  18.4|手电筒    chSet|0.774596669241
com.carnurse    车辆违章保姆  9.2|违章查询    chSet|0.408248290464
name.rhmjpg.jugnkr  赛罗奥特曼格斗HD   20.3|动作格斗   chExpSet|0.573303371626
com.vsco    美化照片修补器 10.1|图片美化   chExpSet|0.353553390593
com.novem   第一理财    7.5|P2P理财   chExpSet|0.373543683819
com.s420rcell   碉少堡论坛死神版    1.4|论坛贴吧    chExpSet|0.32671417103
air.Main    全景学习系统  14.2|语言学习   chExpSet|0.569224286403
com.epj 钢琴节奏大师  12.4|儿童教育   chExpSet|0.155222377445
com.rtes.reader 金融常识百科大全    8.4|百科问答    chExpSet|0.498505507586
cn.com.widemex.app.jlyc 移动办公    15.2|效率办公   chExpSet|0.704062884799
com.happyldc    纪念日助手   3.7|语音助手    chSet|0.408248290464
com.brandwisdom 酒店慧评    11.2|酒店服务   chExpSet|0.699950789397
com.caili   材料计算器   18.2|计算器    chSet|0.866025403784
com.timeloit.reg    法律法规    9.2|违章查询    enSet|0.258198889747
kids    Addition and Subtraction    12.4|儿童教育   enSet|0.322853724909
com.jb.gosms.font   GOSmsFontElgatino   17.4|字体美化   enSet|0.346410161514
com.byfund.web  掌上宝盈    4.3|体育资讯    enSet|0.2
com.android.providers.downloads com.android.providers.downloads.public_api_access_tests 15.1|云盘存储   enSet|0.258198889747
com.yingsoft.newKsbao_6608  人卫医学职称  14.3|考试宝典   enSet|0.335083126633
com.boyaa.huanlemajiang 欢乐麻将赢话费 20.8|棋牌游戏   enSet|0.458530737038

最终分类结果示例,最后一列表示分类原因,主要有三种类型:chSet-第一种方式,enSet第二种方式,chExpSet-第三种方式

目前,在保证准确率的前提下,能够通过以上三种方法一起分类的应用大概增长到了2.5w

总结

虽然目前通过上述的三个维度,能够将大概十分之一的应用进行比较准确地分类,但是仍然面临两个很严重的问题:

  • 覆盖率比较低,如何在保证准确率的前提下,提高召回率?
  • 没有现有的实验集,人工对20w个应用进行评估工作量太大,基本上无法做到,目前只能通过抽样进行查看。
打赏
微信扫一扫支付
微信logo微信扫一扫, 打赏作者吧~

mickey

记录生活,写给几十年后的自己。