import pandas as pd import pandas.io.common import numpy as np import codecs import random import os #import getenc import time import re import sys import keras import matplotlib.pyplot as plt from gensim.models import Word2Vec from janome.tokenizer import Tokenizer from keras.utils.np_utils import to_categorical from pandas import Series,DataFrame from sklearn.model_selection import train_test_split from keras.models import Sequential from keras.layers import Activation, Dense, Dropout from keras.utils.np_utils import to_categorical from keras.utils import np_utils from keras.utils.vis_utils import plot_model from keras.optimizers import RMSprop from keras.models import load_model from sklearn.preprocessing import LabelEncoder from progressbar import * #パラメータ設定 TRAIN_TIMES = 200 # 学習回数 NUM_DATAS = 150000 # データのデータ数(学習サンプル数) TEST_SIZE = 0.2 #テスト割合 BATCH_SIZE = 500 # 1回の学習に用いるデータ数 NUM_SEED = 0 #乱数のシード値 INPUT_DIMENSION = 50 # 入力データの次元数 HIDDEN_DIMENSION = 300 # 隠れ層の次元数 NUM_CLASSES =150 # 出力の次元数(クラスタ数:教師信号学習ラベル用) WIDGETS = ['Progress of making dataset: ',Percentage(), ' ', Bar('#'),' ', Timer(),' ', ETA(), ' ', FileTransferSpeed()] #モデルの作成 def build_model(): #モデルの定義(畳み込みニューラルネットワーク) model = Sequential() #1層目の追加 model.add(Dense(HIDDEN_DIMENSION,input_dim = INPUT_DIMENSION))#入力層 model.add(Activation('relu')) #2層目の畳み込み層 model.add(Dense(HIDDEN_DIMENSION)) model.add(Activation('relu')) #Dropoutとは過学習を防ぐためのもの 0.5は次のニューロンへのパスをランダムに半分にするという意味 model.add(Dropout(0.5)) #3層目の作成 model.add(Dense(HIDDEN_DIMENSION)) model.add(Activation('relu')) #Dropout model.add(Dropout(0.5)) #4層目の作成 #model.add(Dense(HIDDEN_DIMENSION)) #model.add(Activation('relu')) #model.add(Dropout(0.5)) #5層目 引数num_classesとは分類の数を定義する。 model.add(Dense(NUM_CLASSES))#出力層 model.add(Activation('softmax')) model.summary()# モデル構成の確認 #ここまででモデルの層完成 #lossは損失関数を定義するところ model.compile(loss="categorical_crossentropy",metrics = ["accuracy"],optimizer = "adam") #optimizer='rmsprop'なら #model.compile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['accuracy']) #学習モデル図の作成 plot_model(model, to_file='model.png') return model #結果をグラフにプロット関数 def plot_history(history): # 精度の履歴をプロット plt.plot(history.history['acc'],"o-",label="accuracy") plt.plot(history.history['val_acc'],"o-",label="val_acc") plt.title('model accuracy') plt.xlabel('epoch') plt.ylabel('accuracy') plt.legend(loc="lower right") plt.show() # 損失の履歴をプロット plt.plot(history.history['loss'],"o-",label="loss",) plt.plot(history.history['val_loss'],"o-",label="val_loss") plt.title('model loss') plt.xlabel('epoch') plt.ylabel('loss') plt.legend(loc='lower right') plt.show() #日本語をベクトルに変換する関数 def word_to_vec(item): t = Tokenizer()#分かち書き items =[token.surface for token in t.tokenize(item)] vec =sum(model[items[l]] for l in range(len(items)) if items[l] in model.wv) return vec if __name__ == "__main__": start = time.time() fname="pre2_csv_items_all_list.csv" df=pd.read_csv(fname,sep=",",header=0) #項目データ 項目名ペアを読み込み cluster=pd.read_csv("items_name_all_vec_150_191212.csv",sep=",",encoding="utf-8-sig",header =None) #項目名のクラスタを読み込み(辞書型のリス作成) list_tmp=[] dict ={} for m in range(cluster.shape[0]):#行数クラスタリングの分布 name = cluster.iat[m,0]#項目名 label=cluster.iat[m,51]#クラスタのラベル list_tmp.append(label) dict[name]=label print(dict) print(list_tmp) a = np.array(list_tmp) b=[i for i in range(1,150) ] plt.hist(a, bins = b) plt.title("histogram") plt.show() hist,bins = np.histogram(a,bins =b) print(hist) print(bins) print(dict) temp=[] for i in range(len(df)): if df.iat[i,1] in dict.keys():#全データ(dataset)の分布 temp.append(dict[df.iat[i,1]]) a = np.array(temp) plt.hist(a, bins = b) plt.title("histogram") plt.show() hist,bins = np.histogram(a,bins =b) print(hist) print(bins) print(dict) print("done") process_time = format(time.time() - start) print('Execution time is %s s'%process_time)