2

たくさんのテキストを含むファイルを読み込むプログラムを作成しようとしています。次に、句読点を取り除き、ストップ ワードを含むファイルを読み込みます。どちらも読み込まれ、配列に入れられます。一般的なテキストファイルの配列を入れてハッシュ化しようとしています。何が間違っているのかよくわかりませんが、試しています。これをやりたいのは、繰り返される単語の数と繰り返されない単語の統計を生成できるようにするためですが、ストップワードなどを取り除く必要があります。

とにかく、ここに私がこれまでに持っているものがあります #WORKING ON MERGING ARRAY INTO HASH は私が働いているところです。配列をハッシュに入れようとしている方法が正しいとは思いませんが、オンラインで見て、 %hash{array} = "value"; コンパイルしません。他に方法がわかりません。

ありがとうございます。何か質問があれば、すぐに返信いたします。

#!/usr/bin/perl
use strict;
use warnings;

#Reading in the text file
my $file0="data.txt";
open(my $filehandle0,'<', $file0) || die "Could not open $file0\n";
my@words;
while (my $line = <$filehandle0>){
    chomp $line;
    my @word = split(/\s+/, $line); 
    push(@words, @word);
}
for (@words) {
    s/[\,|\.|\!|\?|\:|\;]//g;
}
my %words_count;  #The code I was told to add in this post. 
    $words_count{$_}++ for @words;

次に、別の配列にあるストップ ワードを読み取ります。

#Reading in the stopwords file
my $file1 = "stoplist.txt"; 
open(my $filehandle1, '<',$file1) or die "Could not open $file1\n";
my @stopwords;
while(my $line = <$filehandle1>){
    chomp $line;
    my @linearray = split(" ", $line);
    push(@stopwords, @linearray);
}
for my $w (my @stopwords) {
    s/\b\Q$w\E\B//ig; 
}
4

2 に答える 2

7

Perlのハッシュに関するいくつかの注意...問題の説明:

とにかく、これまでのところ、コメント#WORKING ON MERGING ARRAYINTOHASHで作業しています。配列をハッシュに入れようとしている方法が正しいとは思いませんが、オンラインで調べたところ、%hash {array} = "value"; コンパイルされません。だから他にどうやってやるのかわからない。

最初に、なぜ「配列をハッシュに入れる」のかを自問してください。配列は値のリストを表し、ハッシュはキーと値のペアのセットを表します。したがって、キーと値を定義する必要があります。私たちだけでなく、あなたのためにも。理解を深めるために、簡単なことでも説明すると役立つことがよくあります。

この場合、特定の単語が配列$word内で出現した頻度をカウントすることができます。@wordsこれは、すべての単語を繰り返し処理し、$count{$word}毎回1つずつ増やすことで実行できます。これは@raina77owが彼の答えでしたことです。ここで重要なのは、Perlではスカラーシジルで表される単一のハッシュ値にアクセスしているということです。$したがって、という名前のハッシュがある場合は、キーの%count値を次のように増やすことができます。'foo'

$count{foo}++;

上記の「オンライン検索」の結果(%hash{array} = "value")は意味がありません。値をハッシュに格納する有効な方法は3つあります。

ハッシュ全体に均等なサイズのリストを割り当てることにより、すべてのキーと値のペアを設定します。

%count = (hello => 42, world => 17);

定義されたキーに単一の値を割り当てることにより、特定のキーに単一の値を設定します(これは以前に行ったことです)。

$count{hello} = 42;

いわゆるハッシュスライスを使用して、キーの特定のリストに値のリストを設定します。

@count{qw(hello world)} = (42, 17);

ここ%でのシジルの使用に注意してください。キーと値が混在する、派手な偶数サイズのリスト、$単一(スカラー)値、および値@のリストの場合。あなたの例では、を使用して%いますが、キーブレースで配列を定義し{...}、単一のスカラー値を割り当てます。

于 2012-11-18T23:50:53.463 に答える
4

配列に単語のリストがあり@words、各キーが特定の単語を参照し、各値がソース配列内のこの単語の出現数であるハッシュを取得したい場合は、次のように簡単に実行できます...

my %words_count;
$words_count{$_}++ for @words;

言い換えれば(しゃれは意図していません)、@words配列を反復処理し、各メンバーに対して%words_countハッシュORの対応する要素を1ずつ増やし、その要素がまだ定義されていない場合、本質的に値1でそれを作成します(いわゆるauto-vivification)。

補足として、keys配列で関数を呼び出すことはほとんど無意味です。5.12 以降では、代わりに使用されるインデックスのリストが表示され、その前に構文エラーがスローされます。

于 2012-11-18T23:25:34.003 に答える