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

2015-01-08 09:47:30 +08:00
 nowcoder

我们做了一个专门面向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
邮件 admin@nowcoder.com
如果你手里有更多的笔试面试题,也欢迎联系我们,重金求购哦~

昨日答题话费由 @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();
  }
3423 次点击
所在节点    程序员
11 条回复
nowcoder
2015-01-08 10:12:51 +08:00
牛客网现在采用的是遗传算法来智能出卷,欢迎大家讨论。
dreampuf
2015-01-08 10:42:00 +08:00
@nowcoder 一定要名字高大上吗?用遗传你们的评估函数怎么写呢?题目的特征怎么建立呢?最优解怎么定义的呢?

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

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

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

公共数据
每个题目关联的知识点,
题目难度,题目的准确率,题目题型
每个职业关联的知识点
xunyu
2015-01-08 14:00:40 +08:00
遗传算法用在哪里?我看到只是线性回归而已?
nowcoder
2015-01-08 14:16:23 +08:00
@xunyu 随机出题构造试卷。 试卷评估和目标值做对比,进行交叉遗传,迭代20轮的结果就是目标试卷。
这个迭代过程用了遗传算法。
xunyu
2015-01-08 14:23:35 +08:00
遗传算法这个不是必须的,关键是你的特征提取和分类(聚类)效果,默认评估模型应该符合高斯分布吧,线性回归这个有坑,lr都好点
dreampuf
2015-01-09 00:01:55 +08:00
@nowcoder 你们的想法已经超过我了,想试试效果,已经发布了吗?
nowcoder
2015-01-09 08:57:18 +08:00
@dreampuf 预计两周后发布,你可以先试用我们的产品 http://www.nowcoder.com 多谢支持哈。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/160216

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX