1

私は mlpy ライブラリを初めて使用し、文の分類を実装する最良の方法を探しています。私はmply Basic Perceptronを使用してそれを行うことを考えていましたが、私の理解では、事前定義されたベクトルサイズを使用していますが、マシンが学習している間にベクトルのサイズを動的に増やす必要があります.巨大なベクトル (すべての英単語)。私が実際に行う必要があるのは、文のリストを取得し、それらから分類子ベクトルを作成することです。アプリケーションが新しい文を取得すると、それをラベルの 1 つに自動的に分類しようとします (教師あり学習)。

アイデア、考え、例は非常に役立ちます。

ありがとう

4

1 に答える 1

1
  1. 事前にすべての文がある場合は、単語のリストを準備して (ストップ ワードを削除)、すべての単語を機能にマッピングできます。ベクトルのサイズは、辞書内の単語の数になります。

  2. それができたら、パーセプトロンを訓練できます。

Perl でマッピングを行った後、matlab でパーセプトロンの実装を行ったコードを見て、それがどのように機能するかを理解し、Python で同様の実装を記述します。

bag of words モデルの準備 (Perl)

use warnings;
use strict;

my %positions = ();
my $n = 0;
my $spam = -1;

open (INFILE, "q4train.dat");
open (OUTFILE, ">q4train_mod.dat");
while (<INFILE>) {
    chomp;
    my @values = split(' ', $_);
    my %frequencies = ();
    for (my $i = 0; $i < scalar(@values); $i = $i+2) {
        if ($i==0) {
            if ($values[1] eq 'spam') {
                $spam = 1;
            }
            else {
                $spam = -1;
            }
        }
        else {
            $frequencies{$values[$i]} = $values[$i+1];
            if (!exists ($positions{$values[$i]})) {
                $n++;
                $positions{$values[$i]} = $n;   
            }
        }
    }
    print OUTFILE $spam." ";
    my @keys = sort { $positions{$a} <=> $positions{$b} } keys %positions;
    foreach my $word (@keys) {
        if (exists ($frequencies{$word})) {
            print OUTFILE " ".$positions{$word}.":".$frequencies{$word};
        }
    }
    print OUTFILE "\n";
}
close (INFILE);
close (OUTFILE);

open (INFILE, "q4test.dat");
open (OUTFILE, ">q4test_mod.dat");
while (<INFILE>) {
    chomp;
    my @values = split(' ', $_);
    my %frequencies = ();
    for (my $i = 0; $i < scalar(@values); $i = $i+2) {
        if ($i==0) {
            if ($values[1] eq 'spam') {
                $spam = 1;
            }
            else {
                $spam = -1;
            }
        }
        else {
            $frequencies{$values[$i]} = $values[$i+1];
            if (!exists ($positions{$values[$i]})) {
                $n++;
                $positions{$values[$i]} = $n;
            }
        }
    }
    print OUTFILE $spam." ";
    my @keys = sort { $positions{$a} <=> $positions{$b} } keys %positions;
    foreach my $word (@keys) {
        if (exists ($frequencies{$word})) {
            print OUTFILE " ".$positions{$word}.":".$frequencies{$word};
        }
    }
    print OUTFILE "\n";
}
close (INFILE);
close (OUTFILE);

open (OUTFILE, ">wordlist.dat");
my @keys = sort { $positions{$a} <=> $positions{$b} } keys %positions;
foreach my $word (@keys) {
    print OUTFILE $word."\n";
}

パーセプトロンの実装 (Matlab)

clc; clear; close all;

[Ytrain, Xtrain] = libsvmread('q4train_mod.dat');
[Ytest, Xtest] = libsvmread('q4test_mod.dat');

mtrain = size(Xtrain,1);
mtest = size(Xtest,1);
n = size(Xtrain,2);

% part a
% learn perceptron
Xtrain_perceptron = [ones(mtrain,1) Xtrain];
Xtest_perceptron = [ones(mtest,1) Xtest];
alpha = 0.1;
%initialize
theta_perceptron = zeros(n+1,1);
trainerror_mag = 100000;
iteration = 0;
%loop
while (trainerror_mag>1000)
    iteration = iteration+1;
    for i = 1 : mtrain
        Ypredict_temp = sign(theta_perceptron'*Xtrain_perceptron(i,:)');
        theta_perceptron = theta_perceptron + alpha*(Ytrain(i)-Ypredict_temp)*Xtrain_perceptron(i,:)';
    end
    Ytrainpredict_perceptron = sign(theta_perceptron'*Xtrain_perceptron')';
    trainerror_mag = (Ytrainpredict_perceptron - Ytrain)'*(Ytrainpredict_perceptron - Ytrain)
end
Ytestpredict_perceptron = sign(theta_perceptron'*Xtest_perceptron')';
testerror_mag = (Ytestpredict_perceptron - Ytest)'*(Ytestpredict_perceptron - Ytest)

同じことを Python で再びコーディングすることはしたくありませんが、これにより、どのように進めるかについての指示が得られるはずです。

于 2014-07-19T11:45:31.207 に答える