#author("2020-02-28T10:57:19+00:00","default:f-lab","f-lab") #author("2020-02-28T10:58:30+00:00","default:f-lab","f-lab") [[seminar-personal/chin2017]] |~目次| |#contents| &br; *おさらい [#p71808b9] -[[前回ゼミ>http://f-lab.mydns.jp/index.php?seminar-N-20200221]] -クラスタ内のデータ数が5以下のもののCSVファイルを特定し、1つにフォルダに抽出した。 --Z:\N\chin\20200221\tmp抽出したリスト.txt --Z:\N\chin\20200221\tmp\*.csv -次はこれらのファイルの中身を調べる。 --以下のようなCSVファイルを作成する。 番号,CSVへのPath,項目名,有効なCSV,内容 1,./opendata_l_5-prep2/www.city.yokohama.lg.jp/tsuzuki/soumu/toukei/csv/01.csv,統計で見るつづき,false,都筑区統計要覧という本の目次 2,./opendata_l_5-prep2/www.city.nagaoka.niigata.jp/shisei/cate10/kokusaikouryu/file/01-01.csv,目標方向,true,水資源に関するデータ -上記の中で有効なCSVがfalseであるデータは削除して、再度クラスタリングする。 *CSVの除外 [#s8e97986] **前処理(例) [#e71b4785] --前回ゼミより/⇒--を置換 --また./=>@を置換 import shutil # 対象の文字列 src = "./opendata_l_5-prep2/www.town.eiheiji.lg.jp/900/905/p002092_d/fil/kouiki.csv" # すべて置換 dst = src.replace("./", "@") dst = dst.replace("/", "--") print(dst) shutil.copy(src, './tmp/'+dst) &br;結果 @opendata_l_5-prep2--www.town.eiheiji.lg.jp--900--905--p002092_d--fil--kouiki.csv './tmp/@opendata_l_5-prep2--www.town.eiheiji.lg.jp--900--905--p002092_d--fil--kouiki.csv' *処理手順 [#sd553797] -①項目名を抽出 -②クラスタリングを行う -③クラスタに項目名の数を計算 -④少ないクラスタ(項目名)のパスを抽出、除外 -②~④を繰り返す&br; 上記の手順について懸念点(疑問点):収束の条件は?何回まで? ---有効なCSVのtrue,flaseの判断は手作業? ---内容の判断は?(とりあえず項目データへ保存)->見ないとどのようなデータは不明なので) ---以前:5個項目名以下?10個は?⇒項目名の出現回数で除外すれば楽? ---1回目のクラスタ(4443個項目名):&ref(label_average_cosine_150_cluter_one.csv); ---1回目の結果:&ref(results_one_time.csv); ---1回目で抽出した219個ファイル:\\10.200.11.9\home\N\chin\20200228\tmp\one ---2回目のクラスタ(4309個項目名):&ref(label_average_cosine_150_cluter_two.csv); ---2回目の結果:&ref(results_two_time.csv); ---2回目で抽出した199個ファイル:\\10.200.11.9\home\N\chin\20200228\tmp\two ---[[ソースコード>https://colab.research.google.com/drive/1RRtd1pfwlHhi7s0HUt4kTy8jz7AOYIQ1#scrollTo=toDzLUhjsmi2]] import pandas as pd import numpy as np %matplotlib inline import matplotlib.pyplot as plt from scipy.cluster.hierarchy import linkage,dendrogram,fcluster from gensim.models import Word2Vec from janome.tokenizer import Tokenizer import time import japanize_matplotlib #import seaborn as sns #sns.set(font="IPAexGothic") #日本語フォント設定 start = time.time() #日本語をベクトルに変換する関数 def word_to_vec(data,flag): t = Tokenizer()#分かち書き items =[token.surface for token in t.tokenize(data)] #print(items) tmp = 0 for l in range(len(items)): if items[l] in model.wv: tmp +=model[items[l]] flag = False return tmp,flag print("Word2Vec reading...") f_name = "word2vec.gensim.model" model = Word2Vec.load(f_name) print(model) print("Done") print("CSV list reading...") with open("items_name_all_list.csv") as f: csv_files=f.readlines() csv_files_len = len(csv_files) name_vec_list = [] vec_list =[] item_name_labels=[] print("Done") for v in range(1,csv_files_len): name = csv_files[v].strip()#空白文字を除去 vec,flag=word_to_vec(name,True) if flag == True:#無い場合 continue tmp = np.array(vec).tolist() mylist = [name] mylist.extend(tmp) name_vec_list.append(mylist) vec_list.append(tmp) item_name_labels.append(name) df = pd.DataFrame(name_vec_list) print(df) df_vec = pd.DataFrame(vec_list) print(df_vec) # 階層型クラスタリングの実施 # ウォード法 x ユークリッド距離 #R言語の同様ウォード法 x cosine距離 result = linkage(df_vec,method='average',metric ='cosine') # 階層型クラスタリングの可視化 plt.figure(num=None, figsize=(16, 9), dpi=200, facecolor='w', edgecolor='k') #デンドログラムを表示 dendrogram(result,labels=item_name_labels) plt.show() # クラスタリング結果の値を取得 clusters = fcluster(result, t=150,criterion='maxclust') clusters_list = clusters.tolist() print(type(clusters_list)) print(clusters_list) df['cluster'] = clusters_list print(df) df.to_csv("items_name_all_vec_150.csv", index=False,header=False) process_time = format(time.time() - start) print('実行時間は%s秒' %process_time) print("終了です") import pandas as pd import numpy as np %matplotlib inline import matplotlib.pyplot as plt from scipy.cluster.hierarchy import linkage,dendrogram,fcluster from gensim.models import Word2Vec from janome.tokenizer import Tokenizer import time import japanize_matplotlib #import seaborn as sns #sns.set(font="IPAexGothic") #日本語フォント設定 start = time.time() #日本語をベクトルに変換する関数 def word_to_vec(data,flag): t = Tokenizer()#分かち書き items =[token.surface for token in t.tokenize(data)] #print(items) tmp = 0 for l in range(len(items)): if items[l] in model.wv: tmp +=model[items[l]] flag = False return tmp,flag print("Word2Vec reading...") f_name = "word2vec.gensim.model" model = Word2Vec.load(f_name) print(model) print("Done") print("CSV list reading...") with open("items_name_all_list.csv") as f: csv_files=f.readlines() csv_files_len = len(csv_files) name_vec_list = [] vec_list =[] item_name_labels=[] print("Done") for v in range(1,csv_files_len): name = csv_files[v].strip()#空白文字を除去 vec,flag=word_to_vec(name,True) if flag == True:#無い場合 continue tmp = np.array(vec).tolist() mylist = [name] mylist.extend(tmp) name_vec_list.append(mylist) vec_list.append(tmp) item_name_labels.append(name) df = pd.DataFrame(name_vec_list) print(df) df_vec = pd.DataFrame(vec_list) print(df_vec) # 階層型クラスタリングの実施 # ウォード法 x ユークリッド距離 #R言語の同様ウォード法 x cosine距離 result = linkage(df_vec,method='average',metric ='cosine') # 階層型クラスタリングの可視化 plt.figure(num=None, figsize=(16, 9), dpi=200, facecolor='w', edgecolor='k') #デンドログラムを表示 dendrogram(result,labels=item_name_labels) plt.show() # クラスタリング結果の値を取得 clusters = fcluster(result, t=150,criterion='maxclust') clusters_list = clusters.tolist() print(type(clusters_list)) print(clusters_list) df['cluster'] = clusters_list print(df) df.to_csv("items_name_all_vec_150.csv", index=False,header=False) process_time = format(time.time() - start) print('実行時間は%s秒' %process_time) print("終了です")