温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

盲反馈检索系统实验记录三

发布时间:2020-07-27 07:47:02 来源:网络 阅读:596 作者:jokance 栏目:web开发

计算tf/idf

在使用fileStr获取新闻的内容和长度后,我们就可以计算他们的tf和idf:


//计算tf\idf
static public function tf_df($seg){
    $str=self::fileStr();
    $file_dir=self::fileDir(TEXT_PATH);
    $df=array();
    for($i=0;$i<count($seg);$i++){
        for($j=0;$j<count($seg[$i]);$j++){ 
        $seg[$i][$j]['tf']=$seg[$i][$j]['times']/$str[$i]['len'];   //词频tf
        array_push($df,$seg[$i][$j]['word']);   //所有词合并,df
        }
    }
    $df=array_count_values($df);    //文档频率df
    for($i=0;$i<count($seg);$i++){
        for($j=0;$j<count($seg[$i]);$j++){
            $seg[$i][$j]['df']=$df[($seg[$i][$j]['word'])]; //给每个词赋予df
            $seg[$i][$j]['idf']=log(count($file_dir)/$seg[$i][$j]['df']);   //idf
        }
    } 
    return $seg;
}



该方法传递的参数$seg就是前面提到若的使用segment分词方法返回的结果。这里使用的是它计算出来的['word']和['times']。

第一个for双重循环:第一个for循环得到每一篇文档所有词的信息,第二个for循环取出这篇文档每个词的信息,比如$seg[$i][$j]['times']是一个词出现的次数,再除以这篇文档的长度$str[$i]['len']就可以得到词频。

第二个for双重循环:大概意思就是得到该文档集的文档频率df后,使用公式idf=log(N/df),N表示文档集总数,df就是所计算词的文档频率,最后得出idf(逆文档频率)。

新创建一个用来测试的php文件test.php,代码如下

<?php
    require_once 'init.inc.php';
    $str=Tool::fileStr();
    $top=Tool::segment($str);
    $seg=Tool::tf_df($top);
    print_r($seg);
?>


在浏览器中运行(这个过程大概花费20s),查看源代码:

盲反馈检索系统实验记录三

盲反馈检索系统实验记录三


计算特征向量

万事俱备,只欠东风。到这里,我们已经得到了所有词项的tf和idf,他们的权重=tf*idf.在这里我们又会使用到之前已经创建好的词表(保存在dic.txt),词表中的每一个词代表空间中的一个维度,dic.txt中有1000多个词,因而空间中就有1000多维。我们把每篇文档的词项都映射到这1000多个维度里,每个维度的值表示该词项的权重,若该篇文档不存在词典中出现的词,则对应的维度值设为0.(这里利用的是向量空间模型的知识)。

计算特征向量的代码封装在方法vsm中:


//特征向量,并写入文件(tf/idf以及存在seg中)
static public function vsm($seg){
    $file_dir=self::fileDir(TEXT_PATH);
    $dic_str=file_get_contents('dic.txt');
    $dic_arr=explode(',',$dic_str);
                                                                                                       
    $vsm_arr=array();   //向量空间
    for($i=0;$i<count($dic_arr);$i++){
        $vsm_arr[$dic_arr[$i]]=0;   //初始化为0
    }
                                                                                                       
    for($i=0;$i<count($seg);$i++){
        for($j=0;$j<count($seg[$i]);$j++){
            if(in_array($seg[$i][$j]['word'],$dic_arr)){
                $vsm_arr[($seg[$i][$j]['word'])]=$seg[$i][$j]['tf']*$seg[$i][$j]['idf'];
            }
        }
        //将vsm写入文件
        $vsm_str=implode(',',$vsm_arr);
        $fp=fopen(ROOT_PATH.'/vsm/'.$file_dir[$i],'w');
        fwrite($fp,$vsm_str);
        fclose($fp);
    }
}


该方法把对应文档的特征向量计算出来后,把他们保存在目录名为vsm的目录中,文件名和它们的新闻文档文件名相同。修改test.php:

<?php
    require_once 'init.inc.php';
    $str=Tool::fileStr();   //取出文档集内容
    $top=Tool::segment($str);   //分词
    Tool::dic($top);    //建立词典
    $seg=Tool::tf_df($top); //计算tf/idf
    Tool::vsm($seg);    //计算特征向量
?>

即可运行,在系统目录的vsm下可以看到多出了10个txt文件,里边的内容保存的分别是对应文档的特征向量。


附件:http://down.51cto.com/data/2364246
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI