第五周--python,嘗試word2vec結合k-means實現關鍵字聚類


  對於關鍵詞,句子的聚類,一開始真的是找不到頭腦,后來了解到使用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])

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM