netファイルならびにpajファイルの命名規則は↓の通りです.
※ ***には年月(6桁)が入ります.命名規則に従っていない場合はプログラムは動作しません(きめうちなので)
また,Partitionに関しては,↓の通りに統一します.
mboxから複数のメールアドレスを利用している人物を抽出してリスト(participantsIdentifierl.txt)を作成する.
複数のメールアドレスを所有している人(ex.Joshua)のメールアドレスを1つに統一するために,変換ルール(replaceRule_v3.txt)を用いてmboxを書き換える.
※この処理では,mboxを上書きせずtxt形式に変換します.次のStepに進む前に拡張子を取り外して下さい.上書きしてもいいのであればBatファイルをいじって下さい.
getRelationWithCluster.plを用いて,Step2で処理したmboxからnetファイルを作成する.
※netファイルを作成した後,↑の共通注意事項にある命名規則に従ってnetファイルをリネームして下さい.
mergeNetworksByName_v2.plを用いて,開発者とユーザの2つのnetファイル(dev_***.netとuser_***.net)をマージしたpajファイルを作成する.(3つのサブコミュニティをマージするときは伊原プログラムで)
makeEachDegreePajekMacro.pl,makeMergeBetweennessPajekMacro.plを用いて,中心性(今回は次数中心性と媒介中心性)を求めるためのマクロファイルを作成する.
(ノード重み付きコミュニティ媒介性を求める際にサブコミュニティ毎のノードの次数中心性の値が必要になります。GNWS原稿と修論では次数中心性(PajekではDegree>All)の値を用いましたが,近接中心性や媒介中心性,または他の指標値を用いることも可能です.
また,開発者からユーザへの情報伝達の度合い(?)を評価したい場合,コーディネータとつながる開発者の入次数中心性とユーザの出次数中心性を用いるといった使い方も可能です.下の図は開発者からユーザへの情報伝達のイメージ図です)
Pajekでマクロファイルを読み込ませて各中心性を計算する.
metricsWithNoWgt_Fvalue.pl,metricsWithEdgeWgt_Fvalue.pl,metricsWithNodeWgt_Fvalue.plを用いて,各コミュニティ媒介性の値を計算する.
- NoWgtCB_Fvalue(重みなしコミュニティ媒介性)
- EdgeWgtCB_Fvalue(エッジ重み付きコミュニティ媒介性)
- NodeWgtCB_Fvalue(ノード重み付きコミュニティ媒介性) ※ここには修論で用いたコミュニティ媒介性(調和平均version)を求めるプログラムを置いておきます.GNWSでは調和平均ではなく単純に掛け合わせて計算していますが,そちらのプログラム(末尾の_Fvalueがない名前のPLファイル)はSNA班の個人用ディレクトリ(People/hirotaka-m)内に置いておきます.
各期間毎に,参加者のメールアドレスと各中心性の値(媒介中心性,各コミュニティ媒介性)の一覧をCSV形式にしてはき出す.
※ここで作成したCSVファイルは,Rを使ってグラフ等を作成するときに必要になります.
各中心性
↑の2〜6の工程(net,pajファイルの作成ならびに中心性の値の計算)で用いるプログラムはまつしんやろぎのページにも置いてあります.基本的に同じプログラムを共有しているはずですが,getRelationWithCluster.plに関してはここにあるものが最新版になっているはずです.(まつしんやろぎが最新版を添付し直しているかもしれませんが不明です)
getRelationWithCluster.pl ← 修正済(修正・追加した点は以下に示す通りです)
入力:mboxファイル
3ヶ月分なら3つのmboxファイルが必要
e.g.) perl getRelationWithCluster.pl 200007 200008 200009
※200007や20008といった引数はmboxのファイル名です.
出力:netファイル
↑の入力例だと200007.netというnetファイルができる
batファイルの例
- perl getRelationWithCluster.pl 2000101 200102 200103
- perl getRelationWithCluster.pl 2000102 200103 200104
・
・
・
★修正・追加した点
1.mboxからメールアドレスを抽出するための条件の追加. e.g.) "名前 <メールアドレス (名前)" という形式であっても抽出できるようにした
2.スパム対策の偽造("@"が" at "になっている)部分の解除(by ろぎ) ← 特にGIMPの中期に多くある
3.↓のルール1,2で同一人物を特定.(大文字は小文字に統一)
- ルール1:メールアドレスが完全一致ならば同一人物
- ルール2:メールアドレスの@以前が一致 && From行にある名前が完全一致ならば同一人物
4.ノード0問題の解決
5.自己ループの削除 (Pajekで処理してもよかったけどめんどかったのでこのプログラムで処理した)
mergeNetworksByName_v2.pl <- by まつしん
入力:マージしたい2つのNetファイル
e.g) perl mergeNetworksByName_v2.pl data1_***.net data2_***.net
出力:Pajファイル(merge_***.paj)
※注意事項
割り当てられるパーティション番号は引数の順番(↑の例だと以下のようになる)
Partition 1 : data1_***.net
Partition 2 : data2_***.net
Partition 3 : data1_***.netとdata2_***.netに共通して出現する人
batファイルの例
- perl mergeNetworksByName_v2.pl dev_200101.net user_200101.net > merge_200101.paj
- perl mergeNetworksByName_v2.pl dev_200102.net user_200102.net > merge_200102.paj
・
・
・
makeEachDegreePajekMacro.pl <- Eachはサブコミュニティ毎に求めた中心性を指す
makeMergeBetweennessPajekMacro.pl <-Mergeはサブコミュニティ毎に分けずに求めた中心性を指す
※個人的に作ったものなので他の人が使うときは,netファイルやpajファイルの置いてあるディレクトリや計算結果を保存するディレクトリへのパスを必ず変更して下さいm(_ _)m
入力: perl makeEachDegreePajekMacro.pl ○○ △△ □□ ××
- ○○ = OSSコミュニティ名 e.g.) apache,gimp,netscape など
- △△ = サブコミュ二ティ名 e.g.) dev,user, merge など
- □□ = 期間(開始年月) : e.g.) 2000年7月からなら200007
- ×× = 期間(終了年月) : e.g.) 2007年5月で終了なら200705
※引数には↑に示す通り,OSSコミュニティ名,サブコミュ二ティ名,開始年月,終了年月が必要になります.
出力:中心性を計算するためのマクロファイル(↑の例は次数中心性の場合)
重みなしコミュニティ媒介性 :
metricsWithNoWgt_Fvalue.pl
エッジ重み付きコミュニティ媒介性 :
metricsWithEdgeWgt_Fvalue.pl
ノード重み付きコミュニティ媒介性 :
metricsWithNodeWgt_Fvalue.pl
入力: perl metricsWithNoWgt_Fvalue.pl merge_***.paj dev_***.net user_***.net
出力: コミュニティ媒介性(有向)の値
1To2は開発者⇒ユーザへの媒介度合いであり,2To1はユーザ⇒開発者への媒介度合いを表しています.↓の補足プログラムであるmergeEachDirection.plを用いれば,双方向(開発者⇔ユーザ)を媒介するアンドマンのみ評価することができます.
Partitionの割り当ては手動で変更することも可能です.(各プログラムの比較的上のほうに書いてあります.metricsWithNoWgt_Fvalue.plの場合は上から32行目あたり).2番目,3番目の引数として与えたサブコミュニティ名に従って自分で編集すること.
↑の例では,subCommunity_1(dev) = 1, subCommunity_2(user) = 2, andman = 3 となる
- $subCommunity_1 = 1;
- $subCommunity_2 = 2;
- $andman = 3;
もし,dev_***.netとuser_***.netを入れ替えるなら,
- $subCommunity_1 = 2;
- $subCommunity_2 = 1;
- $andman = 3;
※defaultでは,subCommunity_1 = 1(dev), subCommunity_2 = 2(user) になってるので特にいじる必要はありません.このような仕様にしているのは,伊原研究(3-coordinator研究)のこと考慮に入れているからです
batファイルの例 ※ノード重みなし(NoWgt)の場合
- perl metricsWithNoWgt_Fvalue.pl merge_200101.paj dev_200101.net user_200101.net
- perl metricsWithNoWgt_Fvalue.pl merge_200102.paj dev_200102.net user_200102.net
・
・
・
batファイルの例 ※エッジ重み付き(EdgeWgt)の場合
↑のmetricsWithNoWgt_Fvalue.plの部分をmetricsWithEdgWgt_Fvalue.plに変えるだけ
batファイルの例 ※NodeWgtの場合
- perl metricsWithNodeWgt_Fvalue.pl merge_200101.paj dev_200101.net user_200101.net dev_200101.vec user_200101.vec
- perl metricsWithNodeWgt_Fvalue.pl merge_200102.paj dev_200102.net user_200102.net dev_200102.vec user_200102.vec
・
・
・
※NodeWgtは,中心性の値が必要になるので,netファイル(subCommunity_1 subCommunity_2の順)の次に,vecファイル(subCommunity_1 subCommunity_2の順)を付け足す
補足プログラム :
mergeEachDirection.pl
※各コミュニティ媒介性を計算するプログラムでは,1To2(dev⇒user)と2To1(user⇒dev)の2つのファイルが出力される
この補足プログラムは,1To2と2To1のそれぞれの媒介度合いの調和平均から双方向の媒介度合いを計算します
アンドマン同士のメッセージのやりとりが開発者コミュニティで行われたものか,ユーザコミュニティで行われたものかまで調べた上で,アンドマンのメール送信回数をカウントするプログラム
入力: mergeしたpajファイルと2つのnetファイル
e.g.) perl countMailNum4Andman.pl merge_***.paj data1_***.net data2_***.net
出力:それぞれのサブコミュニティ参加者へのアンドマンのメール送信総数
e.g.) andman⇒subCommunity_1の参加者へのメール送信総数
andman⇒subCommunity_2の参加者への送信総数
andman⇒subCommunity_1&2の参加者への送信総数
同様に,プログラムの350行目(?)以降をコメントアウトすれば受信回数も分かる
ちょっと改良すればアンドマン個人個人の送信回数を求めることも可能.
※3-coordinator(3つのサブコミュニティに属する人のメール回数)については不可(要改良)
getRelationWithCluster.plでは,同一人物を判定するためのルール2までしか処理をしないけど,ここでは新たにルール3を追加する
目的: Joshua問題を含め,Andmanの取りこぼしを軽減する
対象者: 以下の条件に該当する参加者 ※同一サブコミュニティにしか出現しない同じ名前の人は無視(数が多すぎるため)
条件1の場合
手順1:全期間を通じて,mboxから参加者の情報(From行の名前とメールアドレスだけ)を抽出する
手順2:抽出した参加者の情報一覧からルール3に該当する人の一覧を作成する
手順3:***で全期間のmerge_***.pajを用いてPartition=3の人(Andmanになったことがある人)の一覧を作成する
手順4:手順2,3で得られたそれぞれの一覧をもとに,***を使って名前とそれぞれのメールアドレスの一覧を作成する(e.g: joshua slive -> "joshua@slive.ca" "jslive@gmail.com")
手順5:気合で調べる(42人分)
条件2の場合
手順1:全期間を通じて,それぞれのサブコミュニティ毎にmboxから参加者の情報(From行の名前とメールアドレスだけ)を抽出する
手順2:抽出した参加者の情報一覧をもとに,それぞれのサブコミュニティに共通して出現する人(名前)の一覧を作成する
手順4:条件1の処理で得られたAndmanの一覧をもとに,Andmanではない人だけの一覧を作成する
手順5:気合で調べる(???人分)
以下は,↑の処理を行うための補足プログラムたち
各月毎にmboxからFrom行の名前とメールアドレスだけを抽出してListを作成する
↑の処理で得られたListをマージする(全期間分 または,全てのサブコミュニティ分)
makeMailListByNameIdentifier.pl
↑でマージしたListをもとに,参加者が利用している複数のメールアドレス一覧を吐き出す(e.g: joshua slive -> "joshua@slive.ca" "jslive@gmail.com" みたいな)
全期間において1度でもAndmanになったことがある人のListを作成する
makeMailListByNameIdentifier.plで作成した参加者が利用している複数のメールアドレス一覧からAndmanだけを抽出する