#Pac_Helper_Text(PHT) Ver.12 20241001 H.Konno #保存ファイル名入力、項目入力、重要度順、類似度、正負評定 #引き続きデンドログラムを描画し終了 #必要なファイル(kyori.txtなど)はローカルにダウンロード可能 #1.データ収集 import random #乱数利用のインポート namae0 = input('Filesname? ') namae1 = namae0 + "_bun.txt" f = open(namae1, 'w') print('[浮かんだイメージを教えてください]') print('---最後はeeeと入力---') kazu = 0 bun = "" hako = [namae0] hako1 = ['dummy'] hako2 = ['dummy'] while True: kazu += 1 bun = input('入力(Last:eee) ') bun1 = bun + str(kazu) hako.append(bun1) hako1.append(bun) hako2.append(bun1) if bun == ('eee'): break f.writelines(hako) f.close() namae2 = namae0+"_juyou.txt" f = open(namae2,'w') print('[反応文一覧]') for i,youso in enumerate(hako): if i != 0 and i != kazu: print (i,youso) print('[重要度順の入れ替え]') print('---最後は0space0と入力---') print('(同順の場合は1 1の後に0 0と入力') i = 0; bun=""; jubun="" while True: moto,saki=(int(x) for x in input('元(space)先 ').split()) if moto == 0 and saki == 0: break jubun="" hako[moto], hako[saki] = hako[saki], hako[moto] hako1[moto],hako1[saki]=hako1[saki],hako1[moto] for i,youso in enumerate(hako): if i != 0 and i != kazu: bun = str(i)+youso print(bun) #(i,youso) jubun=jubun+bun+',' f.writelines(jubun) #重要度順のファイル保存 f.close() hako1.pop(0) str1 = jubun seibun = str1.split(',') print('[類似度の評定]') print('---対提示文相互の距離---') print('---SpaceキーとBSキーで操作し、Enterキーで確定---') import random #乱数利用のインポート kazu = kazu-1 kazu1 = int(kazu * (kazu-1) / 2) print('kazu1=', kazu1) check1 = [[0] * kazu for i in range(kazu)]#配列を0で初期化 count=0; i=0; j=0; hajime=1 jun = random.sample(range(kazu1), kazu1) #重複なし乱数を変数に代入 print('jun',jun) #(random.sample(range(kazu1), kazu1)) #乱数変数を表示 for i in range(kazu): for j in range(hajime, kazu): check1[i][j] = jun[count]+1 count += 1 hajime = hajime + 1 print(*check1, sep='\n') #配列の改行表示 f = open('ransu.txt','w') check1list = str(check1) f.writelines(check1list) #checklistのファイル保存 f.close() ban=0 kyori = [[0] * kazu for i in range(kazu)] #距離保存の配列宣言 #2.保存乱数から行と列を取得し類似度評定 for h in range(kazu1): ban = h+1 for i in range(kazu): for j in range(kazu): if check1[i][j]==ban: tt=i+1; yy=j+1 print(tt,'-',yy) tate=tt-1; yoko=yy-1 #二次元配列の指定 print(check1[tate][yoko]) print('「',hako1[tate][:12],'」と','「',hako1[yoko][:12],'」の遠近を、') print('7段階のspace距離で評定します。') print('1近2 3 4 5 6遠7') aida1 = input() print(aida1) aida2 = len(aida1); aida3 = aida2 / 6.9 +1 if aida3 > 7: aida3 = 7 #print(aida2,aida3) kyori[tate][yoko]=aida3 kyori[yoko][tate]=aida3 print(seibun) print(*kyori, sep='\n') #3.正負評定 print('[正負の評定]') print('---(―) (*) (+)---') namae3 = namae0+"_seifu.txt" f = open(namae3,'w') for i in range(kazu): seifu = seibun[i] print(seifu) pm=input('[- * +]? ') seibun[i]=seifu+pm seibun.pop seibunlist = str(seibun) f.writelines(seibunlist) # 正負評定のファイル保存 f.close() hako1.pop() namae4 = namae0+"_kyori.txt" f = open(namae4,'w') bubun1 = str(kazu) bubun2 = str(seibun) zenbu = bubun1+bubun2+str(kyori) f.writelines(zenbu) f.close() print('これで入力は終わりです。デンドログラムを作図します。') sakuzu = input('Enterキーを押すと、描画後に終了します。') #----------------------------------------------------------- import japanize_matplotlib import matplotlib.pyplot as plt %matplotlib inline import numpy as np import scipy.spatial.distance as distance #import matplotlib.pyplot as plt from scipy.cluster.hierarchy import linkage, dendrogram from random import random from pandas import DataFrame, Series import pandas as pd import io koumoku = "" data_labels = [] n0 = str(kazu) ## n0 = f.readline() print ("第1行"+n0) n=n0; n1=n0 # n, n1 = n0.split(',') n = int(n) koumoku = seibun[:-1] ##koumoku0 = f.readline().rstrip() koumoku0 = str(koumoku) print(koumoku0) #距離行列データ読み込み data = kyori #data = pd.read_csv(f,header=None) data_labels = koumoku #距離行列の要素間距離計算(ユークリッド距離) dMatrix = np.zeros([n, n]) for i in range(n): for j in range(n): dMatrix[i, j] = distance.euclidean(data[i], data[j]) #距離ベクトル生成 dArray = distance.squareform(dMatrix) #クラスタリング(ward法) result = linkage(dArray, method = 'ward') #図示(左側に項目で右に統合) dendrogram(result, labels = data_labels, orientation = 'right') plt.savefig("namae1.jpg")