忍者ブログ
盛大な独り言日記・自分用メモ2010.11.17~
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

1つのファイルで入力→訓練→分類→表示をするものが出来たので、今度はファイルを複数に分割してみることにしました。
あと入力文をソースに直接書いてたので、ここでコマンドライン引数→分かち書きにするのも入れときました。

できたもの
・入力文を分かち書きのリストに変換するプログラム①
・ベイズ分類の関数宣言と、訓練を行うプログラム②
・①からリストを持ってきて、②から関数と訓練した結果(?)を借りて入力文の分類を行うプログラム③(メイン)
・回答集のテキストファイル⑤

前の自分の記事読み直したけど、訓練の意味をまた間違えていたようです。
参考にしたソースを読んだときに勘違いしたのですが、訓練=適当な言葉でベイズ分類する
というわけでは無い…ですよね。たぶん。入力文の単語とかすってなければ意味無さそうだし。たぶん。

ベイズ分類機の訓練部分(train)でやっているのは、
1:⑤の回答集をリスト化、各行1項目目をカテゴリにする×行数分
2:辞書の初期化?
3:回答集のデータから、カテゴリの数と単語の数を取得、ボキャブラリ集合の作成
4:カテゴリ内の形態素の行数(数)+単語の種類の総数の計算(分類の際の計算に使う)

でこれは、入力文によらず決まっている作業なので、事前に全部やってデータを保管しておけば
実際に分類をするときにいちいちこの作業をしなくて済む……みたいです。
それでプログラムを分けてみたのですが、今のところは分類プログラムが訓練プログラムの関数を呼び出しているので、結局は毎回の分類の直前に訓練してから→分類という流れになってしまいプログラムが1つの時とやっている事は変わりません。
訓練部分でやった作業の成果をテキストファイルとかに書きこんで、それを分類部分で読み込み→リスト化して使用、とかだと最初に訓練するだけで何度でもお手軽に分類できるのかな。
しかしこれがまためんどくさそうです…。ややこしいっていうか、回答文集のファイル作るのとはまたわけが違うっていうか。しかも今の段階でも、前の(最初の)プログラムに比べたら待ち時間がかなり短くなったので、無理して事前作業にさせなくてもいいかな…と思ってしまいます。うーん
とりあえず伺かで動いてくれないとな…
PR
2次元配列ツクレター\(^o^)/

readlineで一行ずつ取り出して、タブ区切りの配列を作ったら
適当な配列を用意して、その配列に順次appendを使って項目を追加していけばよかったぽい

list=[] #配列は使う前に定義しておかないと怒られる

f=codecs.open('text.txt','r','utf-8')  #日本語テキストファイルがうまい事読めるcodecs.open
x=f.reand()
y=x.split('\n') #テキストファイルの行数を取得するのに使うだけ

for i in range(len(y)):    #一行ごとの処理を、行数文繰り返す
line = f.readline()
words = line.split('\t')  #タブ区切りのリストを生成
list.append(words)     #タブ区切りリストをlistの要素に追加する。
f.close()

みたいなかんじ。
これで例えばprint list[1][0]とかすると、元のファイルの2行目の最初の項目が表示される。

実際には先にreadをしてからreadlineをすると、なぜか空白ばっかり返されたりするので
一回行数(yまで)を取得したら、ファイル閉じてまた開き直したりしてました。二度手間…

配列とりあえず作れたのはいいけど、これだけのせいでかなり時間食ったのがくやしい。。
まだまだこれからなんだよ!何もできちゃいないんだよ…
テキストファイルに

>説明文(タブ)キーワード(タブ)キーワード(タブ)キーワード(タブ)……(改行)

>説明文(タブ)キーワード(タブ)キーワード(タブ)キーワード(タブ)……(改行)

みたいにデータを並べたとき、

txt.split('\n')で改行ごとに1要素のリストができて、
txt.split('\t')でタブごとに1要素のリストが出来る。

タブごとに何行分もの要素を持ったリスト1個を作成してから
適当な記号が出てくるたびにリストを分割する感じでリストをたくさん作りたいんだけどなんかうまくいかない。
for文の中でlist[i]=txt.split('\t')とかやると怒られる。うーん…?
動作が遅いのはやっぱりいちいちトレーニングファイル開いたり閉じたりしてたからかもしれない。
というかトレーニングの使い方が間違っていたぽい…

訓練(トレーニング)はあくまで訓練なので、ここで本番のテキストの分類を行うのではない!
今までのプログラムは普通にトレーニング要素に入力文と回答集をぶち込んでました。
そうじゃなくて、
トレーニング→適当な言葉や文で事前にやっておく、
テスト→本番、ヘルプ質問文の分類をする。

トレーニングではあらかじめ学習をさせておいて、DB化しておく
なのでDB作るプログラムと、それを利用して入出力を受け付けるプログラムの最低2つが必要になる?

で今、今までとは別のサンプルを探しだしてきていろいろいじってみました。

テキストはPC関連の使い方解説サイトから取り出して、改行分かち書きしたものをトレーニングデータとしてテキストファイルに保存。
3つほどカテゴリを用意して試してみたら、3つのどれに含まれるか、の判断はそこそこうまくいってました。
今はテキストファイル→まるごとpythonのリストにあてはめているのですが、
カテゴリに直接回答文を持ってくる場合だと、この方法では大量のテキストファイルが必要になってしまいます…。
テキストファイル内に見出し記号を作って、それが現れるごとに新しいリストを生成するとか、そういう方法で行きたいんだけどうまくいくかな…

いかめも:
テスト(訓練ではなく実際にカテゴリ求める)のときの入力文は、そのまま入れると最初のカテゴリにはめられてしまう。
トレーニングデータが形態素分かち書きなので、合わせて入力文も形態素分かち書き→リスト化したもので調べるようにする。

×(u'壁紙の設定方法は?')→◎(u'壁紙',u'の',u'設定',u'方法',u'は',u'?')
精度はともかくとして、
・無駄に反応が遅い
・日本語の正規表現が????

入力された質問文に「何」って含まれていたら、意味を問う質問だと判断して
他のファイルで解析をせずに優先的に意味用の辞書に持って行きたいのですが。。
入力文字列に”何”という文字が含まれているかどうか、の判断部分がうまく書けない。

ベイジアンフィルタとかは見よう見まねで書いてちゃんと動いてるのにこんな簡単な検索が出来ない。うーん
[1]  [2]  [3]  [4]  [5]  [6]  [7
プロフィール
 たごさく(@Ta56)
カレンダー
04 2025/05 06
S M T W T F S
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
最新CM
最新記事
最新TB
バーコード
ブログ内検索
最古記事
Admin / Write
忍者ブログ [PR]