ちょっとしたAIを作ってみたいと思う
キャラクター設定は、
- ガジェットが大好きな女子高生
- 特にAnker製品を好む
- 製品の箱は綺麗にとっておくタイプ
- 最新のプレスリリースを漁るのが得意
名前の由来は、
ガジェット→Gadget→God's Jet→神の噴出→上野ふき
まぁこんな感じで。
最終目標は、ガジェットのプレスリリースを読んで、語彙力や学習内容にしたがってオリジナルのコメントや知識を引き出してくれるものを作りたいと思っている。
素人の自分に何ができるのか、
とりあえず始めたのは、語彙の辞書と製品情報の辞書の二つをコントロールするプログラムを作ること!
用意するファイル
同一ディレクトリ内に、
- ai.py(メインの実行ファイル)
- brain.py("ふき"の頭脳となるプログラム集)
- product_dic.dat(製品情報格納庫としてのバイナリデータ)
- brain_words.dat(彼女の語彙力バイナリデータ。)
- backupフォルダ(ここに語彙、製品情報の変更があった場合に1日単位でバックアップ)
メインの「ai.py」
ai.pyでは、必要最小限なコードでやりたいことをスッキリ書きたいと思う。
バカなので、煩雑なコードになればなるほどわけわからなくなり、思考がストップしてしまう。
初心者ゆえ、classの書き方や引き出し方にありえない間違いを犯している可能性もあるので許してほしい。
# ai.py
from brain import Brain #オリジナルのbrain.py
text='''
読ませたい記事の文章をここに。自分のプログラムでは、とりあえずサンプルの記事を置いていますが、最終的にプレスリリースサイトをスクレイピングさせて完成させたい。
'''
b=Brain(text)
# b.add_brain()#語彙の追加
# b.check()#語彙からの文章参照チェックリスト
# b.maintenance()#語彙のメンテナンス
# b.add_profile()#製品情報の要素追加
# b.add_product()#製品追加
# b.product_list()#登録製品リスト
このように、それぞれの機能を試したいときに#を外すだけの状態に持ってきています。
ふきちゃんの頭脳、「brain.py」
import re
import pickle
import time
import datetime
# 文章を単文と単語に分けるルールづくり。これが悩ましい。
split_list1= '、|。|\n|また|ほか|として|を追加'
split_list2='×1|な|する|いう|も|が|を|に|へ|と|より|から|で|や|の|は|、|。|!|?|!|「|」|(|)|\n|した|など|ほか|させた'
class Brain():
def __init__(self, text):
self.text = text
def sentence(self):
#単文の場合、split_list1を使う
keywords=re.split(split_list1,self.text)
for absent in range(keywords.count('')):
keywords.remove('')#空白を切り捨て!
for short in keywords:
if len(short) < 2:#短いものは切り捨て!
keywords.remove(short)
else:
pass
return keywords
#語彙力強化のための単語抽出
def words(self):
keywords=re.split(split_list2,self.text)
for absent in range(keywords.count('')):
keywords.remove('')
for short in keywords:
if len(short) < 2:
keywords.remove(short)
else:
pass
return keywords
#知らない単語を覚えさせるプログラム
def add_brain(self):
keywords_list=self.words()
for key in keywords_list:
print(key)
#語彙リストを開いて照合
r=open('./brain_words.dat','rb')
vo=pickle.load(r)
r.close()
if key in vo:
print('この単語は知っているよ!')
else:
ask=input('ボキャブラリーに加えますか?(y or end):')
if ask=="y":
r=open('./brain_words.dat','rb')
vo=pickle.load(r)
r.close()
vo.append(key)#語彙に単語を追加
w=open('./brain_words.dat','wb')
pickle.dump(vo,w)#語彙を上書き
w.close()
#バックアップファイルの作成
r=open('./brain_words.dat','rb')
vo=pickle.load(r)
r.close()
a=open('./backup/brain_words_%s.dat' % datetime.date.today(),'ab')
pickle.dump(vo,a)
a.close()
elif ask=="end":
break
else:
pass
#語彙と抽出文の照合。語彙力があればあるほど、文章解析能力が高まる。
def check(self):
sentence_list=self.sentence()
brain_words_r=pickle.load(open('./brain_words.dat','rb'))
for word in brain_words_r:
for i in range(len(sentence_list)):
try:
sentence_list[i].index(word)
print('【%s】:%s' % ( word,sentence_list[i]))
except:
pass
#語彙のメンテナンス(主に消去)いらない語彙を追加してしまった場合、記憶から消しさる
def maintenance(self):
brain_words_r=pickle.load(open('./brain_words.dat','rb'))
while True:
print(brain_words_r)
erase_word= input('消去する単語を入力してください:')
if erase_word=="end":
break
else:
try:
brain_words_r.remove(erase_word)
f=open('./brain_words.dat','wb')
pickle.dump(brain_words_r,f)
f.close()
except:
pass
'''------------------ここから製品情報----------------------'''
def add_product(self):
#辞書を引き出して表示
pd_r=open('./product_dic.dat','rb')
product_dic=pickle.load(pd_r)
pd_r.close()
#空のフレームを取り出す
pd_r=open('./product_dic.dat','rb')
new_product=pickle.load(pd_r)[0]
pd_r.close()
print(new_product)
time.sleep(0.5)
while True:
yn=input('製品を追加しますか?(y)')
if yn=="y":
keys=list(new_product.keys())
#全ての要素に対して入力
name=input('製品名を入力:')
i=0
product_num=[]#ここに追加された番号の製品しか削除できない
for item in product_dic:
if name==item['製品名']:
print('No.%s:%sはすでに登録してあります。' % (i,name))
product_num.append(i)#重複した製品の番号をリストに追加
i+=1
flag='exist'
else:
i+=1
flag='noexist'
pass
if flag=='exist':#すでに製品が登録されている場合
#製品リストを抽出
pd_r=open('./product_dic.dat','rb')
product_dic=pickle.load(pd_r)
pd_r.close()
try:
delete=int(input('製品を削除しますか?:No.'))
if delete in product_num:#入力内容が重複リスト番号に一致するか
del product_dic[int(delete)]
print('削除しています...')
#製品リストを開いて、上書き更新
pd_w=open('./product_dic.dat','wb')
pickle.dump(product_dic,pd_w)
pd_w.close()
print('削除しました。')
#バックアップファイルの作成
r=open('./product_dic.dat','rb')
pd=pickle.load(r)
r.close()
a=open('./backup/product_dic_%s.dat' % datetime.date.today(),'ab')
pickle.dump(pd,a)
a.close()
else:
print('削除できませんでした。')
except:
pass
else:
new_product['製品名']=name
for key in keys:
if key=="製品名":
pass
else:
new_product[key]=input('%sを入力:' % key)
#製品リストを抽出
pd_r=open('./product_dic.dat','rb')
product_dic=pickle.load(pd_r)
pd_r.close()
#リストに新しいのを追加
product_dic.append(new_product)
#製品リストを開いて、更新
pd_w=open('./product_dic.dat','wb')
pickle.dump(product_dic,pd_w)
pd_w.close()
#バックアップファイルの作成
r=open('./product_dic.dat','rb')
pd=pickle.load(r)
r.close()
a=open('./backup/product_dic_%s.dat' % datetime.date.today(),'ab')
pickle.dump(pd,a)
a.close()
else:#追加しますか?のelse
break
#製品リスト
def product_list(self):
pd_r=open('./product_dic.dat','rb')
product_dic=pickle.load(pd_r)
pd_r.close()
print(product_dic[0])
print('-'*40)
for item in product_dic:
print('製品名:%s' % item['製品名'])
'''------------------ここから製品情報の要素----------------------'''
def add_profile(self):
pd_r=open('./product_dic.dat','rb')
pd_sample=pickle.load(pd_r)[0]
pd_r.close()
print(pd_sample)
while True:
yn=input('製品情報の要素を追加しますか?(y/n)')
if yn=="y":
#要素を追加
pd_r=open('./product_dic.dat','rb')
product_list=pickle.load(pd_r)
add_profile={input('追加する要素名:'):''}
#製品リストの全てに新要素を追加
for item in product_list:
item.update(add_profile)
print(product_list)
#要素情報を上書き
pd_w=open('./product_dic.dat','wb')
pickle.dump(product_list,pd_w)
pd_w.close()
else:
break
また追って、報告します!とりあえずこれで遊んでみてください!
(遊ぶ要素ねえええ)