基于word2vec的k-means聚类

1.将txt文本用word2vec将每个词转换成词向量
2.将300维度的词向量用pca转换为2维
3.将2维的数据作为k-means聚类的输入

text.txt:作为训练的文本(最好是英文,如果是中文的话可以再用jieba库把中文解析)
word_model.txt:创建一个空的文本
data.csv:创建一个空的csv文件

#1。将文本的标点替换成空格
import re
import os
list=[',','?','.','?','!','*','(',')','“','”',':','"','`','\'']  ##要替换的标点符号做成一个列表
with open('text.txt','r') as f:                                  ##text.txt是用来训练的文本(英文小说)
    result = f.read()
    for i in range(len(list)):
        result=result.replace(list[i],' ')
    with open('text.txt','w') as w:
        w.write(str(result))



##2。wordvec2获取词向量
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
def wordsCluster(text, vectorSize):                              ##text:输入文本的本地路径 vectorSize:词向量大小(多少维度)
    name = []
    data = open(text, 'r', encoding='utf-8')
    for line in data.readlines():
        line = line.replace('\n', '')
        if line not in name:
            name.append(line)
    # word2vec向量化
    model = Word2Vec(LineSentence(text), size=vectorSize, window=5, min_count=1, workers=4)
    model.wv.save_word2vec_format('word_model.txt', binary=False)      ##将词向量保存在word_model.txt文本中

    # 获取model里面的所有关键词
    keys = model.wv.vocab.keys()
wordsCluster('text.txt',300)



##3。将含词向量的txt文本转换为csv文本
f = open("word_model.txt","r")
new=[]
for line in f:
    new.append(line)
new[0]='\n'
f.close()

f = open("word_model.txt","w")
for n in new:
    f.write(n)
f.close()

import csv
with open('data.csv', 'w', newline='') as csvfile:      ##data.csv是用来存放词向量的csv文件
    writer = csv.writer(csvfile)
    data = open('word_model.txt')
    for each_line in data:
        a = each_line.split()
        writer.writerow(a)

##4。用pca将300维的数据降低到2维
# coding=utf-8
import numpy as np
from sklearn.decomposition import PCA
from matplotlib import pyplot as plt
l = []
words=[]
with open('data.csv', 'r') as fd:
    line = fd.readline()
    line=fd.readline()
    while line:
        if line == "":
            continue
        line = line.strip()
        word = line.split(",")
        words.append(word[0])
        l.append(word[1:])
        line = fd.readline()

X = np.array(l)  #导入数据,维度为300
pca = PCA(n_components=2)   #降到2维
pca.fit(X)                  #训练
newX=pca.fit_transform(X)   #降维后的数据存放在newX列表中


##5。构建词向量字典并用kmeans训练,得出分类情况
dict={}
for i in range(len(words)):
    word_=words[i]
    dict[word_]=newX[i]
for j in range(len(words)):
    print(words[j]+':',end='')
    print(dict[words[j]])

from sklearn.cluster import KMeans
import numpy as np

X = np.array(newX)
kmeans = KMeans(n_clusters=5, random_state=0).fit(X)

print("五个中心词的坐标:")
print(kmeans.cluster_centers_)

list1=[]
list2=[]
list3=[]
list4=[]
list5=[]
for j in range(len(words)):
    if kmeans.labels_[j]==0:
        list1.append(words[j])
    elif kmeans.labels_[j]==1:
        list2.append(words[j])
    elif kmeans.labels_[j]==2:
        list3.append(words[j])
    elif kmeans.labels_[j]==3:
        list4.append(words[j])
    elif kmeans.labels_[j]==4:
        list5.append(words[j])
print("与关键词"+list1[0]+"相关的词有:",end='')
print(list1)
print("与关键词"+list2[0]+"相关的词有:",end='')
print(list2)
print("与关键词"+list3[0]+"相关的词有:",end='')
print(list3)
print("与关键词"+list4[0]+"相关的词有:",end='')
print(list4)
print("与关键词"+list5[0]+"相关的词有:",end='')
print(list5)

##将数据用散点图可视化
f1=[]
f2=[]
for i in range(len(newX)):
    f1.append(newX[i][0])
    f2.append(newX[i][1])
plt.scatter(f1, f2, c='blue', s=6)
plt.show()



测试效果在这里插入图片描述在这里插入图片描述

  • 11
    点赞
  • 101
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
【资源说明】 1.项目代码均经过功能验证ok,确保稳定可靠运行。欢迎下载食用体验! 2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师、企业员工。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。在使用过程中,如有问题或建议,请及时沟通。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈! 【项目介绍】 基于Python的中文本关键词抽取源码(分别使用TF-IDF、TextRank、Word2Vec聚类三种方法)+数据集和说明.zip 一篇文档的关键词等同于最能表达文档主旨的N个词语,即对于文档来说最重要的词,因此,可以将文本关键词抽取问题转化为词语重要性排序问题,选取排名前TopN个词语作为文本关键词。目前,主流的文本关键词抽取方法主要有以下两大类: (1)基于统计的关键词提取方法 该方法根据统计信息,如词频,来计算得到文档中词语的权重,按权重值排序提取关键词。TF-IDF和TextRank均属于此类方法,其中TF-IDF方法通过计算单文本词频(Term Frequency, TF)和逆文本频率指数(Inverse Document Frequency, IDF)得到词语权重;TextRank方法基于PageRank的思想,通过词语共现窗口构建共现网络,计算词语得分。此类方法简单易行,适用性较强,然而未考虑词序问题。 (2)基于机器学习的关键词提取方法 该方法包括了SVM、朴素贝叶斯等有监督学习方法,以及K-means、层次聚类等无监督学习方法。在此类方法中,模型的好坏取决于特征提取,而深度学习正是特征提取的一种有效方式。由Google推出的Word2Vec词向量模型,是自然语言领域中具有代表性的学习工具。它在训练语言模型的过程中将词典映射到一个更抽象的向量空间中,每一个词语通过高维向量表示,该向量空间中两点之间的距离就对应两个词语的相似程度。 基于以上研究,本文分别采用**TF-IDF方法、TextRank方法和Word2Vec聚类方法**,利用Python语言进行开发,实现文本关键词的抽取。 总结了三种常用的抽取文本关键词的方法:TF-IDF、TextRank和Word2Vec词向量聚类,并做了原理、流程以及代码的详细描述。因本文使用的测试语料较为特殊且数量较少,未做相应的结果分析,根据观察可以发现,得到的十个文本关键词都包含有文本的主旨信息,其中TF-IDF和TextRank方法的结果较好,Word2Vec词向量聚类方法的效果不佳,这与文献[8]中的结论是一致的。文献[8]中提到,对单文档直接应用Word2Vec词向量聚类方法时,选择聚类中心作为文本的关键词本身就是不准确的,因此与其距离最近的N个词语也不一定是关键词,因此用这种方法得到的结果效果不佳;而TextRank方法是基于图模型的排序算法,在单文档关键词抽取方面有较为稳定的效果,因此较多的论文是在TextRank的方法上进行改进而提升关键词抽取的准确率。 另外,本文的实验目的主要在于讲解三种方法的思路和流程,实验过程中的某些细节仍然可以改进。例如Word2Vec模型训练的原始语料可加入相应的专业性文本语料;标题文本往往包含文档的重要信息,可对标题文本包含的词语给予一定的初始权重;测试数据集可采集多个分类的长文本,与之对应的聚类算法KMeans()函数中的n_clusters参数就应当设置成分类的个数;根据文档的分词结果,去除掉所有文档中都包含某一出现频次超过指定阈值的词语;等等。各位可根据自己的实际情况或者参考论文资料进行参数的优化以及细节的调整

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值