#author("2020-02-25T10:30:15+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("終了です")


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS