Предварительная обработка данных для входных данных при кластеризации с CLUTO

Я пытаюсь кластеризовать некоторые слова на основе их сходства (между двумя словами). Часть моих данных такая же, как показано ниже (это просто пример "animal.txt", он похож на матрицу смежности).

    cat dog horse ostrich 
cat  5    4    3    2
dog  4    5    1    2
horse 3   1    5    4
ostrich 2  2   4    5                 

Большее число означает, что сходство между двумя словами выше. Основываясь на данных такого формата, я хочу сделать кластеры. (например, если я хочу сделать 2 кластера, то результат будет (кошка, собака), (лошадь, страус)).

Я пытался использовать CLUTO... чтобы сделать несколько кластеров.

Сначала я должен заново создать входной файл перед кластеризацией CLUTO. Итак, я использовал doc2mat ( http://glaros.dtc.umn.edu/gkhome/files/fs/sw/cluto/doc2mat.html).. но я не знаю, как правильно использовать это для создания CLUTO входные файлы (например, файлы mat, label). И после создания входных файлов CLUTO, как я могу создать кластеры на основе вышеуказанных данных?

1 ответ

Поскольку ваши данные представляют собой матрицу смежности, соответствующий входной файл CLUTO представляет собой так называемый GraphFile, а не MatrixFile, и, следовательно, doc2mat не помогает

Эта программа txt2graph.pl преобразует файл, подобный вашему примеру "animal.txt", в файл графика и файл метки строки:

#!/usr/bin/perl
@F = split ' ', <>;             # begin reading txt file, read column headers
($GraphFile = $ARGV) =~ s/(.txt)?$/.graph/;
$LabelFile = $GraphFile.".rlabel";
open LABEL, ">$LabelFile";
open GRAPH, ">$GraphFile";
print GRAPH $#F+1, "\n";        # output number of vertices=objects=columns=rows
while (<>)
{                               # process each object row
    @F = split ' ', $_, 2;      # split into name, numbers
    print LABEL shift @F, "\n"; # output name
    print GRAPH @F;             # output numbers
}

После кластеризации CLUTO эта программа pclusters.pl печатает результат в желаемом формате вывода:

#!/usr/bin/perl
($LabelFile = $ARGV[0]) =~ s/(.clustering.\d+)?$/.rlabel/;
open LABEL, $LabelFile; chomp(@label = <LABEL>); close LABEL;   # read labels
while (<>)
{
    $cluster[$_] = [] unless $cluster[$_];      # initialize a new cluster
    push $cluster[$_], $label[$.-1];            # add label to its cluster
}
foreach $cluster (@cluster)
{
    print "(", join(', ', @$cluster), ")\n";    # print a cluster's labels
}

Вся процедура тогда:

> txt2graph.pl animal.txt
> scluster animal.graph 2
> pclusters.pl animal.graph.clustering.2
Другие вопросы по тегам