0

入力ファイルは UTF8 エンコーディングで、各行の構造は次のとおりです。

    C\tTEXT\n

ここで、C はドキュメントのクラス (複数の文字)、\tはタブ、TEXT は一連の文字、\nは改行文字です。

各 TEXT から、HTML タグおよび同様のタグ、エンティティ、文字以外の文字が削除され、各テキストは一連の単語に変換されます。順序は重要ではありません。

各 TEXT から、ベクトルが作成されます。ベクトルの個々の要素 (属性) は、テキスト コレクション内の単語に対応し、ベクトル内の値は、TEXT 内の単語の出現に依存します。これらの値には、次の 2 つのタイプがあります。

A - number of occurrences of words (1 or 0) 
B - number of occurrences    of words (0 or more)

最後の値ベクトルはドキュメントのクラスです。

必要に応じて、頻度が低い単語 (たとえば、1 つ) をすべてのテキストから削除することができます。

文字数の少ない単語も削除できます。

Example input file:
CLASS    One Class One
CLASS    One Two
2CLASS   two three
CLAS12   three

出力ファイルの例:

これらはスクリプトのパラメーターです (最小単語長 = 1、単語の最小出現数 = 1、A)

出力:

      one two three
CLASS  2   0    0 
CLASS  1   1    0
2CLASS 0   1    1
CLAS12 0   0    1

私の現在のコード:

私を助けてください。

#!/usr/bin/perl

use strict;
use encoding 'UTF-8';
use Data::Dumper;

my %vector = ();
my @vectors = ();
my ($string,$word);

open SOURCE, "<:encoding(UTF-8)", "source.txt" or die "File does not exist $!\n";

my($class,$hodnota);
while (my $line = <SOURCE>) {
  if($line=~ /^(\w+)\t(.+)\n/){  
    $string =$2; $class = $1;
    $string=~ s/[^a-zA-Z ]//g; 

      for $word ( split " +", $string )
      {
        $vector{$word}++;
      }

      $vector{"class"} = $class;
      push(@vectors, %vector)
   }

}          
    close S;

print Dumper( \@vectors );
4

2 に答える 2

1
use strict; 
use warnings;
use Data::Dumper;

open my $in_data, shift(@ARGV);
my @array_of_hashes_of_hashes=(); 
#used array of hashes_of_hashes because you treated two instances of CLASS differently
#if they could be treated the same, a simple hash of hashes would work fine.

while (<$in_data>)
{  
    if ($_ =~ /^(\w+)\t(.+)\n/)
    {   
        my %temp_hash=();
        my @values=split(/ /,$2);

        foreach (@values)
        {
            $temp_hash{lc($_)}+=1; #so that one and One map to the same key
        }

        push @array_of_hashes_of_hashes, {$1 => \%temp_hash};
    }
}

print Dumper \@array_of_hashes_of_hashes; #just to show you what it looks like

Classfromの値を出力していないことに気付いたCLASS One Class Oneので、すべてを出力するときにそれを除外したい場合。

于 2013-05-22T20:20:09.540 に答える
1

次のことをお勧めします。

chomp($line);
if ($line =~ /^(\w+)\t(.+)/){
    my $vector = {};
    my ($class, $string) = ($1, $2);
    for my $word (split /[^a-zA-Z]/, $string) {
        next if length($word) < $some_treshold; # $word is too short
        my $word_lc = lc($word);
        $vector{$word_lc}++;
        $all_words{$word_lc} = 1; # this has to be initialized before main loop, as $all_words = {};
    }
    $vector{"class"} = $class; # hopefully, no words will be "class"
    push(@vectors, %vector)
}

これが完了すると、使用されているすべての単語を で見つけることができますkeys %$all_words。うまくいけば、私はあなたが必要とするものを正しく理解しました。

于 2013-05-22T18:50:36.580 に答える