人工無脳は考える 人工無脳は考える | 掲示板 | 資料 | アーカイブ

2005/02/26

解析ブロック入門編

next:学習ブロック入門編 >> Next Session:人工無脳の条件

※開発にはCygwin環境を使用した。前のページで取り上げたA-L-P-Gモデルにそって人工無脳システムのプログラミングをしよう。解析ブロックは人工無脳が日本語文字列から必要な情報を取り出すための前処理であり、Table 1に示すような機能が必要である。
Table 1. 解析ブロックの処理
処理内容
特定文字のエスケープ 人工無脳で使用したい区切り文字を予め別の文字列で置き換える。「,」→%2C 「:」→%3Aなど
分かち書き日本語文字列を品詞ごとに分解する
タグ置換「私」や「あなた」のような人称代名詞をタグに置き換える

これらの機能をperlスクリプトにした。

#! /usr/local/bin/perl -w

use Text::ChaSen;
Text::ChaSen::getopt_argv('chasen','-j','-F','%m/');

%Vocab=(
  '一人称' => [  
    "私","俺","僕","儂","我々","私達","私たち","わたし","あたし","おれ",
    "ぼく","わし","われわれ","わたしたち"],

  '二人称' => [
    "彼方","貴女","お前","お前さん","君","貴様","あなた","あなた",
    "あんた","おまえ","おまえさん","おまい","きみ","きさま"]
);

#   ----------------------------------------------------------------------
#
#                                 A N A L Y Z E                            
#
#   ----------------------------------------------------------------------

$input=readline(*STDIN);


  # 特定文字のエスケープ
  for($input)
  {
    s/([%,)(\/])/'%'.unpack("H2",$1)/eg;
  }

  # 分かち書き
  @tokens=split /\//,Text::ChaSen::sparse_tostr($input);
  
  #人称代名詞の置換
  for $element (@tokens)
  {
    while( ($key,$value)=each(%Vocab) )
    {
      for $e (@{$value})
      {
        if($e eq $element) { $element="($element,$key)"; last; }
      }
    }
  }
  
print join(" ",@tokens);

というわけで、例1に示すような処理ができる。

例1
私、私立の高校に通ってるけど私服だよ?
             ↓
(私,一人称) 、 私立 の 高校 に 通っ てる けど 私服 だ よ ?

課題

例2
キターー( ゜∀ ゜)ーーーー!
             ↓
キターー %28 ゜ ∀ ゜ %29 ー ー ー ー!

笑ってはいけない。形態素解析器の解説ページで顔文字を食わせた例は見たことが無いが、実際に人工無脳はこれらに正しく対応しなければならないからだ。

ほかに、上で示した例では形態素解析器の出力をそのまま使っているが、文字列の区切り方を考えた場合、文字、単語、文節、句、文など短いものから長いものまである。どれを選択するか、複合して用いるか、など用途と生成される文字列の品質によって調整することができる。

next:学習ブロック入門編 >> Next Session:人工無脳の条件