使用word2vec工具对指定数据集聚类

参考博客https://blog.csdn.net/accumulate_zhang/article/details/52662144


 

一.数据准备阶段

     采用2018年蚂蚁金服举办的竞赛“金融大脑”初赛的数据集,约10万条。(其实可以使用自定义的数据集,这里仅仅是用来做实验)。进行数据清洗:过滤字母,数字和标点符号。使用结巴分词,效果如下图所示:

使用word2vec工具对指定数据集聚类_第1张图片

代码如下所示:环境python2.7

#coding=utf-8
import os
import sys
import codecs
import csv
import string
import jieba
import tensorflow as tf
import sys
import re
reload(sys)
sys.setdefaultencoding( "utf-8" )

jieba.suggest_freq('花呗', True)
jieba.suggest_freq('花贝', True)
jieba.suggest_freq('借呗', True)
jieba.suggest_freq('花贝', True)

#读取原始csv文件,并进行分词
def readcsvfile(read_filename):
    lines_cut=[]
    with open(read_filename) as csvfile:
        for line in csvfile:
            line_cut=''
            cutsen=jieba.cut(line)
            line_cut=' '.join(cutsen)
            line_cut= re.sub(ur"[^\u4e00-\u9fff]", " ", line_cut)
#print(line_cut)
            lines_cut.append(line_cut)
    return lines_cut

#过滤停用词
def filter(stpwrdpath,lines_cut):
    afterfiler_list=[]
    enco_stpword_list=[]
    stpwrd_dic = open(stpwrdpath, 'rb')
    stpwrd_content = stpwrd_dic.read()
#将停用词表转换为list  
    stpwrdlst = stpwrd_content.splitlines()
    for stopword in stpwrdlst:
        enco_stpword=stopword.decode('utf-8')
        enco_stpword_list.append(enco_stpword)
#print (enco_stpword_list)
    stpwrd_dic.close()

    for line in lines_cut:
        new_line=""
        for word in line.split(" "):
            if word not in enco_stpword_list:
                new_line+=word
                new_line+=' '
        print(new_line)
        afterfiler_list.append(new_line)
#print (afterfiler_list)
    return afterfiler_list

#初始的write_filename文件为空
def writetxtfile(write_filename,write_list):
    with open(write_filename,'a') as f:
        for line in write_list:
                f.write(line)
                f.write('\n')

if __name__ == '__main__':
    read_filename="mayi.csv"#原始文档
    write_filename="after_pre.txt"#分词去停用词后的文档
    stpwrdpath = "stop_words.txt"#停用词列表
    cut_list=readcsvfile(read_filename)#读取原始文件,分词
    afterfiler_list=filter(stpwrdpath,cut_list)#去停用词
    writetxtfile(write_filename,afterfiler_list)#预处理后的文档
    

 

其中需增加stop_words.txt停用词文件,该代码输入为mayi.csv,输出为处理后的文件after_pre.txt。处理效果如上图所示。

将after_pre.txt重命名为mayi.txt

二. 从github上下载源代码

https://github.com/svn2github/word2vec如下所示

使用word2vec工具对指定数据集聚类_第2张图片

三. 修改demo-classes.sh文件代码

如下图所示,将make下几行添加注释“#”,然后将画圈的三个地方分别对应:经过分词过滤预处理后的文件,无序的聚类和有序的聚类结果。本例当中聚类数目为500类。

使用word2vec工具对指定数据集聚类_第3张图片

使用word2vec工具对指定数据集聚类_第4张图片

四. 运行命令

sh demo-class.sh运行该命名则可以得到结果

打开mayi_classes.sorted.txt 显示结果如下,可以看出同一类别的词汇有相关性。聚类效果和数据质量和数据类别数有直接关系。通常聚类适合做为数据的预处理,作为中间结果使用,并不作为最终结果应用。

使用word2vec工具对指定数据集聚类_第5张图片

 

你可能感兴趣的:(使用word2vec工具对指定数据集聚类)