傀儡師の館.Python

傀儡師の館.Python

PR

×

Calendar

Keyword Search

▼キーワード検索

Archives

2026.05
2026.04
2026.03
2026.02
2026.01
2025.12
2025.11
2025.10
2025.09
2025.08

Profile

kugutsushi

kugutsushi

Free Space

設定されていません。
2003.01.06
XML
カテゴリ: ことばの処理
新年早々、日本語の形態素解析器 MeCab (和布蕪) がバージョンアップされていた(2002/01/03)。新しいバージョンでは、 Darts: Double-ARray Trie System というやつに対応してるらしい。おや Windows のバイナリも すでに新しいのが公開されている。

ちなみに、MeCab の祖先は、 CaSen (茶筌) 。ChaSen の祖先は、 JUMAN 。もともと MeCab を作っている工藤氏は京都大学の言語メディア研(旧長尾研)で JUMAN の開発していた人なのだな。だから、JUMAN も ChaSen もその短所と長所をよく理解してさらに独自路線で MeCab を作ったということかな。祖先をたどると面白い。

で、 JUMAN 3.0 と 茶筌 との関係について 眺めてみると、京都大学長尾研究室の JUMAN からどういう経緯で、奈良先端大松本研究室の ChaSen が派生したかが分かるようだ。それから、JUMAN の品詞体系は益岡体系で、ChaSen はIPA 体系ならしい。で、このあたりの話は、MeCab のメーリングリストで知ったのだが、MeCab のページからメーリングリストの記述が消えているな・・・。まあいいや。で、MeCab は品詞体系に依存しない汎用形態素解析器を目指しているらしく、増岡品詞体系(JUMANがこれ) の辞書も使えるようにと開発しているようだ。MeCab や ChaSen は IPA品詞体系 というやつのようだ。ChaSen は unidic というのを将来使うようになるみたいだ。まあ、そのへんはほっておいて、人工無能でできるだけ簡単な処理を使用としたら、益岡品詞体系の方が IPA品詞体系より直感的にやりやすそうな感じがする。益岡品詞体系 や IPA品詞体系は、Google へ直行。でも、とりあえずいいや(^^;;



MeCab のメーリングリストで「単純なカナ漢字変換プログラムを作ってみましたって」流れてきたので、これにヒントを得て、ちょっとロボット的おみくじ付き鸚鵡返しの術を使ってみることにした。

やり取りは、こんな具合になる。ちょっと人工無能っぽくなってきたのだ。単なる鸚鵡返しとおみくじ的ランダム返答を組み合わせるだけでも、MeCab のおかげで、やけに賢く見えるではないか(笑)。

あなたの名前は? 傀儡師

傀儡師 > 今日は寂しいよ。

「キョー ワ サビシイ ヨ 。」 なんて、間抜け だね。

傀儡師 > 今日は元気だよ。

「キョー ワ ゲンキ ダ ヨ 。」 なんて、幸せ だね。

傀儡師 > 今日は笑える。
「キョー ワ ワラエル 。」 なんて、純粋 だね。

で、今回のプログラムリストは、次のような感じ。ちょっと長くなってきてしまった。でも、今までのを日記を全部読み返すと、理解できるはずなんで、今回は説明省略。何せ、色をつけるのが面倒なので疲れた(^^;;


#!/usr/bin/env python 

import sys


def raw_input (prompt=’’): 
  """プロンプトを表示して、入力を得て、末尾の1文字(改行)を削除して返す。 
     @prompt 入力を促すためのプロンプト文字列 
  """
  sys.stdout.write(prompt) 
  return sys.stdin.readline()[:-1] 
def keitaiso_kaiseki
  """MeCab で形態素解析した結果を返す。 
     解析結果は、形態素ごとにディクショナリ形式で格納したリスト。 
     @s 解析する文字列 
  """ 


  from popen2 import popen2 
  fi, fo = popen2( ’"c:¥¥program files¥¥mecab¥¥bin¥¥mecab"’ ) 
  fo.write(s) 
  fo.close() 
  klist = fi.read() 
  fi.close() 
  sentence = [] 
  for gyou in klist.split( ’¥n’ ): 
    keitaiso = gyou.split( ’¥t’ ) 
    dic = {} 
    if len(keitaiso) == 2: 
      dic[ ’表層形’ ]= keitaiso[0] 
      n = keitaiso[1].split(’,’)  
      dic[ ’品詞’ ]=n[0] 
      dic[ ’品詞細分類1’ ]=n[1] 
      dic[ ’品詞細分類2’ ]=n[2] 
      dic[ ’品詞細分類3’ ]=n[3] 
      dic[ ’活用形’ ]=n[4] 
      dic[ ’活用型’ ]=n[5] 
      dic[ ’原形’ ]=n[6] 
      dic[ ’読み’ ]=n[7] 
      dic[ ’発音’ ]=n[8] 
      sentence.append(dic) 
  return sentence 

def get_hatsuon (klist): 
  """形態素解析結果から「発音」を取得し文字列として返す。 

      getHatsuon を klist の各要素に適用し、 
      「発音」を取得して、1つの文字列に結合して返す。 
      @klist 形態素解析結果リスト 
  """ 
# 各形態素の情報から「発音」を取り出してリストにする
  hatsuon_list = map(getHatsuon, klist) 

# 発音リストの要素をスペースを間にいれてつなげる
  return " ".join(hatsuon_list) 

def getHatsuon (kinfo): 
  """形態素解析情報から「発音」を取り出して返す。 

     @kinfo 形態素解析の結果 
  """ 
  return kinfo[ ’発音’ ] 

def get_random_answer (rlist): 
  "リストの中からランダムに一つ選択して返す。" 
  return whrandom.choice(rlist)  

# メインのプログラムとして読み込まれたときには以下を実行 
if __name__ == ’__main__’: 
# ランダム回答用のリスト 
  # この中から、ランダムに後で人工無能が選択して答える。 
  # おみくじと同じ。

  random_list =[ ’平和’, ’幸せ’, ’平凡’, ’悲壮’, ’不幸’, ’純粋’, ’間抜け’ ] 

# 名前を入力させてプロンプトにする。
  name = raw_input(’あなたの名前は? ’) 
  prompt = name + ’ > ’ 


# 繰り返しに入る
  while 1: 
    answer=raw_input(prompt) 
# リターンだけなら終了
    if not answer: 
      break 
    else: 
# 入力を形態素解析する
      klist = keitaiso_kaiseki(answer) 
# ロボット返答用の発音を取得する
      robot_answer = get_hatsuon(klist) 
# おみくじ的返答をランダムに発生させる。
      random_anser = get_random_answer(random_list) 
      print "¥n「%s」 なんて、%s だね。¥n" % (robot_answer, random_anser) 
# 終わりだよん
  print "バイバイ" 






お気に入りの記事を「いいね!」で応援しよう

Last updated  2006.09.13 06:31:52
コメント(0) | コメントを書く


【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x
X

© Rakuten Group, Inc.
X
Design a Mobile Site
スマートフォン版を閲覧 | PC版を閲覧
Share by: