ger, 好的推荐( GER ) 引擎

分享于 

13分钟阅读

GitHub

  繁體 雙語
Good Enough Recommendation (GER) Engine
  • 源代码名称:ger
  • 源代码网址:http://www.github.com/grahamjenson/ger
  • ger源代码文档
  • ger源代码下载
  • Git URL:
    git://www.github.com/grahamjenson/ger.git
    Git Clone代码到本地:
    git clone http://www.github.com/grahamjenson/ger
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/grahamjenson/ger
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    足够的建议( GER )

    GER logo

    Build Status

    提供良好的建议可以获得 GREATER 用户参与,并提供增加价值的机会,否则不存在。 许多应用程序没有提供建议的主要原因是实现定制引擎或者使用现有引擎的困难。

    推荐( ) 是一个推荐引擎,可以扩展,易于使用,易于集成。 为了让你的应用程序或者产品能够提供足够的推荐,你可以为你的应用程序或者产品提供高质量的。

    快速入门指南

    注:GER函数返回承诺

    使用 npm 安装 gercoffee-script:

    npm install ger

    在你的javascript代码中,首先需要 ger:

    var g =require('ger')

    初始化内存事件存储管理器( ESM ),并创建足够好的推荐( GER ):

    var esm =newg.MemESM()var ger =newg.GER(esm);

    下一步是初始化命名空间 比如 movies。 命名空间是一个事件桶,它不会干扰其他bucket对象。

    ger.initialize_namespace('movies')

    下一步将事件添加到命名空间。 事件是一个三重( 人,行动,事物) 比如 boblikesxmen

    ger.events([{
     namespace:'movies',
     person:'bob',
     action:'likes',
     thing:'xmen',
     expires_at:'2020-06-06'}])

    GER以两种方式使用事件:

    • 通过查看他们的历史。比如 bobalicelike 类似电影来比较两个人,所以 bobalice 相似
    • 根据个人历史,比如 bobliked,电影 alice 提供推荐,所以我们可以推荐影片到 alice

    使用事件作为建议时,有两个警告:

    • 操作可能为负,比如 bobdislikesxmen,它不是建议的
    • 建议始终过期,15年前发生了 比如 boblikesxmen,所以现在也许他不会推荐 xmen

    所以GER有规则: 如果事件具有到期日期,则将它的视为建议,直到过期。

    GER可以为一个人生成建议,比如 会喜欢什么?

    
    ger.recommendations_for_person('movies', 'alice', {actions: {likes: 1}
    
    
    
    

    比如的建议,喜欢XMen的人是什么?

    
    ger.recommendations_for_thing('movies', 'xmen', {actions: {likes: 1}})
    
    
    
    

    让我们把它放在一起:

    var g =require('ger')var esm =newg.MemESM()var ger =newg.GER(esm);ger.initialize_namespace('movies')
    .then( function() {
     returnger.events([
     {
     namespace:'movies',
     person:'bob',
     action:'likes',
     thing:'xmen',
     expires_at:'2020-06-06' },
     {
     namespace:'movies',
     person:'bob',
     action:'likes',
     thing:'avengers',
     expires_at:'2020-06-06' },
     {
     namespace:'movies',
     person:'alice',
     action:'likes',
     thing:'xmen',
     expires_at:'2020-06-06' },
     ])
    })
    .then( function() {
     // What things might alice like?returnger.recommendations_for_person('movies', 'alice', {actions: {likes:1}})
    })
    .then( function(recommendations) {
     console.log("nRecommendations For 'alice'")
     console.log(JSON.stringify(recommendations,null,2))
    })
    .then( function() {
     // What things are similar to xmen?returnger.recommendations_for_thing('movies', 'xmen', {actions: {likes:1}})
    })
    .then( function(recommendations) {
     console.log("nRecommendations Like 'xmen'")
     console.log(JSON.stringify(recommendations,null,2))
    })

    这将输出:

    Recommendations For 'alice'
    {
     "recommendations": [
     {
     "thing": "xmen",
     "weight": 1.5,
     "last_actioned_at": "2015-07-09T14:33:37+01:00",
     "last_expires_at": "2020-06-06T01:00:00+01:00",
     "people": [
     "alice",
     "bob" ]
     },
     {
     "thing": "avengers",
     "weight": 0.5,
     "last_actioned_at": "2015-07-09T14:33:37+01:00",
     "last_expires_at": "2020-06-06T01:00:00+01:00",
     "people": [
     "bob" ]
     }
     ],
     "neighbourhood": {
     "bob": 0.5,
     "alice": 1 },
     "confidence": 0.0007147696406599602}
    Recommendations Like 'xmen'
    {
     "recommendations": [
     {
     "thing": "avengers",
     "weight": 0.5,
     "last_actioned_at": "2015-07-09T14:33:37+01:00",
     "last_expires_at": "2020-06-06T01:00:00+01:00",
     "people": [
     "bob" ]
     }
     ],
     "neighbourhood": {
     "avengers": 0.5 },
     "confidence": 0.0007923350883032776}

    alice的推荐中,xmen 是最高评级的推荐,因为alice以前有 liked,所以她现在可能喜欢它。 你可以过滤出在使用下面描述的filter_previous_actions 配置键之前已经被执行的建议。

    但是,这里示例的代码在 ./examples/basic_recommendations_exmaple.js 脚本

    配置

    GER允许你设置一些值来定制使用 configuration的建议生成。 below 是对所有可以配置密钥及其默认值的描述:

    默认默认值
    actions{}
    minimum_history_required0
    neighbourhood_search_size100
    similarity_search_size100
    neighbourhood_size25
    recommendations_per_neighbour10
    filter_previous_actions[]
    event_decay_rate1
    time_until_expiry0
    current_datetimenow()
    • actions 是一个对象,它的中键是操作名称,值是表示操作重要性的操作权重。
    • minimum_history_required 是一个人必须为生成建议而必须使用的最小事件量。 最好停止生成低可信度的建议。
    • neighbourhood_search_size 过去用于搜索邻居的事件的数量。 这里值对性能影响最高,但超过某一点时,( 或者负数) 对建议没有影响。
    • similarity_search_size 是历史中用来计算事物或者人之间相似性的事件量。
    • neighbourhood_size 搜索搜索的类似人员的数量。 这个值有很大的性能影响,并且在一个点上增加它也会增益返回。
    • recommendations_per_neighbour 每个类似人员可以提供的建议数量。 这样可以停止一个非常相似的人提供所有建议的情况。
    • filter_previous_actions 删除推荐的人在他们的历史中已经被推荐的建议。 例如如果某个人已经喜欢 xmen,那么如果 filter_previous_actions["liked"],那么他们就不推荐使用 xmen
    • event_decay_rate 事件权重随着时间衰减的速率, weight * event_decay_rate ^ (- days since event)
    • time_until_expirynow() 中的( 以秒为单位),将删除过期的建议。 例如,网站上的建议可以能有效,在电子邮件中你可能会建议有效日期。
    • current_datetime 定义了"模拟"当前时间,它不会使用在生成建议时在 current_datetime 之后执行的任何事件。

    例如使用GER的配置生成建议:

    ger.recommendations_for_person('movies', 'alice', {
     "actions": {
     "like":1,
     "watch":5 },
     "minimum_history_required":5,
     "similarity_search_size":50,
     "neighbourhood_size":20,
     "recommendations_per_neighbour":10,
     "filter_previous_actions": ["watch"],
     "event_decay_rate":1.05,
     "time_until_expiry":180})

    技术

    GER在 node.js ( 这是我使用咖啡脚本的原因) 之上的咖啡脚本中实现。 核心逻辑是在称为事件存储管理器( ESM )的抽象中实现的,这是持久性和许多计算。

    当前存在内存ESM和 PostgreSQL ESM。 还有一个 RethinkDB ESM由 awesome linuxlich 实现。

    事件存储管理器

    如果你询问

    为什么GER在X 上不可用?

    其中,X 是一些数据库或者存储( 比如。 使它在这些系统上可以用的方法是实现你自己的mtf。

    ESM的API是:

    初始化插件:

    • esm = new ESM(options) 其中,选项用于设置连接和。
    • initialize(namespace) 将为事件创建一个 namespace
    • destroy(namespace) 将在命名空间中销毁ESM的所有资源
    • exists(namespace) 将检查命名空间是否存在
    • list_namespaces 返回名称空间列表

    事件:

    • add_events
    • add_event
    • find_events
    • delete_events

    建议:

    • thing_neighbourhood
    • calculate_similarities_from_thing

    人推荐

    • person_neighbourhood
    • calculate_similarities_from_person
    • filter_things_by_previous_actions
    • recent_recommendations_by_people

    压缩:

    • pre_compact
    • compact_people
    • compact_things
    • post_compact

    附加阅读

    关于( 或者与) GER的文章:

    变更日志

    2015-07-09更新自述文件和固定 basicmem ESM Bug。

    2015-02-01 fixed固定 Bug 与set_namespace并添加了测试

    2015-01-30为名称空间添加了一些 helper 方法,并将缓存移除为真正无状态的。

    2014-12-30添加了查找和 delete 事件方法。

    2014-12-22添加了用于检查命名空间是否为initilaized的存在。 也改变了rethinkdb中的一些索引,并改变了初始化的一些语义

    2014-12-22 Added添加重新考虑数据库事件存储管理器。

    2014-12-9 - 为返回的建议添加更多解释,以便在外部解释它们

    2014-12-4 - 更易于理解的ESM API,并更新了自述文件

    2014-11-27 start开始返回最后一次操作的建议

    2014-11-25为类似人员提供了更好的选择推荐方式。

    2014-11-12为选择相关人员添加了更好的启发。 意味着需要选择更少相关的人员来查找好的值


    相关文章