knaka Tech-Blog

AI, IoT, DIYエレクトロニクス, データサイエンスについて投稿予定です。

入力文章から、俳句 短歌を抽出する。WEB画面の追加 自然言語処理(8)

index:

概要

前の、 自然言語処理 で TF-IDF 関係となりますが、
俳句、短歌を機械学習させて、入力文章と、
類似文章を抽出する。web画面の作成となります。

・ 画面は、前回と同じ Bot UIライブラリを
使用しています。

f:id:knaka0209:20190317113548p:plain

環境

python 3.5.2
janome
sklearn
flask

コード

python3 です。

github.com

データセット

俳句の文章は、NHKさんのページを
参考させて頂きました。

http://www.n-gaku.jp/taikai/tanka/h30/index.html

・PDFのテキストを、エディタにコピーし
 excelに、入力して。CSV形式にして保存

処理など

train.py
pandas で、CSV読み込み、
TfidfVectorizer で、学習、pickle で、保存して
flaskr/files/ に、配置

#
csv_data = pd.read_csv("flaskr/files/bun_data.csv" ,encoding="SHIFT-JIS" )
#print(csv_data.head() )

tokens=[]
for item in csv_data["bun"]:
    #print(item)
    token=get_token(item)
    tokens.append(token)
#print(len(csv_data.columns) )
#print(tokens )
#quit()

#print(tokens )
#quit()
docs = np.array(tokens)

vectorizer = TfidfVectorizer(use_idf=True, token_pattern=u'(?u)\\b\\w+\\b')
print(tokens)
#quit()
vecs = vectorizer.fit_transform(docs )
print("#vecs :")
print(vecs.shape )
##print(vecs[0] )

#save
file_name="params.pkl"
with open(file_name, 'wb') as f:
    pickle.dump(vectorizer, f)
print("#save vectorizer OK!")


views.py
入力文章を、評価して。
類似文章を抽出して、画面に出力

#
@app.route('/test3', methods=['GET', 'POST'])
def test3():
    print("#test3")
    ret="sorry, nothing response."
    if(len(request.form ) > 0):
        text=request.form['intext']
        print("text=",text ,"len=", len(text) )
        if(len(text) >0):
            ret=vect.predict(text )
        print  (ret)
    return ret

TF-IDFで sklearn.feature_extraction.text.TfidfVectorizer の結果を保存する。 自然言語処理(7)

index:

概要

前の、 自然言語処理関係となりますが、
TF-IDFで、学習済みの TfidfVectorizer を保存して、
評価時に、読込むテストしてみました。

環境

python 3.5.2
janome
sklearn

コード

github.com

python3 です。

train.py
fit_transform 後に、pickleで、dump 保存します。

vectorizer = TfidfVectorizer(use_idf=True, token_pattern=u'(?u)\\b\\w+\\b')
print(tokens)
#quit()
vecs = vectorizer.fit_transform(docs )
print("#vecs :")
print(vecs.shape )
##print(vecs[0] )

#save
file_name="params.pkl"
with open(file_name, 'wb') as f:
    pickle.dump(vectorizer, f)
print("#save vectorizer OK!")


・評価
pickle.load で、読み込み。
評価
transform で、ベクトル化
Cosine類似度 の出力

file_name="params.pkl"
vectorizer =None
with open(file_name, 'rb') as f:
    vectorizer = pickle.load(f)
print("load vectorizer OK!!")

#
vecs= vectorizer.transform( docs )

#print(tokens)
#str="利用人数は?"
#str="契約期間"
str="価格は?"

instr = get_token(str ).strip()
print("instr=", instr )
x= vectorizer.transform( [  instr ])

#print( "x=",x)
#Cosine類似度(cosine_similarity)の算出
num_sim=cosine_similarity(x , vecs)
print(num_sim )
index = np.argmax( num_sim )

print("word=", words[index])

・評価の、結果
=>類似文章が、出力できました。

 >python  pred.py
load vectorizer OK!!
instr= 価格 は ?
[[ 0.12541425  0.12972001  0.          0.14071807  0.52054432]]
word= 製品価格、値段はいくらですか?

関連のページ

knaka0209.hatenablog.com

Codeigniter 初級編、フォーム追加など。 #php #web

index:

概要:
Codeigniter3 php 軽量フレームワークの導入編的な内容となります。

環境とか

CodeIgniter-3.1.10
php 5.6
mysql

追加手順

https://codeigniter.com/
の、download おす。
zip取得、解凍する

apche の場合は、htdocs 下に設置

application/
下に、ユーザーコードを配置するようです。

・DB設定
事前に、mysql DB/table を作成しておく。

config/database.php

username、password、database
 を、任意に設定。

$db['default'] = array(
	'dsn'	=> '',
	'hostname' => 'localhost',
	'username' => 'user123',
	'password' => 'pass123',
	'database' => 'db123',
	'dbdriver' => 'mysqli',
	'dbprefix' => '',
	'pconnect' => FALSE,
	'db_debug' => (ENVIRONMENT !== 'production'),
	'cache_on' => FALSE,
	'cachedir' => '',
	'char_set' => 'utf8',
	'dbcollat' => 'utf8_general_ci',
	'swap_pre' => '',
	'encrypt' => FALSE,
	'compress' => FALSE,
	'stricton' => FALSE,
	'failover' => array(),
	'save_queries' => TRUE
);

ルーティング

準備ですが、
ルーティング設定に必用.htaccess
が、含まれてなかったので。下記を追加して配置
しておきます。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

フォーム追加

参考:
https://codeigniter.com/user_guide/tutorial/news_section.html

https://codeigniter.com/user_guide/tutorial/create_news_items.html


・リスト
コントローラ:
controllers/news.php
https://github.com/kuc-arc-f/codeig/blob/master/application/controllers/news.php


f:id:knaka0209:20190313150146p:plain

・追加、画面
views/news/create.php
https://github.com/kuc-arc-f/codeig/tree/master/application/views/news

f:id:knaka0209:20190313150336p:plain

・ルーティング追加
config/routes.php

$route['news/edit/(:any)'] = 'news/edit/$1';
$route['news/create'] = 'news/create';
$route['news/(:any)'] = 'news/view/$1';
$route['news'] = 'news';


・URLは、下記で開けました。(ローカルの場合です。 )

http://127.0.0.1/プロジェクト名/news/

下記でも、開きました、
http://127.0.0.1/プロジェクト名/index.php/news/

参考の設定 例など

php5.6 です。
github.com

flask+ TF-IDF で、AIチャットボットをweb画面で作成する。自然言語処理(6)

index:

概要

以前の、slackチャット対応のAI チャットボット機能の
関連となります。web画面 UIを自作して、
自然言語処理webサービスを使用する例となります。

UI面は、BotUI のJSライブラリを使用しています。

環境

python 3.5.2
flask
janome
sklearn

コード

github.com

python3 です。

自然言語処理は、
前回と、ほぼ同じです。

web画面

デモの、操作画面となります。

f:id:knaka0209:20190301174106p:plain

処理など

Vue.js の変数(二重括弧)は、
flaskの レンダリング処理で、正常に動作しない為。
V ディレクティブ等を使用しています。

<html>
<head>
  <link href="{{ url_for('static', filename='botui/build/botui.min.css') }}"  rel="stylesheet">
  <link href="{{ url_for('static', filename='botui/build/botui-theme-default.css') }}"  rel="stylesheet">  
  <script src="https://cdn.jsdelivr.net/vue/latest/vue.min.js"></script>
  <script src="https://unpkg.com/botui/build/botui.min.js"></script>
  <script src="{{ url_for('static', filename='axios.min.js') }}?A2"></script>

</head>
<body>
<h1>Bot UI test:</h1>

<div class="botui-app-container" id="botui-app" style="height :400px;">
  <bot-ui></bot-ui>
</div>
<!-- form -->
<center>
  <div id="app">
    <!--
    msg :<span v-text="message"></span>
    -->
    入力:
    <input size="30" name="intext" v-model="message" />
    <button @click="addItem">質問する</button>
  </div>  
</center>

<br />
</body>
<script>
//console.log("#then-aaa");
  var botui = new BotUI('botui-app') // id of container
  //
  new Vue({
    el: '#app',
    data: {
      message: '',
    },
    created:function(){
       console.log("#create-1122");
    },
    methods: {
      update() {
        this.message = 'Vue.js';
      },
      addItem() {
        console.log(this.message );
        //
        botui.message.add({
          human: true,
          content: this.message
        });
        //
        var params = new URLSearchParams();
        params.append('intext', this.message );
        axios.post('./test3', params)
        .then(response =>{
            console.log(response.data );
            //
            botui.message.add({
              content: response.data
            });
        });
        this.message='';
      },
    }
  });

</script>
<script src="{{ url_for('static', filename='app_chat.js') }}?B1"></script>
<!--
-->
</html>


参考のページ

knaka0209.hatenablog.com

keras YOLO3 で、物体検知

index:

概要

以前の、keras 画像認識に関連した内容で、 YOLO3 物体検知
する例となります。

環境

python : 3.5.2
keras
YOLO3

準備

紹介記事が、複数ありましたので。
概要のみです

https://github.com/qqwweee/keras-yolo3
yolo3 の、コピー

・学習済ファイルのコピー、yolov3.weights
wget https://pjreddie.com/media/files/yolov3.weights

・keras読み込み、変換処理 
model_data/yolo.h5 が、作成されます。
python convert.py yolov3.cfg yolov3.weights model_data/yolo.h5

手順

python yolo_video.py --image
評価する、jpg等画像ファイル名の入力

・結果を、ファイルに保存する場合、
 yolo_video.py
 の、detect_img を、下記修正を追加すると可能でした。

#
def detect_img(yolo):
    while True:
        img = input('Input image filename:')
        try:
            image = Image.open(img)
        except:
            print('Open Error! Try again!')
            continue
        else:
            r_image = yolo.detect_image(image)
            #r_image.show()
            import cv2
            cv2.imwrite("out.jpg", np.asarray(r_image)[..., ::-1])
            r_image.show()
    yolo.close_session()


検出の結果

検出できました。
適当な、画像を指定しましたが。
バウンディングボックス、枠の部分が表示れされています。

f:id:knaka0209:20190301124201j:plain

その他

上記の、関連等に記載がありますが。
tiny版もあるので、容量小さめの weights ファイル
をコピーして、評価できましたが。
認識精度は、落ちそうでした。

keras LSTM で、文章自動生成を行う。 自然言語処理(5)

index:

概要

前回の、自然言語処理の関連となります。
学習させた文章(書籍など)、を元にLSTM
で、文章を自動生成する仕組みの例です。

テストは、google colab で行いました。

環境

python 3.5.2
janome
keras

コード

github.com

python3 です。

データセット

参考ページと、同じですが。

青空文庫の、モルグ街の殺人事件
https://www.aozora.gr.jp/cards/000094/card605.html

処理など

参考ページと、ほぼ同じですが。
形態素解析は、 janome を使用しています。

・前処理、
before.py 、改行とかの削除

・学習

・評価
モデルを、ロードして。評価
学習データの、一部の文章を指定
その後は、文章の自動生成が可能でした。

#pred
for diversity in [0.2]:  # diversity は 0.2のみ使用 
    print('----- diversity:', diversity)
    generated = ''
    text= get_token("どんなつまらない仕事でも楽しんでやるのだ")
    sentence = text[start_index: start_index + maxlen]
    generated += "".join(sentence)
    print(sentence )
    print('----- Generating with seed: "' + "".join(sentence)+ '"')
    sys.stdout.write(generated)

    for i in range(400):
        x_pred = np.zeros((1, maxlen, len(chars)))
        for t, char in enumerate(sentence):
            x_pred[0, t, char_indices[char]] = 1.

        preds = model.predict(x_pred, verbose=0)[0]
        next_index = sample(preds, diversity)
        next_char = indices_char[next_index]

        generated += next_char
        sentence = sentence[1:]
        # sentence はリストなので append で結合する
        sentence.append(next_char)  

        sys.stdout.write(next_char)
        sys.stdout.flush()
    print()

評価の結果

どんなつまらない仕事でも得てももしそう事件ということを君はよくわかっている。
部屋の窓をそのときには言葉を、この注意をてで、――それに君を言うとおり、
証人たちは荒々しい声については意見が一致しているのに、あの鋭い、
あるいは一人の証人の言うところによれば耳ざわりな、声に関してはひどい意見のものであるたにちがいない。
窓はそこから出るときにしめて行ったのだろう。
その後、猩々は人自身の証人が『鋭いというよりも耳ざわりなものであった。
耳ざわりな声で――鋭いというよりも耳ざわりなものであった。鋭い声とは言えぬ。
荒々しい声のほうの数語は聞きとれた。それはフランス人の言葉だった。
女の声ではないことは確かだ。言った言葉は聞きとれなかった。鋭い声の言葉はわからなかった。
早くて死体た見つかっで、
被害者二人がまだこのときの通り人まだ少しのただ音のレスパネエ夫人を僕と家にうししを
すっかりデュパンがこのあとをほうてのだが)、猩々のたぶんの想像に得られた我々と
部屋の扉を押しあけたときとのあいだの時間については、
証人の言うと鋭い声のものではないがこのパリでは動物はその他考えている
――が『彼はこのこの事件についてはまだなにを錠はかかっていなかった。
その建物には四階のほかにはどこにも家具がないようであった。 
このフランス人は一人の数人の殺人をフランス語て部屋そしてにあいだにデュパン君と書いてぬというしまっと君を、
それから想像デュパンのつづけた「私」 デュパンがこのあとのほうは言葉を、
非常に低い調子で、非常に静かに言っ

・とりあえず、読めなくない程度の文章を
 自動生成して、くれました。

・学習 epochs =60で、
 google colab で、25分程、
 作業PCですと、数時間かかりそうでしたが。

django + nginx + uwsgi の設定 #django

index:

概要

djangoで、nginx + uwsgi を連携し、
webサービスを構築する例となります。

環境

python 3.5
Django
nginx
uwsgi

設定ファイルの例

https://github.com/kuc-arc-f/django_nginx

python3 です。
アプリは、test1

設定方法

django プロジェクト作成、
アプリの追加等は、省略します。
前回の例と、ほぼ同じです。

nginx conf、追加

#
upstream django {
	server 127.0.0.1:8001;
}

#
server {
	listen       80;

	location / {
		uwsgi_pass django;
		include /home/pi/work/django/django1/uwsgi_params;
	}
}

https://github.com/kuc-arc-f/django_nginx/blob/master/nginx_conf/django.conf

・uwsgi_paramsは、
 プロジェクトのパスとなります。(後述します)

・ /etc/nginx/sites-available に、
conf 追加します。

・ /etc/nginx/conf.d/
に、上記のリンク追加します。

 =>既に、confがある場合、削除しておきます。

・nginx 再起動
sudo service nginx stop
sudo service nginx start


uwsgi の設定

・uwsgi_params
プロジェクト内に、配置

uwsgi_param  QUERY_STRING       $query_string;
uwsgi_param  REQUEST_METHOD     $request_method;
uwsgi_param  CONTENT_TYPE       $content_type;
uwsgi_param  CONTENT_LENGTH     $content_length;

uwsgi_param  REQUEST_URI        $request_uri;
uwsgi_param  PATH_INFO          $document_uri;
uwsgi_param  DOCUMENT_ROOT      $document_root;
uwsgi_param  SERVER_PROTOCOL    $server_protocol;
uwsgi_param  REQUEST_SCHEME     $scheme;
uwsgi_param  HTTPS              $https if_not_empty;

uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;

https://github.com/kuc-arc-f/django_nginx/blob/master/django1/uwsgi_params

・uwsgi の起動
uwsgi --socket :8001 --module django1.wsgi

表示の確認、

http://ip/test1/
表示されます。

参考のページ

knaka0209.hatenablog.com