V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nowcoder
V2EX  ›  程序员

如何根据用户数据实现个性化推荐的智能出卷(开放性题,欢迎讨论)

  •  1
     
  •   nowcoder · 2015-01-08 09:47:30 +08:00 · 3423 次点击
    这是一个创建于 3606 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我们做了一个专门面向IT互联网行业程序员的求职笔试面试备考的题库网站
    牛客网 http://www.nowcoder.com?from=v2ex
    里面积累了谷歌、腾讯、百度等几十家互联网公司的笔试面试题目。但网站当前有部分题目还没有楼主觉得认可的最佳答案和解释,为了更好的服务程序猿们,我们做了一个活动,悬赏大牛解答,每道题目根据难度对应一定的现金奖励,最高一道题目奖励100元,还有iPhone6、移动硬盘、小米手环等众多好礼相送。

    从今天开始到1月29日,我们会在论坛持续更新本贴,每天放出1-3道题目,欢迎大家跟帖解答,最先正确解答出来的朋友将会获得话费充值、笔记本等礼物。获奖的朋友名单会在第二天公布。

    今日题目

    牛客网数据库里有用户在我们网站上的做题记录,每个做题记录包括
    1. 题目ID 2.题目知识点列表 3.题目难度 4.做题得分 5.做题时间
    
    我们希望根据用户的做题记录给用户智能出题,智能出题旨在提高用户刷题效率,需要考虑:
    1. 难度适中  精确符合用户的知识水平
    2. 查漏补缺  精准化刷题
    3. 适当扩延  更加全面了解用户知识体系
    这个题目相当开放,我们已经实现了第一个版本的算法,下个迭代会更新上线,不知道大家这个需求有什么建设性的想法,欢迎讨论。
    

    更多有奖答题: http://www.nowcoder.com/activity/challenge?from=v2ex

    欢迎大家关注我们,活动结束后我们会把面试题整理成PDF分发给参与的用户
    微博 http://www.weibo.com/nowcoder
    微信 www_nowcoder_com
    技术QQ群 157594705
    邮件 [email protected]
    如果你手里有更多的笔试面试题,也欢迎联系我们,重金求购哦~

    昨日答题话费由 @lijinma 斩获。恭喜!
    附昨日帖子地址 http://www.v2ex.com/t/159896

    附牛客网的敏感词过滤,我们采用了DFA状态机实现,没有语义分析,简单够用

    class DFATreeNode {
        /**
         * true 关键词的终结 ; false 继续
         */
        private boolean end = false;
    
        /**
         * key下一个字符,value是对应的节点
         */
        private Map<Character, DFATreeNode> subNodes = new HashMap<Character, DFATreeNode>();
    
        /**
         * 向指定位置添加节点树
         * 
         * @param key
         * @param node
         */
        public void addSubNode(Character key, DFATreeNode node) {
          subNodes.put(key, node);
        }
    
        /**
         * 获取下个节点
         * 
         * @param key
         * @return
         */
        public DFATreeNode getSubNode(Character key) {
          return subNodes.get(key);
        }
    
        public boolean isKeywordEnd() {
          return end;
        }
    
        public void setKeywordEnd(boolean end) {
          this.end = end;
        }
    
        public int getSubNodeCount() {
          return subNodes.size();
        }
      }
    
      /**
       * 过滤敏感词
       * 
       * @param text
       * @return
       */
      public String filter(String text) {
        if (StringUtils.isBlank(text)) {
          return text;
        }
        String replacement = DEFAULT_REPLACEMENT;
        StringBuilder result = new StringBuilder();
    
        DFATreeNode tempNode = rootNode;
        int begin = 0; // 回滚数
        int position = 0; // 当前比较的位置
    
        while (position < text.length()) {
          char c = text.charAt(position);
          // 空格直接跳过
          if (isSymbol(c)) {
            ++position;
            continue;
          }
    
          tempNode = tempNode.getSubNode(c);
    
          // 当前位置的匹配结束
          if (tempNode == null) {
            // 以begin开始的字符串不存在敏感词
            result.append(text.charAt(begin));
            // 跳到下一个字符开始测试
            position = begin + 1;
            begin = position;
            // 回到树初始节点
            tempNode = rootNode;
          } else if (tempNode.isKeywordEnd()) {
            // 发现敏感词, 从begin到position的位置用replacement替换掉
            result.append(replacement);
            position = position + 1;
            begin = position;
            tempNode = rootNode;
          } else {
            ++position;
          }
        }
    
        result.append(text.substring(begin));
    
        return result.toString();
      }
    
    11 条回复    2015-01-09 08:57:18 +08:00
    nowcoder
        1
    nowcoder  
    OP
       2015-01-08 10:12:51 +08:00
    牛客网现在采用的是遗传算法来智能出卷,欢迎大家讨论。
    dreampuf
        2
    dreampuf  
       2015-01-08 10:42:00 +08:00
    @nowcoder 一定要名字高大上吗?用遗传你们的评估函数怎么写呢?题目的特征怎么建立呢?最优解怎么定义的呢?

    好好的随机抽题根据复杂度分值、题目类型综合出一份试卷不好吗
    nowcoder
        3
    nowcoder  
    OP
       2015-01-08 10:49:19 +08:00   ❤️ 1
    @dreampuf 呜呜,求别喷,我们一群做工程的小伙伴写机器学习,苦逼死了。
    我们的评估函数定义的比较简单 f = (试卷难-需求难度)*w1 + 错题覆盖率*w2 + 知识点覆盖率*w3 + ...
    然后w1,w2,w3等系数根据实际情况自己调出来。 特征就难度,分数等(手工标注+用户数据动态调整)。
    不求最优解,只求收敛到目标值就可以了,一般迭代20-40轮可以获得一个符合要求的试卷。

    求指点,求简单做法。
    shoumu
        4
    shoumu  
       2015-01-08 13:35:41 +08:00
    用户的个性化数据包含哪些?
    imn1
        5
    imn1  
       2015-01-08 13:37:00 +08:00
    置顶啊,真好

    也准备写个问卷系统,不过没你们那么高大上还用了C,不会
    而且侧重方向不同,倾向于调查,所以没题库,进来纯学习,嘿嘿
    nowcoder
        6
    nowcoder  
    OP
       2015-01-08 13:52:27 +08:00
    @shoumu 用户有的数据是
    1. 做题记录
    2. 希望从事的职业

    公共数据
    每个题目关联的知识点,
    题目难度,题目的准确率,题目题型
    每个职业关联的知识点
    xunyu
        7
    xunyu  
       2015-01-08 14:00:40 +08:00
    遗传算法用在哪里?我看到只是线性回归而已?
    nowcoder
        8
    nowcoder  
    OP
       2015-01-08 14:16:23 +08:00
    @xunyu 随机出题构造试卷。 试卷评估和目标值做对比,进行交叉遗传,迭代20轮的结果就是目标试卷。
    这个迭代过程用了遗传算法。
    xunyu
        9
    xunyu  
       2015-01-08 14:23:35 +08:00
    遗传算法这个不是必须的,关键是你的特征提取和分类(聚类)效果,默认评估模型应该符合高斯分布吧,线性回归这个有坑,lr都好点
    dreampuf
        10
    dreampuf  
       2015-01-09 00:01:55 +08:00
    @nowcoder 你们的想法已经超过我了,想试试效果,已经发布了吗?
    nowcoder
        11
    nowcoder  
    OP
       2015-01-09 08:57:18 +08:00
    @dreampuf 预计两周后发布,你可以先试用我们的产品 http://www.nowcoder.com 多谢支持哈。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1031 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:38 · PVG 03:38 · LAX 11:38 · JFK 14:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.