計(jì)算tf/idf
超過(guò)10年行業(yè)經(jīng)驗(yàn),技術(shù)領(lǐng)先,服務(wù)至上的經(jīng)營(yíng)模式,全靠網(wǎng)絡(luò)和口碑獲得客戶,為自己降低成本,也就是為客戶降低成本。到目前業(yè)務(wù)范圍包括了:網(wǎng)站制作、成都網(wǎng)站制作,成都網(wǎng)站推廣,成都網(wǎng)站優(yōu)化,整體網(wǎng)絡(luò)托管,微信小程序定制開發(fā),微信開發(fā),重慶APP軟件開發(fā),同時(shí)也可以讓客戶的網(wǎng)站和網(wǎng)絡(luò)營(yíng)銷和我們一樣獲得訂單和生意!
在使用fileStr獲取新聞的內(nèi)容和長(zhǎng)度后,我們就可以計(jì)算他們的tf和idf:
//計(jì)算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'])]; //給每個(gè)詞賦予df
$seg[$i][$j]['idf']=log(count($file_dir)/$seg[$i][$j]['df']); //idf
}
}
return $seg;
}該方法傳遞的參數(shù)$seg就是前面提到若的使用segment分詞方法返回的結(jié)果。這里使用的是它計(jì)算出來(lái)的['word']和['times']。
第一個(gè)for雙重循環(huán):第一個(gè)for循環(huán)得到每一篇文檔所有詞的信息,第二個(gè)for循環(huán)取出這篇文檔每個(gè)詞的信息,比如$seg[$i][$j]['times']是一個(gè)詞出現(xiàn)的次數(shù),再除以這篇文檔的長(zhǎng)度$str[$i]['len']就可以得到詞頻。
第二個(gè)for雙重循環(huán):大概意思就是得到該文檔集的文檔頻率df后,使用公式idf=log(N/df),N表示文檔集總數(shù),df就是所計(jì)算詞的文檔頻率,最后得出idf(逆文檔頻率)。
新創(chuàng)建一個(gè)用來(lái)測(cè)試的php文件test.php,代碼如下
<?php
require_once 'init.inc.php';
$str=Tool::fileStr();
$top=Tool::segment($str);
$seg=Tool::tf_df($top);
print_r($seg);
?>在瀏覽器中運(yùn)行(這個(gè)過(guò)程大概花費(fèi)20s),查看源代碼:


計(jì)算特征向量
萬(wàn)事俱備,只欠東風(fēng)。到這里,我們已經(jīng)得到了所有詞項(xiàng)的tf和idf,他們的權(quán)重=tf*idf.在這里我們又會(huì)使用到之前已經(jīng)創(chuàng)建好的詞表(保存在dic.txt),詞表中的每一個(gè)詞代表空間中的一個(gè)維度,dic.txt中有1000多個(gè)詞,因而空間中就有1000多維。我們把每篇文檔的詞項(xiàng)都映射到這1000多個(gè)維度里,每個(gè)維度的值表示該詞項(xiàng)的權(quán)重,若該篇文檔不存在詞典中出現(xiàn)的詞,則對(duì)應(yīng)的維度值設(shè)為0.(這里利用的是向量空間模型的知識(shí))。
計(jì)算特征向量的代碼封裝在方法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);
}
}該方法把對(duì)應(yīng)文檔的特征向量計(jì)算出來(lái)后,把他們保存在目錄名為vsm的目錄中,文件名和它們的新聞文檔文件名相同。修改test.php:
<?php
require_once 'init.inc.php';
$str=Tool::fileStr(); //取出文檔集內(nèi)容
$top=Tool::segment($str); //分詞
Tool::dic($top); //建立詞典
$seg=Tool::tf_df($top); //計(jì)算tf/idf
Tool::vsm($seg); //計(jì)算特征向量
?>即可運(yùn)行,在系統(tǒng)目錄的vsm下可以看到多出了10個(gè)txt文件,里邊的內(nèi)容保存的分別是對(duì)應(yīng)文檔的特征向量。
文章標(biāo)題:盲反饋檢索系統(tǒng)實(shí)驗(yàn)記錄三
文章源于:http://www.chinadenli.net/article44/gccgee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣、云服務(wù)器、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站排名、小程序開發(fā)、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)