理解業務
一個需求:把相似的目的地整理出來,然後可以通過這些相似目的地做相關推薦,或者是相關目的地的推薦
準備資料
Word2Vec演算法:可以學習輸入的文字,並輸出一個詞向量模型
對資料進行清洗,去出異常的資料;對文字內容進行分詞;把資料儲存在文字檔案中
訓練Word2Vec模型
import gensim import os import re import sys import multiprocessing #引入多執行緒操作 from time import time class getSentence(object): #初始化,獲取檔案路徑 def __init__(self,dirname): self.dirname=dirname #構建一個迭代器 def __iter__(self): for root,dirs,files in os.walk(self.dirname): for filename in files: file_path = root +'/'+filename for line in open(file_path): try: #清除異常資料,主要是去除空白符以及長度為0的內容 s_line = line.strip() if s_line=="": continue #把句子拆成詞 word_line = [word for word in s_line.split()] yeild word_line except Exception: print("catch exception") yeild "" if __name__='__main__': #記錄一個起始時間 begin=time() #獲取句子迭代器 setences=getSentences("traindata") #訓練word2vec模型,使用句子迭代器作為語料的輸入,設定的最終向量長度為200維;視窗長度為15;詞的最小計數為10,詞頻少於10的詞不會進行計算;使用並行處理 model= gensim.models.Word2Vec(sentences,size=200,window=15,min_count=10,workers=multiprocessing.cpu_count()) #模型儲存,這塊記得預先新建一個model路徑,或者增加一段程式碼來識別是否已經建立,如果沒有則新建一個路徑 model.save("model/word2vec_gensim") model.wv.save_word2vec_format("model/word2vec_org", "model/vocabulary",binary=False) end.time() #輸出運算所用時間 print("Total processing time:%d seconds" % (end-begin))
訓練k-means模型
import gensim from sklearn.cluster import KMeans from sklearn.externals import joblib from time import time #載入之前已經訓練好的word2vec模型 def load_model(): model= gensim.models.Word2Vec.load('../word2vec/model/word2vec_gensim') return model #載入城市名稱詞庫 fd=open("mddwords.txt","r") filterword=[] for line in fd.readlines(): line=line.strip() fliterword.append(line) return fliterword if __name__=="__main__": start=time() #載入word2vec模型 model=load_filterword() #輸出詞彙表長度 print(len(filterword)) wordvector=[] filterkey={} #獲取城市名稱詞庫的詞向量 for word in filterword: wordvector.append(model[word]) filterkey[word]=model[word] #輸出詞彙數量 print(len(wordvector)) #訓練K-means模型,這裡設定的聚類數為2000,最大迭代次數為100,n_jobs設定的是有多少個任務同時在跑,這樣可以進行多組實驗來消除初始化點帶來的影響 clf=KMeans(n_clusters=2000,max_iter=100,n_jobs=10) s=clf.fit_predict(wordvector) #把模型儲存下來 joblib.dump(clf,"kmeans_mdd2000.pkl") labels=clf.labels_ labellist=labels.tolist() print(clf.inertia_) #把所有城市名稱的聚類標籤儲存下來 fp=open("label_mdd2000",'w') fp.write(str(labellist)) fp.close() #把所有城市名稱儲存下來,其中順序與聚類標籤順序一致 fp1=open("keys_mdd2000",'w') for k in filterkey: fp1.write(key+'\n') print("over") end=time() print("use time") print(end-start)
最終確定的聚類簇數是100
把這些資料儲存到資料庫中,並在具體的業務中進行應用