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])

猜你喜欢

转载自www.cnblogs.com/birdmmxx/p/12532751.html
今日推荐