【文本分類-01】Word2vec


目錄

  1. 大綱概述
  2. 數據集合
  3. 數據處理
  4. 預訓練word2vec模型

一、大綱概述

文本分類這個系列將會有8篇左右文章,從github直接下載代碼,從百度雲下載訓練數據,在pycharm上導入即可使用,包括基於word2vec預訓練的文本分類,與及基於近幾年的預訓練模型(ELMo,BERT等)的文本分類。總共有以下系列:

word2vec預訓練詞向量

textCNN 模型

charCNN 模型

Bi-LSTM 模型

Bi-LSTM + Attention 模型

Transformer 模型

ELMo 預訓練模型

BERT 預訓練模型

二、數據集合

數據集為IMDB 電影影評,總共有三個數據文件,在/data/rawData目錄下,包括unlabeledTrainData.tsv,labeledTrainData.tsv,testData.tsv。在進行文本分類時需要有標簽的數據(labeledTrainData),但是在訓練word2vec詞向量模型(無監督學習)時可以將無標簽的數據一起用上。

訓練數據地址:鏈接:https://pan.baidu.com/s/1-XEwx1ai8kkGsMagIFKX_g 提取碼:rtz8

三、數據處理,也即是數據提取  

IMDB 電影影評屬於英文文本,本序列主要是文本分類的模型介紹,因此數據預處理比較簡單,只去除了各種標點符號,HTML標簽,小寫化等。 使用pandas直接處理數據,建議使用apply方法,處理速度比較快,數據處理完之后將有標簽和無標簽的數據合並,並保存成txt文件,放在了preProcess里面。

代碼如下:

    1 	import pandas as pd
    2 	from bs4 import BeautifulSoup   #靈活又方便的網頁解析庫,處理高效,支持多種解析器。利用它不用編寫正則表達式即可方便地實現網頁信息的提取。
    3 	# IMDB 電影影評屬於英文文本,本序列主要是文本分類的模型介紹,因此數據預處理比較簡單,
    4 	# 只去除了各種標點符號,HTML標簽,小寫化等。代碼如下:
    5 	With open ("../data/rawData/unlabeledTrainData.tsv",  "r", encoding='UTF-8') as f:
    6 	    unlabeledTrain = [line.strip().split("\t") for line in f.readlines() if len(line.strip().split("\t")) == 2]
    7 	
    8 	with open("../data/rawData/labeledTrainData.tsv", "r", encoding='UTF-8') as f:
    9 	    labeledTrain = [line.strip().split("\t") for line in f.readlines() if len(line.strip().split("\t")) == 3]
   10 	
   11 	unlabel = pd.DataFrame(unlabeledTrain[1:], columns=unlabeledTrain[0])
   12 	label = pd.DataFrame(labeledTrain[1:], columns=labeledTrain[0])   #多一列數據 sentiment (0/1)
   13 	# print("```````````")
   14 	# print(unlabeledTrain)
   15 	# print(label)
   16 	def cleanReview(subject):
   17 	 # 數據處理函數
   18 	    beau = BeautifulSoup(subject)  
   19 	    newSubject = beau.get_text()
   20 	    newSubject = newSubject.replace("\\", "").replace("\'", "").replace('/','').replace('"', '').replace(',',                                                                                           '').replace('.', '').replace('?', '').replace('(', '').replace(')', '')
   21 	    newSubject = newSubject.strip().split(" ")
   22 	    newSubject = [word.lower() for word in newSubject]
   23 	    newSubject = " ".join(newSubject)
   24 	    return newSubject
   25 	
   26 	unlabel["review"] = unlabel["review"].apply(cleanReview)
   27 	label["review"] = label["review"].apply(cleanReview)
   28 	
   29 	# 將有標簽的數據和無標簽的數據合並
   30 	newDf = pd.concat([unlabel["review"], label["review"]], axis=0)
   31 	# 保存成txt文件
   32 	newDf.to_csv("../data/preProcess/wordEmbdiing.txt", index=False)

四、預訓練word2vec模型

  關於word2vec模型的介紹見這篇。我們使用gensim中的word2vec API來訓練模型。官方API介紹如下:

class gensim.models.word2vec.Word2Vec(sentences=None, corpus_file=None, size=100, alpha=0.025, window=5, min_count=5, max_vocab_size=None, sample=0.001, seed=1, workers=3, min_alpha=0.0001, sg=0, hs=0, negative=5, ns_exponent=0.75, cbow_mean=1, hashfxn=<built-in function hash>, iter=5, null_word=0, trim_rule=None, sorted_vocab=1, batch_words=10000, compute_loss=False, callbacks=(), max_final_vocab=None)

1) sentences:我們要分析的語料,可以是一個列表,或者從文件中遍歷讀出(word2vec.LineSentence(filename) )。

2) size:詞向量的維度,默認值是100。這個維度的取值一般與我們的語料的大小相關,如果是不大的語料,比如小於100M的文本語料,則使用默認值一般就可以了。如果是超大的語料,建議增大維度。

3) window:即詞向量上下文最大距離,window越大,則和某一詞較遠的詞也會產生上下文關系。默認值為5,在實際使用中,可以根據實際的需求來動態調整這個window的大小。如果是小語料則這個值可以設的更小。對於一般的語料這個值推薦在[5;10]之間。

4) sg:即我們的word2vec兩個模型的選擇了。如果是0, 則是CBOW模型;是1則是Skip-Gram模型;默認是0即CBOW模型。

5) hs:即我們的word2vec兩個解法的選擇了。如果是0, 則是Negative Sampling;是1的話並且負采樣個數negative大於0, 則是Hierarchical Softmax。默認是0即Negative Sampling。

6) negative:即使用Negative Sampling時負采樣的個數,默認是5。推薦在[3,10]之間。這個參數在我們的算法原理篇中標記為neg。

7) cbow_mean:僅用於CBOW在做投影的時候,為0,則算法中的xw為上下文的詞向量之和,為1則為上下文的詞向量的平均值。在我們的原理篇中,是按照詞向量的平均值來描述的。個人比較喜歡用平均值來表示xw,默認值也是1,不推薦修改默認值。

8) min_count:需要計算詞向量的最小詞頻。這個值可以去掉一些很生僻的低頻詞,默認是5。如果是小語料,可以調低這個值。

9) iter:隨機梯度下降法中迭代的最大次數,默認是5。對於大語料,可以增大這個值。

10) alpha:在隨機梯度下降法中迭代的初始步長。算法原理篇中標記為η,默認是0.025。

11) min_alpha: 由於算法支持在迭代的過程中逐漸減小步長,min_alpha給出了最小的迭代步長值。隨機梯度下降中每輪的迭代步長可以由iter,alpha, min_alpha一起得出。這部分由於不是word2vec算法的核心內容,因此在原理篇我們沒有提到。

對於大語料,需要對alpha, min_alpha,iter一起調參,來選擇合適的三個值。

word2vec是可以進行增量式訓練的,因此可以實現

一:在輸入值時可以將數據用生成器的形式導入到模型中;

二:可以將數據一個磁盤中讀取出來,然后訓練完保存模型;之后加載模型再從其他的磁盤上讀取數據進行模型的訓練。初始化模型的相似度之后,模型就無法再進行增量式訓練了,相當於鎖定模型了。

    1 	import logging
    2 	import gensim
    3 	from gensim.models import  word2vec
    4 	# 設置輸出日志
    5 	logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
    6 	# 直接用gemsim提供的API去讀取txt文件,讀取文件的API有LineSentence 和 Text8Corpus, PathLineSentences等。
    7 	sentences = word2vec.LineSentence("../data/preProcess/wordEmbdiing.txt")
    8 	# a = list(sentences)
    9 	# print(len(a))
   10 	# 訓練模型,詞向量的長度設置為200, 迭代次數為8,采用skip-gram模型,模型保存為bin格式
   11 	model = gensim.models.Word2Vec(sentences, size=200, sg=1, iter=8)
   12 	model.wv.save_word2vec_format("./word2Vec" + ".bin", binary=True)
   13 	# 加載bin格式的模型
   14 	word2Vec = gensim.models.KeyedVectors.load_word2vec_format("word2Vec.bin",binary=True)

主要參考:

【1】 https://home.cnblogs.com/u/jiangxinyang/

2https://www.cnblogs.com/pinard/p/7278324.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM