将所有文档与Perl的Text :: DocumentCollection中的其他文档进行比较

时间:2011-12-08 23:02:12

标签: perl

鉴于Perl中Text::DocumentCollection中的文档集合,我想使用cosine similarity计算集合中任意两个文档之间的Text::Document

我认为这可以使用EnumerateV和回调来完成,但我无法弄清楚具体细节。 (This SO question很有帮助,但我仍然卡住了。)

具体而言,假设集合存储在test.db中,如下所示:

#!/usr/bin/perl -w
use Text::DocumentCollection;
use Text::Document;

$c = Text::DocumentCollection->new( file => 'test.db' );

my $text = 'Stack Overflow is a programming | Q & A site that’s free. Free to ask | questions, free to answer questions|, free to read, free to index';

my @strings = split /\|/, $text;
my $i=0;

foreach (@strings) {
    my $doc = Text::Document->new();
    $doc->AddContent($_);
    $c->Add(++$i,$doc);
}

现在假设我需要读入test.db并计算所有文档组合的余弦相似度。 (除了通过存储的数据库文件,我无权访问上面代码中创建的文档。)

我认为答案是构建一个使用EnumerateV中的回调访问的子程序,我猜这个子程序也调用了EnumerateV但是我无法弄清楚它进行。

1 个答案:

答案 0 :(得分:2)

您可能希望从以下内容开始:

$c->EnumerateV(sub {
    my ($c, $k1, $d1) = @_;
    $c->EnumerateV(sub {
        my ($c, $k2, $d2) = @_;
    return if exists $dist{$k1.$k2};
    $dist{$k1.$k2} = $dist{$k2.$k1}= cosine_dist($d1, $d2);
    });
});