seminar-personal/chin2017


おさらい

-クラスタ内のデータ数が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の除外

前処理(例)

  • 前回ゼミより/⇒--を置換
  • また./=>@を置換
    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)

    結果
    @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'

処理手順

  • ①項目名を抽出
  • ②クラスタリングを行う
  • ③クラスタに項目名の数を計算
  • ④少ないクラスタ(項目名)のパスを抽出、除外
  • ②~④を繰り返す
    上記の手順について懸念点(疑問点):収束の条件は?何回まで?
    • 有効なCSVのtrue,flaseの判断は手作業?
    • 内容の判断は?(とりあえず項目データへ保存)->見ないとどのようなデータは不明なので)
    • 以前:5個項目名以下?10個は?⇒項目名の出現回数で除外すれば楽?
    • 1回目のクラスタ(4443個項目名):filelabel_average_cosine_150_cluter_one.csv
    • 1回目の結果:fileresults_one_time.csv
    • 1回目で抽出した219個ファイル:\\10.200.11.9\home\N\chin\20200228\tmp\one
    • 2回目のクラスタ(4309個項目名):filelabel_average_cosine_150_cluter_two.csv
    • 2回目の結果:fileresults_two_time.csv
    • 2回目で抽出した199個ファイル:\\10.200.11.9\home\N\chin\20200228\tmp\two
    • ソースコード
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("終了です")

添付ファイル: fileresults_two_time.csv 362件 [詳細] filelabel_average_cosine_150_cluter_two.csv 336件 [詳細] filelabel_average_cosine_150_cluter_one.csv 310件 [詳細] fileresults_one_time.csv 319件 [詳細] fileKreas_NN_20191219_20_of_clustering.txt 109件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-02-28 (金) 19:58:30