欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-02 10:40:00
...

王子悦

改了一些地方不应该出现未审核内容的bug 给邵长旭推荐了normalized google distance方法来计算两个词之间的语义相关性


邵长旭

实现了王子悦推荐的算法

今天主要完成了关键词相似度的计算,之前直接利用的Word2vec中的词相似度函数,他是基于词本身的,而不是语义相关的,比如深度学习和数据两个词,他们之间的相似度就基本为0,因为但从词的结构来看,他们毫无关系,但是却是语义相关的,所以我改用了基于百度的词间距离,仿照基于Google的词间距离完成,利用如下公式计算词间距离:

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

其中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对象:

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

接下来就是实现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.重新修改了顶端栏通知的显示
【资源聚合平台】6/8-9日工作日志
3.为课程模型添加了新的字段:introduction:text 储存课程简介的html。
4.修改了course界面的显示:
【资源聚合平台】6/8-9日工作日志

5.修复了教师可以随意选课的bug
6.写了个js的小方法,用于控制最小高度如下:
【资源聚合平台】6/8-9日工作日志
加入min-height-control类,data-min-height属性指定为最小高度,这样控件内内容高度大于300px时不做处理,小于300px强制变为300px

7.修复了偶尔更新用户通知的时候出现数据库锁死的bug,但挺慢的。
8.ajax的时候尽量在url里加上 no_check_notification=true 这个条件,会跳过对notification的检查。
js这么改
【资源聚合平台】6/8-9日工作日志
rails自带的ajax这么改
【资源聚合平台】6/8-9日工作日志
可以加快1倍左右的速度吧
主页的我已经改了,其他地方你们看着改一下。

9.数据基本都录入完成了,你们可以删库做一下reset了。然后根据显示数据再看看界面,好多地方都变形了,我能看见的我已经改了,但是还有很多,你们检查一遍


张晓敏

试图构造一个分数系统算法用来在各种场合排序
【资源聚合平台】6/8-9日工作日志

相关标签: 软件工程