次へ: 5 分野依存部分の分離 上へ: AWK による HTML ファイルの整形 その 3 前へ: 3 全体のおおまかな構造 (PDF ファイル: awkwww3.pdf)


4 パターン部分の定義

3 節で紹介したように、 最初の BEGIN ブロックでは、 各ジャンルに対するキーワードパターンなどを定義します。 必要なのは以下のものです。 最後の見出し名は、HTML ファイルの各ジャンルのところの セクションの見出しとして使用する文字列を意味します。

キーワードパターンは、 基本的に str ~ pat[j] のようにパターンマッチングで使用されるので 正規表現で書いていきます。 ここでは、or のタイプの正規表現パターンを書いていきます。 例えば、「自然災害」というジャンルなら、

地震、台風、豪雪、豪雨、洪水、落雷、雪崩、...
などのキーワードが思い浮かびますが、 これらのいずれかにマッチする記事を選べばいいわけですから、 or のタイプの正規表現を使用します。or のタイプの正規表現は、 以下のように書きます。
(A|B) = A または B
(A|B|C) = A または B または C
....
この A,B,C の部分には文字列が使えますし、入れ子にすることもできます。 例えば、
(地震|豪雪) = 「地震」または「豪雪」
豪(雪|雨) = 「豪雪」または「豪雨」
(地震|豪(雪|雨)) = 「地震」または「豪雪」または「豪雨」
のような使い方が可能です。

これによって、パターン定義部を書けば例えば以下のようになります。

  BEGIN{
    NG=0
    ### 自然災害 ###
    Gname[++NG]="自然災害関連"
    pat[NG]="("
    pat[NG]=pat[NG] "(地|余)震|震(災|度|源)|(災|水)害|(豪|大)(雨|雪)"
    pat[NG]=pat[NG] "|台風|被災|崩落|落雷|警報|避難|洪水|雷雨|濃霧"
    pat[NG]=pat[NG] "|土砂崩|雪崩|(突|強)風|竜巻|陥没|倒木"
    pat[NG]=pat[NG] ")"

    ### 火事 ###
    Gname[++NG]="火事関連"
    pat[NG]="("
    pat[NG]=pat[NG] "(放|出|不審)火|火(事|災)|(全|半)焼|ぼや"
    pat[NG]=pat[NG] ")"

    ....

    ### 訃報 ###
    Gname[++NG]="訃報"
    pat[NG]="("
    pat[NG]=pat[NG] "訃報|通夜|葬儀|告別式|死去"
    pat[NG]=pat[NG] ")"

    ### その他 ###
    Gname[NG+1]="その他"
}
上のパターンの中の、(豪|大)(雨|雪) の部分は、 「豪雨」「豪雪」「大雨」「大雪」の 4 つの文字列のいずれかを意味しています。

一般にパターンは今後の修正により長くなったり、 後で別ジャンルを挿入したり削除したりする可能性がありますから、 上にはそれが楽にできる工夫が含まれています。

例えば、上では最初に NG=0 として、$Gname$ の定義の中で Gname[++NG]=...としていますが、 これを Gname[1]=...と書いてしまうと、 これは最初のジャンルに固定したことになってしまいますので、 1 という数字を使わずに何番目のジャンルでも同じように書けるようにしていて、 いつでもジャンルの追加、削除、移動等が可能なようにしています。

また、例えば「訃報」のところの $pat[]$ の定義ですが、

  pat[NG] = "(訃報|通夜|葬儀|告別式|死去)"
と 1 行で済むところをあえて
  pat[NG]="("
  pat[NG]=pat[NG] "訃報|通夜|葬儀|告別式|死去"
  pat[NG]=pat[NG] ")"
のように 3 行に分けて書いているのは、キーワードの追加、削除、修正等を しやすくするためです。

最初の「自然災害」のジャンルを見ればわかりますが、キーワードが長いので 数行分けて書いています。 最初は少ないキーワードでも、後でどんどん追加して長くなることがあります3。 その場合、最初のカッコと最後のカッコを除けば `|' とキーワードを追加するだけなので、 追加が容易です。

もしそのカッコを除外しておかないと、 先頭のカッコや最後のカッコをうっかり削除したり、 つけ忘れたり、真中に残してしまったり、 ということがある可能性がありますので、 最初と最後にそれを別につけてやる、という形にしてあります。

なお AWK では文字列の連結は、文字列を並べるだけでできますので、

  pat[NG]="("
  pat[NG]=pat[NG] "訃報|通夜|葬儀|告別式|死去"
  pat[NG]=pat[NG] ")"
は、すなわち
  pat[NG] = "(訃報|通夜|葬儀|告別式|死去)"
を意味しています。


次へ: 5 分野依存部分の分離 上へ: AWK による HTML ファイルの整形 その 3 前へ: 3 全体のおおまかな構造
竹野茂治@新潟工科大学
2006年9月8日