基于word2vec和k-means的词聚类_word2vec +k-means 对词语进行聚类-程序员宅基地

技术标签: 聚类  

import re
from sklearn.cluster import KMeans
from sklearn.externals import joblib
import numpy
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
from sklearn import metrics
import numpy as np
from collections import Counter
from operator import itemgetter

def map_label(true_labels, pred_labels):
    label_pair = list(zip(pred_labels, true_labels))
    count = tuple(Counter(label_pair).items())
    mapping = dict()
    n_label = len(np.unique(true_labels))

    for label in range(n_label):
        tuples = [tup for tup in count if tup[0][0] == label]
        likely_tuple = max(tuples, key=itemgetter(1), default=0)[0]
        mapping[likely_tuple[0]] = likely_tuple[1]

    pred_labels_mapped = [mapping[x] for x in pred_labels]
    return pred_labels_mapped

def cluster_quality(true_labels, pred_labels, show=True):
    f = 'data/word2vec_result.txt'
    r = open(f, 'w', encoding='utf-8')
    h, c, v = metrics.homogeneity_completeness_v_measure(true_labels, pred_labels)
    nmi = metrics.normalized_mutual_info_score(true_labels, pred_labels)
    rand = metrics.adjusted_rand_score(true_labels, pred_labels)
    pred_labels_mapped = map_label(true_labels, pred_labels)
    acc = metrics.accuracy_score(true_labels, pred_labels_mapped)
    if show:
        r.write("Homogeneity: %0.3f" % h)
        r.write('\n')
        r.write("Completeness: %0.3f" % c)
        r.write('\n')
        r.write("V-measure: %0.3f" % v)
        r.write('\n')
        r.write("NMI: %0.3f" % nmi)
        r.write('\n')
        r.write("Rand score: %0.3f" % rand)
        r.write('\n')
        r.write("Accuracy: %0.3f" % acc)
    return dict(
        homogeneity=h,
        completeness=c,
        vmeasure=v,
        nmi=nmi,
        rand=rand,
        accuracy=acc,
    )

def wordsCluster(text, vectorSize, classCount):
    '''
    text:输入文本的本地路径
    vectorSize:词向量大小
    classCount:k值
    '''

    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)
    
    #正确的标签,计算准确率
    true_labels = []
    labels = open('data/short_label.txt', 'r', encoding='utf-8')
    for label in labels.readlines():
        label = label.replace('\n', '')
        true_labels.append(label)

    # word2vec向量化
    model = Word2Vec(LineSentence(text), size=vectorSize, window=5, min_count=1, workers=4)
    model.wv.save_word2vec_format('word_model.txt', binary=False)
    # 获取model里面的说有关键词
    keys = model.wv.vocab.keys()

    # 获取词对于的词向量
    wordvector = []
    for key in keys:
        wordvector.append(model[key])

    # 聚类
    clf = KMeans(n_clusters=classCount)
    pred = clf.labels_
    cluster_quality(true_labels, pred)


wordsCluster('data/short_text.txt', 300, 21)

若不计算准确率,只输出聚类结果,如下所示

from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
from sklearn.cluster import KMeans

def wordsCluster(text, vectorSize, classCount):
    '''
    text:输入文本的本地路径
    vectorSize:词向量大小
    classCount:k值
    '''

    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)

    true_labels = []
    labels = open('data/short_label.txt', 'r', encoding='utf-8')
    for label in labels.readlines():
        label = label.replace('\n', '')
        true_labels.append(label)

    # word2vec向量化
    model = Word2Vec(LineSentence(text), size=vectorSize, window=5, min_count=1, workers=4)
    model.wv.save_word2vec_format('word_model.txt', binary=False)
    # 获取model里面的说有关键词
    keys = model.wv.vocab.keys()

    # 获取词对于的词向量
    wordvector = []
    for key in keys:
        wordvector.append(model[key])

    # 聚类
    clf = KMeans(n_clusters=classCount)
    s = clf.fit_predict(wordvector)
    for i in range(0, 21):
        label_i = []
        for j in range(0, len(s)):
            if s[j] == i:
                label_i.append(name[j])
        print('label_' + str(i) + ':' + str(label_i))

wordsCluster('data/short_text.txt', 300, 21)

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/allan2222/article/details/89436477

智能推荐

springboot web项目debug启动后自动断点在SilentExitException 解决-程序员宅基地

文章浏览阅读1k次。使用eclipse开发springboot web项目,在main方法类上使用debug启动后,会自动断点进入SilentExitException ,如图:解决办法 :window->preferences ->java->debug 取消“suspend execution on uncaught exceptions”选项即可..._silentexitexception

再也不用担心动态规划,BAT大佬精讲42道题目,相见恨晚_代码随想录全书百度网盘pdf-程序员宅基地

文章浏览阅读1.1k次。还学不会,来打我_代码随想录全书百度网盘pdf

Windows 下的 PostgreSQL PITR WAL 备份设置-程序员宅基地

文章浏览阅读247次。0) 创建 WAL 备份目录,比如: d:\backup\data\wal1) 修改 postgresql.conf 中的 archive_command 设置,比如: [code]archive_command = 'copy /V "%p" d:\\bakup\\data\\wal\\%f'[/code] 注1:%p 要用双引号括起来(因为 Postgr..._archive_command windows

TensorFlow笔记——用expand_dim()来增加维度_expand dim-程序员宅基地

文章浏览阅读1.4w次,点赞4次,收藏14次。TensorFlow中,想要维度增加一维,可以使用tf.expand_dims(input, dim, name=None)函数。当然,我们常用tf.reshape(input, shape=[])也可以达到相同效果,但是有些时候在构建图的过程中,placeholder没有被feed具体的值,这时就会包下面的错误:TypeError: Expected binary or unicode stri..._expand dim

项目记录 easyui datagrid编辑添加回车完成编辑功能_easyui datagrid 可编辑表格回车赋值-程序员宅基地

文章浏览阅读1.1k次。可以通过.class绑定失焦事件,最终实现回车完成编辑的功能$('.datagrid-editable .textbox,.datagrid-editable .datagrid-editable-input,.datagrid-editable .textbox-text').bind('keydown', function (e) { var code =..._easyui datagrid 可编辑表格回车赋值

Chapter 3. Introduction to Visual Studio .NET-程序员宅基地

文章浏览阅读707次。Chapter 3. Introduction to Visual Studio .NETOBJECTIVESLearn about creating and working with projects in Visual Studio .NETLearn how to configure the Visual Studio .NET development environmentVisual S

随便推点

系统集成项目管理工程师笔记(3)系统集成技术专业知识_《系统集成项目管理师教程(第3版)》知识点总结笔记-程序员宅基地

文章浏览阅读1.6k次。第三课 系统集成技术专业知识(考试重点) 设备系统集成、应用系统集成1.信息系统建设生命周期:产生阶段、开发阶段、运行阶段和消亡阶段2.信息系统开发方法:结构法方法、快速原型法、企业系统规划方法(BSP)、战略数据规划法、信息工程方法、面向对象方法3.信息系统发展中的四种数据环境:数据文件、应用数据库、主题数据库(业务主题)和信息检索系统4.软件需求包括功能需求、非功能需_《系统集成项目管理师教程(第3版)》知识点总结笔记

解决VS Code集成终端中Node命令不可用的问题_vs终端输入node不是内部指令-程序员宅基地

文章浏览阅读1.6k次。问题:VS Code集成终端中输入node -v提示"node"不是内部命令解决方法:1.右键点击VS Code启动图标,选择属性2.点击兼容性选项卡3.勾选以管理员身份运行4.打开VS Code集成终端,输入node -v 成功_vs终端输入node不是内部指令

C段错误总结-程序员宅基地

文章浏览阅读125次。C段错误总结 2012年01月07日  最近一段时间在linux下用C做一些学习和开发,但是由于经验不足,问题多多。而段错误就是让我非常头痛的一个问题。不过,目前写几百行的代码,也很少出现段错误,或者是即使出现了,也很容易找出来,并且处理掉。  那什么是段错误?段错误为什么是个麻烦事?以及怎么发现程序中的段错误以及如何避免发生段错误呢?  一方面为了给自己的学习做个总结,另一方..._uq669

如何从官网下载最新的jdk API_java官网下载 api-程序员宅基地

文章浏览阅读1.5k次。Java最新官网JDK API文档下载连接及查找方式 连接地址:http://www.oracle.com/technetwork/java/javase/documentation/jdk8-doc-downloads-2133158.html查找方式:1 进入java官网选择Java SE,选择Downloads ,如下路径 2 进入到如下界面_java官网下载 api

王振2020-6-28笔记_王振前端-程序员宅基地

文章浏览阅读138次。# #### 前端的实现原理 socket前端包含(html css js jquery bootstrap)import socketserver = socket.socket()server.bind(("127.0.0.1",9000))server.listen()while True: conn,add = server.accept() client_msg = conn.recv(1024) conn.send(b"HTTP/1.1 200 ok\r\n\r\n _王振前端

freeswitch mod-verto分析_freeswitch verto有杂音-程序员宅基地

文章浏览阅读1k次。https://www.it1352.com/928219.html_freeswitch verto有杂音

推荐文章

热门文章

相关标签