perl - 用于测量 Text::Document 中 CosineSimilarity 的变量未初始化

标签 perl initialization cosine-similarity

我正在使用 Text::Document 来计算两个文档之间的余弦相似度。当我尝试打印保存所得余弦相似度得分 ($sim) 的变量时,我收到一条错误消息:“在连接 (.) 或字符串中使用统一值 $sim...”。据我所知,我在打印命令上方立即初始化了这个变量。诚然,这是我第一次涉足 Text::Document 模块,我在这里的对象构造可能是错误/丑陋/潜在问题的。你知道变量初始化有什么问题吗?

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" ;
}
}

最佳答案

您有几个问题..

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) ;

它们是多余的。您只是重新创建相同的(空)对象。

关于perl - 用于测量 Text::Document 中 CosineSimilarity 的变量未初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39047635/

相关文章:

python - perl 在文本文件中就地排序行

python - Python:两个大型numpy数组之间的余弦相似度

perl - Data::Dumper() 的副作用是什么?

perl - 从函数返回散列的最佳 Perl 实践是什么?

swift - 对于 Swift 语言,初始化结构体和初始化类有什么区别? (我对编程还很陌生)

c++ - 在模板 C++ 类中初始化 const 的 const 数组

c++ - 我有很多关于 c++ 的问题,这让我很困惑

python - 使用具有余弦相似度的 K 均值 - Python

python - 计算pyspark中数据帧所有行之间的余弦相似度

perl - 更改 "for ( keys %hash ) {}"循环中的键