McRank是学习排序(Learning to Rank)的单文档排序分支(Pointwise)中较为经典的一种,本文是读原Paper[1]之后自己的一个理解.

基本介绍

McRank的全称是Multiple Classification Rank,可以理解为将学习排序转为机器学习中的一个多分类问题.
McRankDCG指标进行优化,并且可以证明DCG的误差可以被分类误差给bounded住.

折损累积增益

DCG(Discounted Cumulative Gain)是在信息检索领域评估一个rank好坏的常用指标。(在实际使用中一般会进行归一化,称为NDCG,可以看这里).

假设在指定的query下通过某个排序算法对$n$个文档进行排序,则可以得到
$$DCG=\sum_{i=1}^{n}c_{[\pi_i]}(2^{y_i}-1)$$

Read More

这应该严格意义上不算Hexo的bug,但是在写Mathjax的时候就会踩中-_-

说起Markdown写文章时,加粗的第一反应是**,斜体的第一反应是*,因为各种Markdown格式规范的文章里面都是这么教的,但是你不知道的是__可以支持粗体,_可以支持斜体,一般而言这是没什么问题,但是当在写LatexHexo里使用Mathjax实现)数据公式时,_表示下标,并且使用频率很高,当一行里面有多个_出现时,Hexo进行解析导致所期待的公式失效。

自从用Hexo写数学公式的时候,就发现一点小问题,公式复杂了,在Hexo里面就不work,起初以为是Mathjax的支持不完善的缘故,后来发现用了Mathjax的其他博客里面都可以写复杂的公式,而今天又遇到了这个问题:
我的公式文本是:
对于每个$X_i$,$P(X_i|Y=y_k)$服从高斯分布$N(\mu_{ik},\sigma_i)$
结果生成页面查看之后却发现:

Read More

为啥要做Proximity计算

先来看下信息检索/搜索引擎 的一般架构流程:

  1. Doc进行分词,这些分词也叫做Term,然后离线做各种计算
  2. 将这些Term灌入倒排索引中
  3. 用户查询
  4. 根据倒排召回命中Term的文档
  5. 将文档根据各个Term算分排序

其实可以发现这里查的Term 都是bag-of-words的形式,并且第五步的算法也一般是在线的,所以基本不会做全文扫描之类的事情,那么这样的话问题就来了:

Read More

BM25在长文档下会失效,文本是记录SIGIR上的一个Paper的解决方案~

当BM25遇到长文档

文档相关性模型-BM25的拟合公式如下:

$\sum_{i\in Q} log \frac {(r_i+0.5)((N-R)-(n_i-r_i)+0.5)}{(n_i-r_i+0.5)(R-r_i+0.5)} \cdot \frac{(k_1+1)f_i}{K+f_i} \cdot \frac{(k_2+1)qf_i}{k_2+qf_i}$

其中第一部分表示BIM的值,第二部分表示在文档中的权重,第三部分表示在查询词中的权重,(具体符号解释参考之前的BM25介绍)现将第二部分单独拿出来:

$f(q,D)=\frac{(k_1+1) \times TF}{k_1 \times ((1-b)+b \cdot \frac{dl}{avdl} )+TF}=\frac{(k_1+1) \times c’(q,D)}{k_1+c’(q,D)}$

其中:

Read More

Learning to rank(简写 LTR、L2R) 也叫排序学习,指的是机器学习中任何用于排序的技术。

为什么要用LTR

传统的检索模型靠人工拟合排序公式,并通过不断的实验确定最佳的参数组合,以此来形成相关性打分。这种方式非常简单高效,应该范围也很广,比如简单的博客排序、论坛的QA排序等.但是也同时存在较大的问题:

  1. 手动调参工作量太大
  2. 可能会过拟合
  3. 如果模型参数很多,手动调参的可用性就很低了~

LTR与此思路不同,最合理的排序公式由机器学习算法来确定,而人则需要给机器学习提供训练数据,他的优势有:

  1. 可以自动调节参数
  2. 可以融合多方面观点的(evidences)的数据
  3. 避免过拟合(通过正则项)

Read More

题目

求一个二进制数字中1出现的个数

这道题目面试非常常见,但是工作中也很实用,以32位int整形为例,下面列举一下一些经典的做法(主要是做记录用^_^)

遍历法

这个是最简单的方法,向右移位,判断最低位是否为1进行计数即可!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 普通遍历法
* @param n
* @return
*/

public static int traverseCount(int n)
{

int count = 0;
while(n>0)
{
n = n>>1;
count++;
}

return count;
}

Read More

这里与其说安装,还是不如直接拷贝相应文件到hexo目录

最近尝试在写blog的时候用Latex来写数学公式,写起来还是极其方便灵活滴,但是,但是其速度慢如爬蜗牛,一般修改一下,在刷新一下要4~5s才能将公式渲染出来,其书写效率也太低了,总之我不能忍,所以准备将其MathJax放在本地.

  1. 一方面是希望加快公式的渲染速度
  2. 另一方面也是希望能支持我在断网的情况下也能正常使用Mathjax

Read More