Сравните все документы с другими документами в Perl's Text :: DocumentCollection - PullRequest
3 голосов
/ 09 декабря 2011

Учитывая коллекцию документов в Text::DocumentCollection в Perl, я хочу вычислить косинусное сходство между любыми двумя документами в коллекции, используя Text::Document.

Я думаю, что это, вероятно, можно сделать с помощью EnumerateV и обратных вызовов, но у меня возникают проблемы с выяснением специфики.( Этот вопрос SO полезен, но я все еще застрял.)

Если говорить точнее, предположим, что коллекция хранится в 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 Ответ

2 голосов
/ 07 февраля 2012

Возможно, вы захотите начать с чего-то вроде этого:

$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);
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...