王子悦
改了一些地方不应该出现未审核内容的bug 给邵长旭推荐了normalized google distance方法来计算两个词之间的语义相关性
邵长旭
实现了王子悦推荐的算法
今天主要完成了关键词相似度的计算,之前直接利用的Word2vec中的词相似度函数,他是基于词本身的,而不是语义相关的,比如深度学习和数据两个词,他们之间的相似度就基本为0,因为但从词的结构来看,他们毫无关系,但是却是语义相关的,所以我改用了基于百度的词间距离,仿照基于Google的词间距离完成,利用如下公式计算词间距离:
其中f(x)是词x在百度搜索中出现的总次数,f(x,y)是x和y出现的总次数,N是百度搜索的总词条数,经过实验我们发现百度搜索的总词条是100000000。
其实对于这个公式还有两点需要注意,baidu不像google,显示的总词条是有限的,而我们国内要想访问google,必须翻墙,而基于网站设计的最小化原则,应考虑最低需求,因此我们只能采用百度来完成,那么当数据达到上限时该如何处理呢?
如果有一个f(x)达到了上限,而f(y)和f(x,y)并每达到上限,这个是没有影响的,因为这个公式仍然工作,但当fx和fy都到达上限的时候,分母就会为0,这时公式失效,我们考虑这种特殊情况,当两个词都达到上限时,说明这两个词都是常见值,他们更加偏向于无实义的助词,并不应该成为关键词,应该是上一步提取关键词时产生的误差,所以我们直接返回一个负值,代表这组词无效,而当f(x,y) 完全与max(fx,fy)相等时,即分子为0,这种情况一般也只会是都等于N,这时我们同样认为这个是极端的,因为fxy是N了,说明x和y总是一起出现,关联度极高。
下面是实现的代码:
public long search(String keyword1,String keyword2){
//拼接关键词,形成url
String url = "http://www.baidu.com/s?wd="+keyword1+"%20"+keyword2;
// String url = "http://www.google.com.hk/search?q="+keyword1+"+"+keyword2;
long total = 0;
try {
//解析url,发送get请求
Document document = Jsoup.connect(url).get();
//获取搜索数
total = getBaiduSearchResultCount(document);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return total;
}
private long getBaiduSearchResultCount(Document document) {
// TODO Auto-generated method stub
//观察百度搜索数的显示位置,div class name
String cssQuery = "html body div div div div.nums";
//选择对象
Element totalElement = document.select(cssQuery).first();
//获取文本
String totalText = totalElement.text();
//利用正则表达只选取数字
String regEx="[^0-9]";
Pattern pattern = Pattern.compile(regEx);
Matcher matcher = pattern.matcher(totalText);
totalText = matcher.replaceAll("");
long total = Long.parseLong(totalText);
return total;
}
这里需要观察百度中显示搜索数的document对象:
接下来就是实现ngd算法公式:
public double getRelative(String keyword1,String keyword2){
long fx = search(keyword1);
long fy = search(keyword2);
long fxy = search(keyword1,keyword2);
// if(fx == N||fy == N){
// return -1;
// }
double fenzi = (double) (Math.max(Math.log(fx), Math.log(fy))-Math.log(fxy));
double fenmu = (double) (Math.log(N)-Math.min(Math.log(fx), Math.log(fy)));
/**
* fenzi = 0 => fx=fxy=N => "关联大"
* fenmu = 0 => fx = fy = N => "都是频繁词"
*
*/
double ngd = 0;
if(fenmu == 0){
ngd = -1;//有关联
}
else if(fenzi == 0){
ngd = 1;
}
else{
ngd = fenzi/fenmu;
ngd = Math.abs(ngd);
}
return ngd;
}
还有一点需要注意,这里返回的值并不是关联程度,首先它是与关联程度成反相关的,即值越接近于0,关联度越大,而且真正算法中的N是baidu的总页面数,我们只是利用baidu的搜索上限去近似,所以算出来的数并不是我们理解的关联程度,但是这是一个保序的函数,即当两个词关联度越大时,他们之间的ngd值就越接近于0,所以当我们对我们的系统进行大量实验后,我们发现当ngd值小于0.35时,表明两个词直接具有可信任程度的关联
梁惠欣
1.发现了课程controller里面有几个bug和几个性能上不太好的地方,已改正
2.重新修改了顶端栏通知的显示
3.为课程模型添加了新的字段:introduction:text 储存课程简介的html。
4.修改了course界面的显示:
5.修复了教师可以随意选课的bug
6.写了个js的小方法,用于控制最小高度如下:
加入min-height-control类,data-min-height属性指定为最小高度,这样控件内内容高度大于300px时不做处理,小于300px强制变为300px
7.修复了偶尔更新用户通知的时候出现数据库锁死的bug,但挺慢的。
8.ajax的时候尽量在url里加上 no_check_notification=true 这个条件,会跳过对notification的检查。
js这么改
rails自带的ajax这么改
可以加快1倍左右的速度吧
主页的我已经改了,其他地方你们看着改一下。
9.数据基本都录入完成了,你们可以删库做一下reset了。然后根据显示数据再看看界面,好多地方都变形了,我能看见的我已经改了,但是还有很多,你们检查一遍
张晓敏
试图构造一个分数系统算法用来在各种场合排序