1. 程式人生 > >使用word2vec工具對指定資料集聚類

使用word2vec工具對指定資料集聚類

一.資料準備階段

     採用2018年螞蟻金服舉辦的競賽“金融大腦”初賽的資料集,約10萬條。(其實可以使用自定義的資料集,這裡僅僅是用來做實驗)。進行資料清洗:過濾字母,數字和標點符號。使用結巴分詞,效果如下圖所示:

程式碼如下所示:環境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上下載原始碼

三. 修改demo-classes.sh檔案程式碼

如下圖所示,將make下幾行添加註釋“#”,然後將畫圈的三個地方分別對應經過分詞過濾預處理後的檔案,無序的聚類和有序的聚類結果。本例當中聚類數目為500類。

四. 執行命令

sh demo-class.sh執行該命名則可以得到結果

開啟mayi_classes.sorted.txt 顯示結果如下,可以看出同一類別的詞彙有相關性。聚類效果和資料質量和資料類別數有直接關係。通常聚類適合做為資料的預處理,作為中間結果使用,並不作為最終結果應用。