實踐2:如何使用word2vec和k-means聚類尋找相似的城市

曲奇酸奶發表於2022-03-15

理解業務 

一個需求:把相似的目的地整理出來,然後可以通過這些相似目的地做相關推薦,或者是相關目的地的推薦

 

準備資料

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

 

把這些資料儲存到資料庫中,並在具體的業務中進行應用

            

相關文章