傀儡師の館.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.13
XML
カテゴリ: ことばの処理
○あなたと私を入れ替える (Python で人工無能)

昨日の日記 で、人称の書き換え用のリストを作って、それにしたがって書き換えをしようかという話を書いた。例によって IDLE を起動 したら、プロンプトで人称用のディクショナリを作ってやる。そうすると、「私」の同義語は、hitodic[’私’] で取れるし、「あなた」の同義語も取れる。


>>> hitodic = { ’私’:[’わたし’,’私’,’わたくし’,’あたし’,’アタシ’,’僕’,’我’,’俺’,’僕’,’あたし’,’アタシ’,’あたい’,’手前’,’朕’,’わらわ’,’オイラ’,’ワテ’,’ワシ’], ’あなた’:[’お前’, ’君’, ’あんた’, ’そち’, ]}


>>> print hitodic[ ’私’ ]
[’わたし’, ’私’, ’わたくし’, ’あたし’, ’アタシ’, ’僕’, ’我’, ’俺’, ’僕’, ’あたし’, ’アタシ’, ’あたい’, ’手前’, ’朕’]

>>> print hitodic[’あなた’]


そうしたら、
で、次に、ロボット的鸚鵡返しの術 (Python で人工無能) で6日に作ったファイルを IDLE の [File]-[Open] で開いてみる。これを元に改造していくことにするのだ。で、開いたらすぐに、[File]-[Save As] で別のファイル名にして保存しておこう。前のは前ので残しておくのだ。

ファイルを読み込んだら、上の hitodic = (以下省略) の1行を >>> をつけずに(プロンプトだから)、ファイルの先頭の方に追加する。そうしたら、もう一度ファイルを保存してから、[Edit]-[Run script] か コントロールキー + F5 キーを押して実行させてみる。そうしたら、リターンを空うちして、バイバイしてしまう。これでプロンプトに戻る。

次に 「私」や「あなた」を書き換えるための関数を用意してみる。やっぱり、今回も対話的に試しながらやってみる。

>>> klist = keitaiso_kaiseki("私は元気です。")
>>> klist

[{’品詞細分類1’: ’代名詞’, ’原形’: ’私’, ’品詞細分類3’: ’*’, ’品詞細分類2’: ’一般’, ’表層形’: ’私’, ’読み’: ’ワタシ’, ’活用型’: ’*’, ’品詞’: ’名詞’, ’発音’: ’ワタシ’, ’活用形’: ’*’}, {’品詞細分類1’: ’係助詞’, ’原形’: ’は’, ’品詞細分類3’: ’*’, ’品詞細分類2’: ’*’, ’表層形’: ’は’, ’読み’: ’ハ’, ’活用型’: ’*’, ’品詞’: ’助詞’, ’発音’: ’ワ’, ’活用形’: ’*’}, {’品詞細分類1’: ’形容動詞語幹’, ’原形’: ’元気’, ’品詞細分類3’: ’*’, ’品詞細分類2’: ’*’, ’表層形’: ’元気’, ’読み’: ’ゲンキ’, ’活用型’: ’*’, ’品詞’: ’名詞’, ’発音’: ’ゲンキ’, ’活用形’: ’*’}, {’品詞細分類1’: ’*’, ’原形’: ’です’, ’品詞細分類3’: ’*’, ’品詞細分類2’: ’*’, ’表層形’: ’です’, ’読み’: ’デス’, ’活用型’: ’基本形’, ’品詞’: ’助動詞’, ’発音’: ’デス’, ’活用形’: ’特殊・デス’}, {’品詞細分類1’: ’句点’, ’原形’: ’。’, ’品詞細分類3’: ’*’, ’品詞細分類2’: ’*’, ’表層形’: ’。’, ’読み’: ’。’, ’活用型’: ’*’, ’品詞’: ’記号’, ’発音’: ’。’, ’活用形’: ’*’}]


# ちゃんと、そのうち読みやすく、結果を出せるようにしよう(^^;;

で、書き換えのマッチングをするのにどれを使うとよいかを考えてみる。
表層形、品詞、品詞細分類1、品詞細分類2、品詞細分類3、活用形、活用型、原形、読み、発音 がとりあえず使えるわけだが、ここでは「原形」を使うことにしよう。

あー、それにしても、「ワタシは元気だ。」を解析すると次のようになってしまう・・・。やっぱり、このあたり学術研究用の辞書の弱さだな。そのうち辞書への登録も扱うことにしよう。「ワタ」「シ」「は」「元気」「だ」と。「ワタシ」が辞書にないのね。で、考えてみると人工無能の場合、学術的正しさは必要ないので、そのうちカタカナの後ろに未知語のカタカナが来ていたら安易につないでしまう処理をどこかに入れるかな。まあ、このあたりは、もっと癖をつかんでからやることにする。


ワタシは元気だ。
ワタ 名詞,一般,*,*,*,*,ワタ,ワタ,ワタ
シ m語,*,*,*,*,*,*,*,*
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
元気 名詞,形容動詞語幹,*,*,*,*,元気,ゲンキ,ゲンキ
だ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ
。 記号,句点,*,*,*,*,。,。,。
EOS


そうしたら、

>>> for in klist:
print k[ ’原形’ ]



元気
です



と、原形が取り出せることを復習する(ちなみに、ワタシでやると、* が出てきてしまうのだ。未知語の場合 * になるのだな。原形を使って文字を書き換えるときに使うとハマるということか。まあいい)。



で、テンポラリにディクショナリを作って、

>>> tempdic = {} # 空の辞書を作る
>>> for k in hitodic: # 辞書の「私」と「あなた」のそれぞれから
  values = hitodic[k] # 値を取り出して(俺、僕...)
  for v in values:
    tempdic[v] = k # 値をキーにして、キーを値にする
>>> tempdic
{’ワシ’: ’私’, ’お前’: ’あなた’, ’そち’: ’あなた’, ’あんた’: ’あなた’, ’わたくし’: ’私’, ’朕’: ’私’, ’あたい’: ’私’, ’私’: ’私’, ’俺’: ’私’, ’手前’: ’私’, ’君’: ’あなた’, ’ワテ’: ’私’, ’わらわ’: ’私’, ’わたし’: ’私’, ’オイラ’: ’私’, ’アタシ’: ’私’, ’あたし’: ’私’, ’我’: ’私’, ’僕’: ’私’}

これで、{{’俺’:’私’, ’僕’:’私’ ...}} の形式に書き換えられたので、tempdic[’俺’] から標準形の「私」がループをまわさなくても取れるようになった。そうしたら、

>>> hitodic = tempdic

として、hitodic に上書きしてしまい、hitodic でアクセスできるようにしておくことにする。しかし、まあ泥縄式と化しているな(^^;; あとで捨てるところなので、とりあえず動けばいいや。

>>> hitodic[ ’あんた’ ]
’あなた’

となる。うーん、どうせなら、「俺」と入れたら「あなた」が返ってくるようにしてしまうかと思ったがやめておく。で、やりたかったのは、「私は元気だ」と入れたら、「あなたは元気だ」としたかったのだな。で、とりあえず、こんな風にしてみよう。

上で、形態素解析の原形を取り出して表示したときに使ったものをちょっと変えてみる。表示する前に書き換えてしまえばいいので、まずはアバウトに、形態素の各要素のうち原形を取り出して、それをキーにして人称用辞書(hitodic) から対応する標準形を引っ張り出す。そして、もしそれが「私」であれば「あなた」に表層形を書き換えて、「私」であれば「あなたに」表記を書き換えてしまう。

for k in klist:
  # 原形を取り出す
  genkei = k[’原形’]
  # 人称辞書から原形をキーにして標準形を取り出す
  hyoujun = hitodic[genkei]
  # 標準形が 「私」なら「あなた」に、
  #「あなた」なら「私」に置き換える。
  if hyoujun == ’私’:
    k[’表層形’] = ’あなた’
  elif hyoujun == ’あなた’:
    k[’表層形’] = ’私’

が、まあ、これはエラーになってしまう。当然のことなのだ。つまり、「私」と「あなた」以外には、標準形を取り出すことができないので、それ以外のものについては、hitodic を引いたときに失敗してしまうのだ。


Traceback (most recent call last):
 File "", line 5, in ?
  hyoujun = hitodic[genkei]
KeyError: は
>>>


KeyError: は というところに注目なのだ。ちゃんとエラーがでたときには、5行目で(line 5) 「は」はキーエラーですよと教えてくれている。

そこで、こうしてみればよく分かるだろう。

>>> hitodic[’は’]

Traceback (most recent call last):
File "", line 1, in ?
hitodic[’は’]
KeyError: は


登録してあるものしか、取り出せないなんて不便とえいば不便なのだ。しょうがないので、まず、ディクショナリを引いてみて、失敗したらやめておこうといういい加減な方法をとってみよう。

>>> for k in klist:
   # 原形を取り出す
   genkei = k[’原形’]
   # 人称辞書から原形をキーにして標準形を取り出す
   # 試してだめならからの"" を入れてやる
   try:
     hyoujun = hitodic[genkei]
   except: # エラーで標準形がとれなかったので空にする
     hyoujun = ’’
   # 標準形が 「私」なら「あなた」に、
   #「あなた」なら「私」に置き換える。
   if hyoujun == ’私’:
     k[’表層形’] = ’あなた’
   elif hyoujun == ’あたな’:
     k[’表層形’] = ’私’

>>> for k in klist:
    print k[’表層形’]


あなた

元気
です



これでめでたく、「私は元気だ。」を「あなたは元気だ。」に書き換えることができた。同じようにすれば「お前は元気だ。」と入れれば、「私は元気だ。」となる。


今日はここまで。ちなみに途中で色をつけるのが面倒になってしまったので途中から色がない(^^;; 色をつけるためのスクリプトでも作んないとだめかな・・・。今回もやっぱり、カットアンドペーストじゃ動かせなくて、全角と半角を直さないと動かんし。この辺は、そのうちなんとかしよう。インデントがおかしくなってしまったりするのが一番痛いのだな。python ではインデントが意味を持つから、これが狂うとエラーになっちゃうのだ。グスン。全角半角をちゃんと直して、そのまま動かなかったら、インデントが狂っているせいなので、それを直してください。そんな…





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

Last updated  2006.09.15 22:48:38
コメントを書く


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

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