2016-08-19 15 views
2

我正在使用Text :: Document計算兩個文檔之間的餘弦相似度。當我嘗試打印包含餘弦相似度得分($ sim)的變量時,我收到一條錯誤消息:「在連接(。)或字符串中使用單位值$ sim ...」。據我所知,我立即在打印命令上面初始化這個變量。無可否認,這是我第一次進入Text :: Document模塊,這裏我的對象構造可能是錯誤的/醜陋的/可能存在問題的。任何想法變量初始化有什麼問題?用於測量Text :: Document中CosineSimilarity的變量未初始化

use strict ; 
use warnings ; 
use autodie ; 
use Text::Document ; 

### BEGIN BY READING IN EACH FILE ONE BY ONE. ### 
################## LOOP BEGIN ################## 
# Process every file with a `txt` file type 

my $parent = "D:/Cleaned 10Ks" ; 
my ($par_dir, $sub_dir); 
opendir($par_dir, $parent); 

while (my $sub_folders = readdir($par_dir)) { 
next if ($sub_folders =~ /^..?$/); # skip . and .. 
my $path = $parent . '/' . $sub_folders; 
next unless (-d $path); # skip anything that isn't a directory 
chdir($path) or die "Cant chdir to $path $!"; 

for my $filename (grep -f, glob('*')) { 

open my ($fh), '<', $filename; 
my $data1 = do {local $/; <$fh> } ; 
my $data2 = Text::Document->new(file=>'$data1') ; 
my $data3 = $data2->WriteToString() ; 
my $data4 = Text::Document::NewFromString($data3) ; 

my ($comp_id, $year, $rest) = split '-', $filename, 3; 
my $prev_year = ($year ne '00') ? $year - 1 : 99; 
my $prev_year_base = join '-', $comp_id, $year ; 
my ($prev_year_file) = glob "$prev_year_base*" ; 

open my ($fh_prior), '<', $prev_year_file ; 
my $data1_prior = do {local $/; <$fh_prior> } ; 
my $data2_prior = Text::Document->new(file=>'$data1_prior') ; 
my $data3_prior = $data2->WriteToString() ; 
my $data4_prior = Text::Document::NewFromString($data3_prior) ; 
my $sim = $data4->CosineSimilarity($data4_prior) ; 

print "The cosine similarity score is $sim\n" ; 
} 
} 

回答

2

你有幾個問題..

my $data2 = Text::Document->new(file=>'$data1') ; 

在這裏,你似乎想象$data2將與$data1內容被初始化。

事實上file關鍵字什麼也不做在這裏,而行相當於

my $data2 = Text::Document->new() ; 

您已成功初始化一個Text::Document對象,但沒有數據。

您對先前的對象做同樣的事情,因此您最終比較兩個沒有比較術語的對象。 $sim是空的。

修復的方法是一些內容添加到您的新對象:

my $data2 = Text::Document->new() ; 
$data2->AddContent($data1); 

...和同爲之前的對象。

此外,您可以刪除這些行:

my $data3 = $data2->WriteToString() ; 
my $data4 = Text::Document::NewFromString($data3) ; 

他們是多餘的。你只是重新創建相同的(空的)對象。

+0

您的回答有助於闡明此模塊的語法。謝謝! – Rick

2

以從源頭上偷看,我看到CosineSimilarity有這塊金塊:

if(($nD==0) || ($nE==0)){ 
      return undef; 
    } else { 
      return $dotProduct/$nD/$nE; 
    } 

它將返回民主基金,而不是除以零錯誤吹起來。 (雖然處理錯誤很好,但有時候錯誤處理使得它不那麼明顯,發生了錯誤,我認爲你是這種情況之一 - 一旦你知道它,檢查undef更明顯,但如果你有一個零異常鴻溝,你可能會在不同的事情看。)

反正$nD$nE都是通過呼籲兩國$d$self)和$eEuclideanNorm方法測定。您應該嘗試將這些打印出來作爲下一個調試步驟,我會猜測您的$data4_prior會出現0,但它確實可能是。如果沒有您的實際數據,我無法找出答案,所以希望這可以爲您進一步調試提供一個良好的起點。