對於關鍵詞,句子的聚類,一開始真的是找不到頭腦,后來了解到使用word2vec可以讓關鍵字實現向量化,實現了向量化之后,再使用k-means聚類不就可以了嗎。
1.結合word2vec進行關鍵字向量化
參考連接:https://blog.csdn.net/qq_28840013/article/details/89681499
這篇文章是講解如何初步使用word2vec,講解得很詳細,就不多解釋,
代碼嘗試:
from gensim.models import word2vec import gensim #獲取句子 sentences=word2vec.Text8Corpus("kjcg.txt") # print(sentences) #sg=1是skip—gram算法,對低頻詞敏感,默認sg=0為CBOW算法 #size是神經網絡層數,值太大則會耗內存並使算法計算變慢,一般值取為100到200之間。 #window是句子中當前詞與目標詞之間的最大距離,3表示在目標詞前看3-b個詞,后面看b個詞(b在0-3之間隨機) #min_count是對詞進行過濾,頻率小於min-count的單詞則會被忽視,默認值為5。 #negative和sample可根據訓練結果進行微調,sample表示更高頻率的詞被隨機下采樣到所設置的閾值,默認值為1e-3, #negative: 如果>0,則會采用negativesamping,用於設置多少個noise words #hs=1表示層級softmax將會被使用,默認hs=0且negative不為0,則負采樣將會被選擇使用。 #workers是線程數,此參數只有在安裝了Cpython后才有效,否則只能使用單核 model=gensim.models.Word2Vec(sentences,sg=0,size=30,window=10,min_count=2,negative=3,sample=0.001,hs=1,workers=4) # print(model.wv.vocab) # words = model.wv.vocab # size = model.wv.vectors # i=0 # for word in words: # # print(i) # print(word) # print(size[i]) # i+=1 #創建模型 model.save("kjcg_test1.txt") #模型會保存到該 .py文件同級目錄下,該模型打開為亂碼 # model.wv.save_word2vec_format("kjcg_test2.txt",binary = "Ture") #通過該方式保存的模型,能通過文本格式打開,也能通過設置binary是否保存為二進制文件。但該模型在保存時丟棄了樹的保存形式(詳情參加word2vec構建過程,以類似哈夫曼樹的形式保存詞),所以在后續不能對模型進行追加訓練 #對.sava保存的模型的加載: model=gensim.models.Word2Vec.load("kjcg_test1.txt") #對..wv.save_word2vec_format保存的模型的加載: # model = model.wv.load_word2vec_format('kjcg_test1.txt') #模型追加訓練(不懂) # model.train(more_sentences) print(model.most_similar("研究",topn=10)) #計算與該 詞最近似的詞,topn指定排名前n的詞 # 計算兩個詞的相似度: print(model.similarity("研究","農業")) # 獲取詞向量(有了這個不就意味着可以進行相關詞語的加減等運算,雖然我不是太懂): print('研究:',model ['研究'])
做到這里,所有關鍵詞已經被向量化,並且保存在model中,接下來就是利用詞向量分類。
2.利用k-means分類
https://zhuanlan.zhihu.com/p/29500866
這篇文章講解分詞,向量化,聚類,以及效果展示(但是我運行不了)
結合上述兩篇文章,代碼實現如下:
from gensim.models import word2vec from sklearn.cluster import KMeans import gensim import numpy #獲取句子 sentences=word2vec.Text8Corpus("kjcg.txt") # print(sentences) #sg=1是skip—gram算法,對低頻詞敏感,默認sg=0為CBOW算法 #size是神經網絡層數,值太大則會耗內存並使算法計算變慢,一般值取為100到200之間。 #window是句子中當前詞與目標詞之間的最大距離,3表示在目標詞前看3-b個詞,后面看b個詞(b在0-3之間隨機) #min_count是對詞進行過濾,頻率小於min-count的單詞則會被忽視,默認值為5。 #negative和sample可根據訓練結果進行微調,sample表示更高頻率的詞被隨機下采樣到所設置的閾值,默認值為1e-3, #negative: 如果>0,則會采用negativesamping,用於設置多少個noise words #hs=1表示層級softmax將會被使用,默認hs=0且negative不為0,則負采樣將會被選擇使用。 #workers是線程數,此參數只有在安裝了Cpython后才有效,否則只能使用單核 model=gensim.models.Word2Vec(sentences,sg=0,size=100,window=5,min_count=2,workers=4) #創建模型 model.save("kjcg_test1.txt") #模型會保存到該 .py文件同級目錄下,該模型打開為亂碼 #對.sava保存的模型的加載: model=gensim.models.Word2Vec.load("kjcg_test1.txt") # 獲取model里面的所有關鍵詞 keys = model.wv.vocab.keys() # print(keys) # print(type(keys)) # print(list(keys)[0]) # 獲取詞對於的詞向量 wordvector = [] for key in keys: wordvector.append(model[key]) # print(wordvector) #分類 classCount=10 #分類數 clf = KMeans(n_clusters=classCount) s = clf.fit(wordvector) # print(s) #獲取到所有詞向量所屬類別 labels=clf.labels_ print('類別:',labels) # print(type(labels)) #把是一類的放入到一個字典里 classCollects={} for i in range(len(keys)): # print('len(keys):',len(keys))#長度 # print('classCollects的keys:',classCollects.keys()) # print('labels[i]',labels[i]) # print(keys) # print('dict_keys:',list(keys)[0])#將dict_keys轉換為list,輸出第一個元素 # print(type(classCollects.keys())) # print(type(classCollects)) # print(i) # print(classCollects.keys()) print(list(classCollects.keys())) if labels[i] in list(classCollects.keys()): print('-----------------') classCollects[labels[i]].append(list(keys)[i]) else: classCollects={0:[],1:[],2:[],3:[],4:[], 5:[],6:[],7:[],8:[],9:[]} print('0類:',classCollects[0]) print('1類:',classCollects[1]) print('2類:',classCollects[2]) print('3類:',classCollects[3]) print('4類:',classCollects[4]) print('5類:',classCollects[5]) print('6類:',classCollects[6]) print('7類:',classCollects[7]) print('8類:',classCollects[8]) print('9類:',classCollects[9])