1. 程式人生 > >利用Word2vec將旅遊評論資料轉化為詞向量

利用Word2vec將旅遊評論資料轉化為詞向量

實訓結束有段時間啦,我準備吧實訓的所有的東西整理整理,然後安心複習考研。

我們將所有扒了下來之後資料整理之後的資料截圖如下:

我們訓練好的模型截圖為(因為訓練好的模型大概有500MB,無法用記事本開啟,所以只能用python讀取之後截圖)

                           

具體的步驟是我們先將自己爬取的資料先進行分詞處理,然後用維基百科的word2vec來提取自己的分詞向量。

一、分詞

分詞就是將連續的字序列按照一定的規範重新組合成詞序列的過程。將我們爬取下來的句子變成一個個詞。後面我們需要將詞用詞向量表示,然後將這個一句話的用詞向量表示。還有一點就是亂碼問題。在對句子進行操作時,需要看看是否亂碼,一旦亂碼就需要將它進行轉碼。具體實現程式碼

for idx, row in reviews.iterrows():
    print (idx)
    review_content = row['comment']
    seg_list = jieba.cut(str(review_content), cut_all=False)
    word_list = [item for item in seg_list if len(item) > 1]
    text_list.append(word_list)

處理完之後我們會得到一個包含所有分詞的text_list。這裡包含所有的分詞,我們後面的操作也是對它進行操作。text_list截圖如下

二、獲取詞向量

詞向量的轉化的方法有Bag of Words(BOW)、TF-IDF、Word2Vec,最新還有一個doc2vec,據說效果更好。我們採用Word2Vec。

獲取特徵詞向量的主要步驟如下:

  • 1)讀取模型詞向量矩陣;
  • 2)遍歷語句中的每個詞,從模型詞向量矩陣中抽取當前詞的數值向量,一條語句即可得到一個二維矩陣,行數為詞的個數,列數為模型設定的維度;
  • 3)根據得到的矩陣計算矩陣均值作為當前語句的特徵詞向量;
  • 4)全部語句計算完成後,拼接語句類別代表的值,寫入csv檔案中

具體程式碼實現:

 返回特徵詞向量
def getWordVecs(wordList, model):
    vecs = []
    for word in wordList:
        word = word.replace('\n', '')
        # print word
        try:
            vecs.append(model[word])
        except KeyError:
            continue
    return np.array(vecs, dtype='float')
# 構建文件詞向量
def buildVecs(filename, model,numm):
    fileVecs = []
    n=[]
    for line in filename:
        numm = numm + 1
        logger.info("Start line: " + str(line))
        wordList = line
        vecs = getWordVecs(wordList, model)
        # print vecs
        # sys.exit()
        # for each sentence, the mean vector of all its vectors is used to represent this sentence
        if len(vecs) > 0:
            vecsArray = sum(np.array(vecs)) / len(vecs)  # mean
            # print vecsArray
            # sys.exit()
            fileVecs.append(vecsArray)
        else :
            print (numm)
            n.append(numm)
    return fileVecs,n

這樣我們就得到我們需要的詞向量。由於我這邊最後的結果有6個等級,所以需要將這6個等級依次輸入,具體程式碼如下

num0=0
num1=0
num2=0
num3=0
num4=0
num5=0
s0=reviews[reviews["score"]==0].index.values
s1=reviews[reviews["score"]==1].index.values
s2=reviews[reviews["score"]==2].index.values
s3=reviews[reviews["score"]==3].index.values
s4=reviews[reviews["score"]==4].index.values
s5=reviews[reviews["score"]==5].index.values
s0vecs,num0kong=buildVecs(text_list[s0[0]:s0[-1]+1],model,num0)
s1vecs,num1kong=buildVecs(text_list[s1[0]:s1[-1]+1],model,num1)
s2vecs,num2kong=buildVecs(text_list[s2[0]:s2[-1]+1],model,num2)
s3vecs,num3kong=buildVecs(text_list[s3[0]:s3[-1]+1],model,num3)
s4vecs,num4kong=buildVecs(text_list[s4[0]:s4[-1]+1],model,num4)
s5vecs,num5kong=buildVecs(text_list[s5[0]:s5[-1]+1],model,num5)
sumkong=[]
for i in num1kong:
    sumkong.append(len(s0)+i)
for i in num2kong:
    sumkong.append(len(s0)+i+len(s1))
for i in num3kong:
    sumkong.append(len(s0)+i+len(s1)+len(s2))
for i in num4kong:
    sumkong.append(len(s0)+i+len(s1)+len(s2)+len(s3))
for i in num5kong:
    sumkong.append(len(s0)+i+len(s1)+len(s2)+len(s3)+len(s4))

# s5vecs=buildVecs(reviews[s5[0]:s5[-1]+1],model)
# s5vecs=buildVecs(reviews[reviews["score"]==5]["comment"],model)
Y = np.concatenate((np.zeros(len(s0)), np.ones(len(s1)),np.array(len(s2)*[2]),np.array(len(s3)*[3]),np.array(len(s4)*[4]),np.array(len(s5)*[5])))
# Y=np.concatenate((Y,np.array(len(s4)*[4]),np.array(len(s5)*[5]),np.array(len(s3)*[3])))
Y=np.delete(Y, sumkong, 0)
sumvecs=[]
sumvecs=s0vecs+s1vecs+s2vecs+s3vecs+s4vecs+s5vecs

我們還需要載入模型,程式碼如下

model = gensim.models.KeyedVectors.load_word2vec_format(r"J:\word2vec\wiki_zh_word2vec\wiki.zh.text.vector", binary=False)

然後儲存自己的檔案

df_x = pd.DataFrame(sumvecs)
df_y = pd.DataFrame(Y)
data = pd.concat([df_y, df_x], axis=1)
print( data)
data.to_csv(r"C:\Users\Administrator\Desktop\vvvv.csv")

這樣我們就得到想要的詞向量啦。

三、一些說明

這個有一個說明就是停用詞。停用詞相當於一些沒用的詞,如“的”、“了”等這些無用的詞,無法表達任何含義的詞,還有一些比如說句號、逗號、冒號這些標點符號也沒用,也需要去掉。去掉這些沒用的詞既可以減少計算量,也可以提高準確率。本文沒有去掉,主要是因為沒有時間做這些了,實訓時間太緊了。

程式碼已上傳到github上,傳送門

我們將我們爬取下來的圖片給轉化為詞向量,下面我們就可以通過機器學習的方法來訓練我們的模型啦。

參考文獻