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

给定一个用户需求(query),如果搜索系统展示的搜索结果是根据文档和query的相关性由高向低排序的,那么这个搜索引擎是最优的。在文档集合的基础上计算其相关性估计是其核心~

概率排序原理

以往的向量空间模型是将query和文档使用向量表示然后计算其内容相似性来进行相关性估计的,而概率检索模型是一种直接对用户需求进行相关性的建模方法,一个query进来,将所有的文档分为两类—-相关文档不相关文档,这样就转为了一个相关性的分类问题,赞!

对于某个文档$D$来说,$P(R|D)$表示该文档数据相关文档的概率,则$P(NR|D)$表示该文档属于不相关文档的概率,如果query属于相关文档的概率大于不相关文档$P(R|D)>P(RN|D)$,则认为这个文档是与用户查询相关相关的.

Read More

Shell强大灵活,但是今天在使用Shell处理按行读取文件时发现 读取到的行设定的tab分割符不见了

先看一下演示的待处理文件:

需要做的需求就是将里面的数据使用shell将第一列读取出来做一些其他处理(当然如果仅仅是完成读取首列这个功能,使用awk是最快的,这里只是演示)

Read More

与其说awk是一个强大的文本处理工具,我更加喜欢称之为轻量级的C语言版脚本,有了它,你就能非常自由,轻松的操作文本文件了。ps:比Excel更加方便哦,一句话:awk可以带你装b带你飞~

初体验:九九乘法表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#! /bin/awk -f

BEGIN{
print "lets begins"
}

{
for(i=1;i<=NR;i++)
printf("%sx%s=%s\t",NR,i,NR*i)
printf("\n")
}

END{
print "ends"
}

在先看awk程序之前,咱先来看一下由他实现的一个九九乘法表

yans-MacBook-Pro:Downloads yanyl$ seq 9 | awk -f chengfa.awk
lets begins
1x1=1
2x1=2    2x2=4
3x1=3    3x2=6    3x3=9
4x1=4    4x2=8    4x3=12    4x4=16
5x1=5    5x2=10    5x3=15    5x4=20    5x5=25
6x1=6    6x2=12    6x3=18    6x4=24    6x5=30    6x6=36
7x1=7    7x2=14    7x3=21    7x4=28    7x5=35    7x6=42    7x7=49
8x1=8    8x2=16    8x3=24    8x4=32    8x5=40    8x6=48    8x7=56    8x8=64
9x1=9    9x2=18    9x3=27    9x4=36    9x5=45    9x6=54    9x7=63    9x8=72    9x9=81
ends
yans-MacBook-Pro:Downloads yanyl$

Read More

Hadoop Streaming是一个便于变成Map Reduce程序的工具包,这个工具包可以支持各种可执行/脚本语言来创建Mapper和Reducer,利用Hadoop的优势进行大数据的处理,这些语言仅仅只需要支持*unix的表示输出输入即可(python,c,c++,perl,akw etc.)

Streaming实践

先直接来看一个由python写的Streaming程序,还有那个经典的word count,我们的数据集是一篇英语作文,
看来看他的mapper文件

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python
#-*- coding=utf8 -*-

import sys,re

re_english = re.compile(u'[^a-zA-Z0-9\-]+')

for line in sys.stdin: #这里你可以看做是map类中的line输入
words = re_english.sub(' ',line.strip()) #这里只提取英文数字
for word in words.split():
print '%s\t%s' % (word, 1) #这儿就是标准的输出,用tab隔开 默认第一个值为key

Read More

Shell脚本是非常强的大一个脚本语言,但是不用会手生,所以在此记录Shell脚本的相应关键点,也做查字典用^_^

变量

变量定义

先来简单的看一下变量定义的规则

  1. Shell中,使用变量之前不需要事先声明,只是通过使用它们来创建它们;
  2. 在默认情况下,所有变量都被看做是字符串,并以字符串来存储;
  3. Shell变量是区分大小写的;
  4. 在赋值变量的时候等号两端不能有空格-_-

Read More