- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2020-02-27T23:32:13+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("終了です")