傀儡師の館.Python

傀儡師の館.Python

PR

×

Calendar

Keyword Search

▼キーワード検索

Archives

2026.07
2026.06
2026.05
2026.04
2026.03
2026.02
2026.01
2025.12
2025.11
2025.10

Profile

kugutsushi

kugutsushi

Free Space

設定されていません。
2003.03.05
XML
カテゴリ: ことばの処理
ジャガイモを電子レンジで調理して食べた(それだけってことは、さすがにない(笑))。サツマイモもそうだけど、一番弱くしておいて、時間をかけて調理するのがコツ。その方がおいしく仕上がるのだ。

○ 再び ZODB に挑戦 (Python で人工無能)

先日 ZODB でサンプルが古いから動かんと書いたけれども、何か勘違いして、やり損なっただけみたいなので、やり直し。で、ZODB に単語の「見出し」と「読み」を登録する簡単なプログラムを作ってみた。この程度だと、あんまり ZODB の良さが分からんかもしれないなーと思いつつ(笑)。

データベースに接続したりとかするところは、RDBMS とか使っていても同じようなもので、いったん接続用のリソースを確保しておいて、それを使ってデータベースにアクセスするというところでは変わらないのといえば変わらないが、いったん接続してしまったあとは、通常の python のディクショナリ形式のデータにアクセスするのと同じようにデータにアクセスできるので、もうちょっと手の込んだものをやってみるとメリットが明確になるかな。でも、単語(word) オブジェクトをそのままデータベースにぶち込んでいるところに注意なのだ。これができるから便利なの。

で、とりあえずソースはこんな感じ。 ZODB for Python Programmer を参考に、これをもっと単純にした感じ。

起動すると、「一覧表示(’L’)、単語追加(’A’)、終了(’Q’): 」こういうメニューが表示されて、それぞれの機能を実行できる。単語の追加は、見出しと読みを入力するだけ。



# いろいろ読み込む(笑)

from ZODB import DB
from ZODB.FileStorage import FileStorage


# こいつは、ZODB をインストールすると一緒にインストールされているのだ。

from Persistence import Persistent

# Persintent クラスを継承した Word クラスを宣言

class Word(Persistent):
  """A word"""
  def __init__(self, midashi, yomi):
    self.midashi = midashi
    self.yomi = yomi

# データベースを設定
# 最初に words.fs というファイル名の格納場所を用意する。
# ファイル words.fs を使ったストレージ(格納場所)を使って
# データベースとしてアクセスすることにする。
# 通常のファイルじゃなくて、BSDDB とか使う場合は、ここが
# 変わることになる。

storage=FileStorage("words.fs")

# このストレージを初期値として ZODB データベースオブジェクトを
# 作成する。

db=DB(storage)

# DB を開いて、接続用の変数に代入する(接続オブジェクトを作る)

connection=db.open()

# ZODB の接続オブジェクトの root メソッドを使って、
# データベースのルートを開く。ちょうど、Unix の / や
# Windows の C:\ のディレクトリ/フォルダを開いた状態と
# 考えてみることにしよう。

root=connection.root()

# root に words というキーがなかったら、words というキーで
# root 上に 空のディクショナリを作ってやる。

if not root.has_key("words"):


# root から words をキーとして値を取り出す。
# 2度目からは、ちゃんとこれで前に保存してあったものが
# 読み込まれることになる。

words=root["words"]

# 一覧表示用の関数の定義

def listWords():
  """ 登録単語の一覧を表示する """
  if len(words.values())==0:
    print "登録された単語がありません。"

    return

  for word in words.values():
    print "見出し: %s" % word.midashi
    print "読み: %s" % word.yomi
    print

def addWord(midashi, yomi):
  """ 単語を新規登録する """

  # words ディクショナリ中に、この見出しがすでに登録
  # されていたら、登録済みのメッセージを表示する。

  if words.has_key(midashi):
    print "この単語は登録済みです。"
    return
  else:

    # 未登録であれば、この単語を見出しをキーにして
    # words ディクショナリに追加する。

    words[midashi]=Word(midashi, yomi)

  # words に再登録して更新する。

   root[’words’] = words

  # このトランザクションをコミットする。
  get_transaction().commit()

  print "単語 %s が追加されました." % midashi
  print

if _name_=="_main_":
  while 1:
    choice=raw_input("一覧表示(’L’)、単語追加(’A’)、終了(’Q’): ")
    choice=choice.lower()
    if choice=="l":
      listWords()
    elif choice=="a":
      midashi=raw_input("見出し:")
      yomi=raw_input("読み:")
      addWord(midashi, yomi)
    elif choice=="q":
      break


  # データベースを閉じる

  connection.close()


で、実行するとこんな感じ。

一覧表示(’L’)、単語追加(’A’)、終了(’Q’): A
見出し:人工無能
読み:じんこうむのう
単語 人工無能 が追加されました.

一覧表示(’L’)、単語追加(’A’)、終了(’Q’): L
見出し: 人工無能
読み: じんこうむのう

一覧表示(’L’)、単語追加(’A’)、終了(’Q’): A
見出し:形態素解析
読み:けいたいそかいせき
単語 形態素解析 が追加されました.

一覧表示(’L’)、単語追加(’A’)、終了(’Q’): L
見出し: 形態素解析
読み: けいたいそかいせき

見出し: 人工無能
読み: じんこうむのう


これで ZODB も使えるようになったので、また、ipadic をぶち込んでみるかな。これはかなり時間がかかるだろうな。インデックスも作ってあげないと見出しの検索しかできなくておもしろくないか。インデックスを作ったら、かなりデータサイズが大きくなるだろうし、さらに時間がかかりそう。うーん。まあ、これは遅くてかまわないので、どの程度、どんなことになるかとりあえずやってみるかな。





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

Last updated  2006.09.12 20:07:26
コメント(0) | コメントを書く


■コメント

お名前
タイトル
メッセージ
画像認証
上の画像で表示されている数字を入力して下さい。


利用規約 に同意してコメントを
※コメントに関するよくある質問は、 こちら をご確認ください。


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

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