作者: 閑舎
日時: 2003/5/21(02:27)
 誰も作ってくれないようなので自分で作りました。

---^ get_headline.pl
# 文字コードは SJIS でなく EUC でないと苦しい場合があるかもしれません。
$str =<<EOF; # ここにメッセージ本文を置いていろいろお試しください。
 TSNET 参加者の皆さん、こんにちは。

 さて、8/6 午後 6 - 10 時にかけて、サーバのハードを急遽交換する必要が生
じましたので、断続的にサービスを停止させていただきました。

...

 また、先日アナウンスしました、参加している部屋を確認するシステムに関し、
一部不具合が残っています。こちらの復旧は、申し訳ありませんが 3-4 日お待
ちください。

--
本田博通(閑舎)
Hiromichi Honda <raku\@rakunet.org>
EOF

$str = get_headline($str);
print "$str\n";

sub get_headline {
  my($line) = @_;
  my($i, $second, @lines);

  $line =~ s/^\s+//s;
  $line =~ s/\r\n/\n/g;
  $line =~ s/\r/\n/g;
  @lines = split(/\n\n/, $line);

  $lines[0] =~ s/^( | )*.{2,20}?(\@|@).[^\n]*(\n|$)//s;
  $lines[0] =~ s/^.{10,20}?(です|ます)(\.|。|.)\s*$//;
  $lines[0] =~ s/^.*(こんにちは|こんばんは|おはよう|初めまして|はじめまして).*$//s;

  for ($i = 0; $i < @lines; $i++) {
    $lines[$i] =~ s/^\s+//sg;
    1 while (($lines[$i] =~ s/^([\|>#]|>)[^\n]*\n?//sg) or ($lines[$i] =~ s/^.{1,16}(\n|$)//sg));
    if ($lines[$i] =~ /^([^\|>#]{2,16}([\|>#]|>)).*\n\1/s) {
      $pre = $1;
      1 while (($lines[$i] =~ s/^$pre[^\n]*(\n|$)//sg) or ($lines[$i] =~ s/^.{1,16}(\n|$)//sg));
    }
    $lines[$i] =~ s/(^|\n)--.*//sg;
    next if ($lines[$i] =~ /^\s*([OI]n|At) .*wr[io]tes?[.:]\s*(\n|$)/si);
    next if ($lines[$i] =~ /\@.*(wr[io]tes?|message)(:|\.$)/);
    next if ($lines[$i] =~ /において.*(書き|いい|言い)ました(\.|。|.)?\s*$/s);
    next if ($lines[$i] =~ /さん.*\@.*から(\.|。|.)?\s*(\n|$)/s);
    next if ($lines[$i] =~ /(^|\n)(From|Date):/si);
    next if ($lines[$i] =~ /^\s*$/s);
    next if (length($lines[$i]) < 20);
    if (length($lines[$i]) < 100) {
      $lines[$i] =~ s/\n//sg;
    } else {
      $lines[$i] =~ s/^\s*//s;
      $lines[$i] =~ s/^([^\n]+\n[^\n]+\n[^\n]+).*/\1.../s;
      $lines[$i] =~ s/\n//sg;
    }
    return $lines[$i];
  }
}
---$

 実行は、

  perl get_headline.pl

です。$str の部分にメール本文を入れて試してください。とても完全とはいき
ませんが、8-9 割はうまく取り出せていると思います。改良等あれば追加、修正
してください。

--
本田博通(閑舎)
テキストとスクリプトの http://rakunet.org/TSNET/