利用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上,傳送門
我們將我們爬取下來的圖片給轉化為詞向量,下面我們就可以通過機器學習的方法來訓練我們的模型啦。