上一篇文章《知识图谱在大数据中的应用》我们介绍了知识图谱的一些概念和应用场景,今天我们就来看一个具体的应用案例了解下知识图谱的应用。用户增长对于一个APP的生存起到了至关重要的作用,没有持续的用户增长,再好的APP也不会走的长远,为了获得更多的用户,APP运营商往往会鼓励老用户拉新并给与奖励,比如趣头条的收徒模式,用户每收一个徒弟就会得到几块到十几块的现金返现,但是这种模式同时也会引起广大黑产团伙的注意,黑产会利用各种手段来薅这些APP运营商的羊毛。
中国有句老话,叫物以类聚,人以群分,在反作弊和市场营销等应用中,如果我们能根据用户间的某些联系发现社群,然后对这些社群进行反作弊分析或商品推荐,往往会起到意想不到的效果。
本文就来介绍一个简单的社群发现的实践。构建社群我们首先需要找到社群用户的某种联系,上文提到的收徒模式本身就是用户间的一个天然联系,我们可以根据用户的师徒关系来构建社群。如下图所示,根据师徒关系我们构建了一个社群,点表示用户,边表示师徒关系。
有了这样的社群之后,我们就可以基于社群维度分析设备及用户行为的异常,比如单个设备登陆过多的用户,设备一直处于充电状态,所有用户行为高度一致等,同时可以计算社群用户作弊率来通过已知作弊用户来发现新的作弊用户。
理清了需求之后我们开始着手根据用户师徒关系构建社群。对"紧密联系"的不同理解产生了很多社区发现算法。下图是几种经典的社群发现算法。
社群算法

- Triangle Counting:三角关系,图论基础知识。
- Connected Components:连通图,图论基础知识。
- Strongly Connected Components:强连通图,图论基础知识。
- Label Propagation:标签传播算法。
- Louvain:一种基于"模块度"的经典算法。
因为本文重点不是讲述社群发现算法,所以这个算法具体的含义此处略过,有感兴趣的读者可自行研究。本文选用了最简单的连通图算法来实现社群发现,即只要两个节点之间有边我们就把它们归属为一个社群。下面我们进入根据用户师徒关系生成社群阶段。
Spark Graphx构建社群
Spark Graphx本身就提供了构建图并生成连通图的接口,我们只需要按要求输入数据就好了。如下图所示:
我们构建点和边,然后调用Graphx接口生成图,最后调用图的接口直接获取连通图。需要注意的是,Spark Graphx构建点和边时,id需要用Long类型的数字表示,所以我们需要维护一张用户id到数字id的维表。
//构建用户节点
val users: RDD[(VertexId, String)] =
spark.sparkContext.parallelize(Array((3L, "u3"), (7L, "u7"),(5L, "u5"), (2L, "u2"), (4L, "u4"),(6L, "u6"),(8L, "u8")))
//构建用户边
val relationships: RDD[Edge[String]] =
spark.sparkContext.parallelize(Array(Edge(7L, 3L,""), Edge(5L, 3L,""),Edge(5L, 2L,""), Edge(6L, 4L,""),Edge(8L, 6L,"")))
//组合节点和边构建图
val graph = Graph(users, relationships)
//从图中抽取出连通图
val components = graph.connectedComponents()
//获取连通图中的点,

本文介绍如何使用SparkGraphx实现社群发现,并通过连通图算法构建社群,随后将社群数据存储至图数据库Neo4j,展示了Neo4j的概念与使用,包括Cypher查询语言的示例。
最低0.47元/天 解锁文章
2455





