一、背景
好記性不如爛筆頭。記錄 一下項目上用到的算法與思路
二、問題描述
近期收到一個項目,為A公司做數據整合,並開發出一套人物畫像系統與倆個算法模型,其中的一個模型就是做圖紙的分類。甲方(A公司)在最終會議前,給了點樣例數據,讓我們先做出個demo,給甲方的大老板們看一下
三、數據樣例
甲方給的數據,包括:項目數據,人員數據,圖紙數據。以下的內容只用了圖紙數據,畢竟只是做圖紙的分類,用不到其他的樣本數據
下面是圖紙的名稱示例:
四、思路
1.將圖紙名稱進行分詞,去除停用詞,添加自定義詞典,作為分析的特征
2.計算每個特征的 Tf-Idf(詞頻-逆文檔頻率),作為特征的值
3.選擇聚類算法,開始的時候我是首選Dbscan的,畢竟相比於Kmeans 來說,不需要事先知道要分幾類,調整領域和最小點數就可以完成分類,但是理論敗給現實,圖紙的名稱分詞的效果實在太接近,而且
樣例數據本來就少,不足以區分開來,導致最后領域和最小點數的值無論怎么調效果都不盡人意,畢竟要給人家做demo,最后只好選了Kmeans。
五、代碼實現
1.模型代碼
1 # -*- coding:UTF-8 -*- 2 import jieba 3 import matplotlib.pyplot as plt 4 import pandas as pd 5 from sklearn.cluster import KMeans 6 from sklearn.feature_extraction.text import TfidfVectorizer 7 from sklearn.manifold import TSNE 8 9 data = open(r'xxx[文件路徑].csv', encoding="utf8") 10 data = pd.read_csv(data) 11 file_userdict = 'userdict.txt' 12 # 導入自定義詞典(不讓jieba把他們分開) 13 jieba.load_userdict(file_userdict) 14 # 停用詞列表 15 stop_words = ["-", "(", ")", ".", "pdf", "-"] 16 # tf-idf 詞頻-逆文檔頻率 tokenizer 意為分詞器 stop_words 停用詞 17 tf = TfidfVectorizer(tokenizer=jieba.lcut, stop_words=stop_words) 18 # tf-idf 計算 19 X = tf.fit_transform(data["圖紙名"]) 20 # 將結果轉為numpy的數組 21 res_matrix = X.toarray() 22 # kmeans,目標定位2類 23 kmeans = KMeans(n_clusters=2) 24 kmeans.fit(X)
2.結果可視化代碼
1 # 預測結果的標簽列表 2 labels = kmeans.labels_ 3 labels = pd.DataFrame(labels, columns=['labels']) 4 res_matrix = pd.DataFrame(res_matrix) 5 res_matrix.insert(res_matrix.shape[1], 'labels', labels) 6 # tsne()將關系數據降為二維數據 7 tsne = TSNE() 8 a = tsne.fit_transform(res_matrix) 9 liris = pd.DataFrame(a, index=res_matrix.index) 10 d1 = liris[res_matrix['labels'] == 0] 11 d2 = liris[res_matrix['labels'] == 1] 12 print(d1) 13 print(d2) 14 plt.plot(d1[0], d1[1], 'r.', d2[0], d2[1], 'go') 15 plt.show()
3.分類效果展示