« ブログのコメントのデータベース化 | トップページ | 特定著者コメントのNグラム頻度集計 »

コメントデータベースから特定著者の発言抽出

今回は、前回作ったコメントデータベース(タブ区切りテキスト)から、特定のコメント著者の発言部分だけを抽出し、年別にファイルに分けてみます。

Data Effectorで提供されているshunselectコマンドに条件毎にファイルに振り分ける機能があったのでこれを使ってみます。中核となるコマンド行は以下です。
shunselect -s select.cfg -q selectcond.txt -o selectout.txt < commentdb.txt

各設定ファイルは以下のようにしました。

■selectcond.txt

1 { $body } $blogdate = "^2005" AND $comauthor = "弘幸$"
2 { $body } $blogdate = "^2006" AND $comauthor = "弘幸$"
3 { $body } $blogdate = "^2007" AND $comauthor = "弘幸$"
4 { $body } $blogdate = "^2008" AND $comauthor = "弘幸$"
5 (%1) OR (%2) OR (%3) OR (%4)

■selectout.txt

1> D:\scomgram\cdb2005.txt
2> D:\scomgram\cdb2006.txt
3> D:\scomgram\cdb2007.txt
4> D:\scomgram\cdb2008.txt
5> D:\scomgram\cdbOther.txt

■select.cfg

CharacterCode  UTF-8
InFileType     CSV
FieldSeparator "\t"
LogFile "D:\scomgram\Select.log"
ErrFile "D:\scomgram\selecterr.csv" 10

「shuncond.txt」で振り分けの条件と、結果として書かれる値を指定しています。
ここでは瀬戸弘幸氏の名前で書かれたコメントを抽出する事にして、コメント著者名の末尾が「弘幸」であるものをブログの日付の年別に振り分ける条件を書いています。「{ $body }」という記述は、出力されるファイルに書かれる内容が、コメントDBの「body」というカラムだけという指定です。つまり、コメント内容だけが出力されます。

この条件に応じた出力先のファイル名を「selectout.txt」に指定しています。5番目の「cdbOhter.txt」は後のチェック用に1~4番目の条件に該当するものの全カラムを出力しています。

Data Effectorの「体験版」には、記述できる振り分け条件数5以下という制約があるらしいのですが、上記を試すには丁度良い上限でした。

2008年12月までのコメントを処理して、最初のコメントDBは68.9MBありましたが、抽出後のファイルの大きさは以下のようになりました。
2005年分:20KB
2006年分:792KB
2007年分:190KB
2008年分:175KB
色々論争が多かった2008年分が多いと予想したのですが、これは間違ってました。実は2006年の方が記述量は遙かに多かったんですね。

なお、Data Effectorのマニュアルを読んだのですが、半角の引用符(")を一般の文字として扱うオプションを見つけられず、やむなく振り分け処理の前に半角引用符(")を全角ダブルプライム(″)に置き換えました。したがって、半角引用符と全角ダブルプライムについては今後の集計が正しく出ません。
(この辺の特殊文字の使い方も個人差が出そうです。私は今回初めて全角ダブル引用符(“”)と全角ダブルプライム(″)の差を意識しました。)

上記の文字変換のために以下のような簡単なPerlプログラムを書きました。

# convertquote.pl file1 file2
# file1の引用符(")(ダブルクオート)を全角のダブルプライム(″)に置き換えてfile2に書く
# file2を上書きするので要注意
use utf8;
my $file1 = shift;
my $file2 = shift;

open(IN, "<:utf8", $file1) || die("cannot read open $file1\n");
open(OUT,">:utf8", $file2) || die("cannot write open $file2\n");

while (my $line = <IN>) {
  $line =~ s/"/″/g;
  print OUT $line;
}
close(IN);
close(OUT);

最終的には以下のようなバッチファイルでコメントDB(commentdb.txt)から抽出を行いました。

rem コメントDBを年別にファイルに分割する
rem 事前に引用符(")を全角のダブルプライムに変換する
rem 分割先ファイル名はselectout.txtに、分割条件はselectcond.txtに指定

convertquote.pl commentdb.txt commentdb-noq.txt
shunselect -s select.cfg -q selectcond.txt -o selectout.txt < commentdb-noq.txt

この振り分けの結果、例えばcdb2005.txt(2005年分の瀬戸氏のコメント集)の冒頭部分は以下のようになりました。これで特定著者のNグラム頻度分析の準備がだいたいできた事になります。

"body"
" 投稿ありがとう。宋教仁については余り詳しくありませんが、石原莞爾と北一輝には興味があり、若かりし頃は北一輝の故郷であった佐渡に行きました。 しかし、佐渡の住民で北一輝のことを知る人とは会うことは出来ませんでした。 対して、石原莞爾の故郷を訪ねた時のことです。殆どの人が石原莞爾を「あの偉い先生」と呼んで尊敬していました。 先生の墓を訪ねた時のことは今でも忘れません、山の上に小高く盛られたその墓は、威厳に満ちていました。 夏の暑い日でした。蝉の鳴き声がうるさいにの、何故かシーンと静まり返っていたのを記憶しています。記帳のノートがあり、覗いてみると遠くは米国、ブラジルからも墓参りに来ていた人がおりました。"
" ある意味、日本は情ない。 戦略的思考がゼロです。"

文字分析を始めてから気がつきましたが、こういった事前のデータ振り分けは処理時間を減らすために重要です。著者と日時の情報を持っていれば、論理的には全データをひとまとめにして処理する事で著者別・日時別の集計も出せるのですが、現実には処理時間がかかり過ぎてしまい人間がついていけません。できるだけデータを小分けにして処理する算段をするのが分析の効率化には欠かせないと思いました。

それにしても、ブログが花盛りの昨今、ブログのデータを元にした研究も盛んに行われていると思うのですが、皆さん、どうやってデータ処理されているのでしょう? 定番があって良さそうですが、実はそうでもないのかなぁという気がしてます。

|

« ブログのコメントのデータベース化 | トップページ | 特定著者コメントのNグラム頻度集計 »

文字分析」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1109195/26749415

この記事へのトラックバック一覧です: コメントデータベースから特定著者の発言抽出:

« ブログのコメントのデータベース化 | トップページ | 特定著者コメントのNグラム頻度集計 »