Python mlpy Классификация текста
Я новичок в библиотеке mlpy и ищу лучший способ реализовать классификацию предложений. Я думал использовать mply Basic Perceptron для этого, но, насколько я понимаю, он использует предопределенный размер вектора, но мне нужно, чтобы размер вектора динамически увеличивался во время обучения машины, потому что я не хотел бы создавать огромный вектор (из всех английских слов). Что мне действительно нужно сделать, так это получить список предложений и построить из них вектор классификатора, а затем, когда приложение получит новое предложение, оно попытается автоматически классифицировать его по одной из меток (контролируемое обучение).
Любые идеи, мысли и примеры будут очень полезны,
Спасибо
1 ответ
Если у вас есть все предложения заранее, вы можете подготовить список слов (удаляя стоп-слова), чтобы сопоставить каждое слово с функцией. Размер вектора будет соответствовать количеству слов в словаре.
Когда у вас есть это, вы можете тренировать персептрон.
Взгляните на мой код, в котором я сделал отображение в Perl, а затем реализацию perceptron в matlab, чтобы понять, как это работает, и написать аналогичную реализацию на python
Подготовка мешка слов модели (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, но это должно дать вам руководство о том, как действовать