【资源聚合平台】6/8-9日工作日志

王子悦

改了一些地方不应该出现未审核内容的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了。然后根据显示数据再看看界面,好多地方都变形了,我能看见的我已经改了,但是还有很多,你们检查一遍


张晓敏

试图构造一个分数系统算法用来在各种场合排序
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值