【问题标题】:Python mlpy Classification of textPython mlpy 文本分类
【发布时间】:2014-07-19 19:45:31
【问题描述】:

我是 mlpy 库的新手,正在寻找实现句子分类的最佳方法。 我正在考虑使用 mply Basic Perceptron 来做到这一点,但据我了解,它使用的是预定义的向量大小,但我需要在机器学习时动态增加向量的大小,因为我不想创建一个巨大的向量(所有英语单词)。 我真正需要做的是获取句子列表并从中构建分类器向量,然后当应用程序获得新句子时,它会尝试将其自动分类到其中一个标签(监督学习)。

任何想法、想法和例子都会很有帮助,

谢谢

【问题讨论】:

    标签: python machine-learning nltk perceptron


    【解决方案1】:
    1. 如果你事先准备好所有的句子,你可以准备一个列表 单词(删除停用词)将每个单词映射到一个特征。规模 的向量将是字典中的单词数。

    2. 一旦你有了它,你就可以训练一个感知器。

    看看我的代码,其中我在 Perl 中进行了映射,然后在 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 中编写相同的代码,但这应该会为您提供如何继续的方向

    【讨论】:

    • @Dua 谢谢你的回答。问题是当我需要分类的句子中有新词时,我需要增加特征(词)的数量。我正在寻找在 python 中实现这一点的最佳方法,同时尽可能编写最少的代码,同时使用已经编写的库作为 python 的 nltk 和 mlpy。
    • 当句子中有新词需要分类时,你没有关于这些词的信息,所以忽略这些词是最安全的。这就是标准分类的完成方式。这篇nltk.org/book/ch06.html的文章很好的解释了这个理论
    猜你喜欢
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 2016-02-26
    • 2018-07-03
    • 2019-03-09
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多