例題解説

例題

rg内の各MLの参加者をもとに、
各kgごとのつながりを調べよ。

分析

使う素材のリストアップ

MLに所属する人のリスト
元データは shonan:/usr/lib/mail-list から取得。
各データは一行ずつログイン名が書かれている。
例:necoのML参加者は以下のように「neco」というファイルに書かれている。
egichan
yuuki

ami-ta

素材データの変換

「MLに所属する人のリスト」を「ある人が所属するMLのリスト」に変換。

例:ami-taの場合
neco
sprng
soi

参考コード


opendir DIR, "." or die "serious dainbreamage: $!";

while( my $kg = readdir(DIR) ) {
	next if $kg =~ /^\.\.?$/;
	push @KGLIST, $kg;

	open( KG, $kg ) or die "can't open datafile: $!";
	while(<KG>) {
		chomp;

		next if /^(#.*)?$/;
		s/^([^@]+)(@|$)/$1/;

		if ( $DB{$1} ne "" ) {
			$DB{$1} .= "\t";
		}
		$DB{$1} .= "$kg";
	}
	close( KG );
}
closedir DIR;
	

マトリクス表を作る

所属KGが2つの人

例:haruhitoさん(参加ML:insat, sprng)

この場合、INSAT と SPRNG の間に一人橋渡しをする人が居るので、 以下のように表の INSAT − SPRNG の欄に 1 を加える。

所属KGが3つの人

例:ami-ta(参加ML:neco, sprng, soi)

同様に、neco、SPRNG、SoI の間にそれぞれ橋渡しをしていると考える。

参考コード


# 集計
foreach my $key (sort keys %DB) {
	my @kg = split /\t/, $DB{$key};

	for( my $i = 0; $i <= $#kg; $i++ ) {
		for( my $j = 0; $j <= $#kg; $j++ ) {
			if( $i == $j ) {
				next;
			}
			$DATA{"$kg[$i]:$kg[$j]"} ++;
		}
	}
}

# 行列で表示
@KGLIST = sort @KGLIST;				# 配列を整列させる。
print "\t" , (join "\t", sort @KGLIST), "\n";	# 上の凡例
for( my $i = 0; $i <= $#KGLIST; $i++ ) {
	print $KGLIST[$i];			# 左の凡例
	for( my $j = 0; $j <= $#KGLIST; $j++ ) {
		print "\t" , $DATA{"$KGLIST[$i]:$KGLIST[$j]"};
	}
	print "\n";
}

	

結果

完成した表

duplication count of KG members
-ECNHORNI-carINSATKMSFMAOMcngSINGSTREAMcomcomeducenecosoisprng
ECN-4004060000010
HORN4-005050000010
I-car00-20219610031
INSAT002-0103201021
KMSF4500-153500300
MAO00211-02510211
Mcng651050-1001010
SING0093321-1212411
STREAM006255012-211583
comcom001001012-1101
educe00010012111-574
neco00003204515-712
soi113201118077-6
sprng00110101314126-

紐帯図