日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

wordcloud里面设置mask加载不出来词频_一条龙搞定情感分析:文本预处理、加载词向量、搭建RNN

發(fā)布時間:2025/3/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 wordcloud里面设置mask加载不出来词频_一条龙搞定情感分析:文本预处理、加载词向量、搭建RNN 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

IMDB Sentiment Classification from scratch

Author: Beyond

Time: 2019.04.26

情感分析是上手NLP的最簡單的任務之一,它就是一個簡單的文本分類問題,判斷一段文本的情感極性。最簡單的就是二分類,判斷是積極的還是消極的;更難一點的就是三分類,除了積極消極還有無情感傾向的;更加復雜的就比如情感打分,例如電影打1~5分,這就是五分類。但本質上都一樣,無非類別太多更難以學習罷了。
IMDB是一個專業(yè)的電影評論網(wǎng)站,類似國內(nèi)的豆瓣,IMDB的電影評論數(shù)據(jù)是大家經(jīng)常使用來練手的情感分析數(shù)據(jù)集,也是各種比賽,如Kaggle,和各種學者做研究常用的數(shù)據(jù)集。


本文嘗試用這個數(shù)據(jù)做一個情感二分類,作為一個NLP的練手。具體涉及到:

  • 文本預處理;
  • 預訓練詞向量的加載;
  • 采用RNNs訓練模型
  • 數(shù)據(jù)集地址:http://ai.stanford.edu/~amaas/data/sentiment/

    本文采用Keras作為框架在進行模型搭建。

    本文目錄:

    一、文本預處理&訓練測試集的準備

    1.數(shù)據(jù)集

    ①關于數(shù)據(jù)集

    其實,keras自帶了IMDB的已經(jīng)進行很好的預處理的數(shù)據(jù)集,可以一行代碼下載,不需要進行任何的處理就可以訓練,而且效果比較好。但是,這樣就太沒意思了。在真實場景中,我們拿到的都是臟臟的數(shù)據(jù),我們必須自己學會讀取、清洗、篩選、分成訓練集測試集。而且,從我自己的實踐經(jīng)驗來看,數(shù)據(jù)預處理的本事才是真本事,模型都好搭,現(xiàn)在的各種框架已經(jīng)讓搭建模型越來越容易,但是數(shù)據(jù)預處理只能自己動手。所有往往實際任務中,數(shù)據(jù)預處理花費的時間、精力是最多的,而且直接影響后面的效果。

    另外,我們要知道,對文本進行分析,首先要將文本數(shù)值化。因為計算機不認字的,只認數(shù)字。所以最后處理好的文本應該是數(shù)值化的形式。而keras自帶的數(shù)據(jù)集全都數(shù)值化了,而它并不提供對應的查詢字典讓我們知道每個數(shù)字對應什么文字,這讓我們只能訓練模型,看效果,無法拓展到其他語料上,也無法深入分析。綜上,我上面推薦的數(shù)據(jù)集,是原始數(shù)據(jù)集,都是真實文本,當然,為了方便處理,也已經(jīng)被斯坦福的大佬分好類了。但是怎么數(shù)值化,需要我們自己動手。

    下載后解壓,會看到有兩個文件夾,test和train:

    我們點進train中,會發(fā)現(xiàn)正樣本和負樣本已經(jīng)分好類了:

    neg和pos分別是負樣本和正樣本,unsup是未標注的樣本,可用后續(xù)需要采用。其他的都自己去看看吧。

    打開pos文件,看看里面啥樣:

    都是一個個文本。

    注意到,這些文本一般都不短...

    數(shù)據(jù)集中,共有5w條文本,test集和train集各半,每個集合中,pos和neg也是各半。

    當然,他們劃分的train和test,你不一定真的要這樣用。例如本文中,我為了方便,就吧train集合當做我所有的數(shù)據(jù),在這2.5w條數(shù)據(jù)中再按照7:3劃分train set和test set.

    ②導入數(shù)據(jù)集的代碼

    import os datapath = r'datasetsaclImdb_v1train' pos_files = os.listdir(datapath+'/pos') neg_files = os.listdir(datapath+'/neg') print(len(pos_files)) print(len(neg_files))

    輸出:

    12500 12500

    所以我們總共有12500個正樣本和12500個負樣本。

    import numpy as np pos_all = [] neg_all = [] for pf,nf in zip(pos_files,neg_files):with open(datapath+'/pos'+'/'+pf,encoding='utf-8') as f:s = f.read()pos_all.append(s)with open(datapath+'/neg'+'/'+nf,encoding='utf-8') as f:s = f.read()neg_all.append(s) print(len(pos_all)) print(len(neg_all)) X_orig = np.array(pos_all+neg_all) Y_orig = np.array([1 for _ in range(12500)] + [0 for _ in range(12500)]) print("X_orig:",X_orig.shape) print("Y_orig:",Y_orig.shape)

    上面代碼的主要作用是把一個個樣本放進正負樣本對應的列表中,同時配上對應的label。代碼很好理解。

    輸出:

    12500 12500 X_orig: (25000,) Y_orig: (25000,)

    2.文本數(shù)值化

    ①文本數(shù)值化的思路

    前面提到過,NLP問題比CV問題更難的一部分原因,就是文本都是離散化的數(shù)據(jù),不像圖像數(shù)據(jù)都是連續(xù)的數(shù)值數(shù)據(jù),所以我們要想辦法把一系列文本轉化成一系列數(shù)字。

    這里的方法很多,我們這里采用的方法是,給詞匯表中每一個詞一個index,用index代替那個詞。如一個語料庫共有1w個詞,那么就設置1w個index,每個詞直接替換程index就行。

    但是,很多問題中,詞匯量巨大,但是可能大部分詞都是低頻詞,對訓練模型的貢獻很小,反而會嚴重拖累模型的訓練。所以,一般我們可以分析一下文本詞匯的詞頻分布特征,選取詞頻占大頭的一批詞就行了。

    例如,在本文的任務中,數(shù)據(jù)集共涉及到的詞匯量有8~9w,這樣訓練起來會很慢。經(jīng)過分析,發(fā)現(xiàn)大概2w個詞就已經(jīng)覆蓋了絕大部分篇幅,所以我就選取詞典大小為2w。然后,對文本數(shù)值化的時候,那些低頻詞就直接過濾掉了,只留下高頻詞。這樣,模型訓練起來效率就會大大提高。

    詞向量

    如果你接觸過詞向量,那么一定會想到可以使用詞向量吧文本轉化成數(shù)值類型。不錯,我們在本文中也會這么做。但是,如果直接吧文本轉化成詞向量,輸入進模型的話,我們可能無法繼續(xù)調優(yōu)(fine-tune),詞向量相當于是對文本的特征的一種表示,本身性質已經(jīng)很好了。但是對于特定任務場景,我們一般都希望可以在訓練好的詞向量的基礎上,繼續(xù)用對應領域的數(shù)據(jù)對詞向量進一步進行優(yōu)化。所以,今天我們會探索,如果在加入詞向量后,可以接著fine-tune。

    ②文本數(shù)值化,詞向量導入的代碼

    keras自帶的文本預處理的工具十分好用,具體可參加我單獨寫的一個短文:https://beyondguo.github.io/2019-03-18-Keras-Text-Preprocessing/

    我們設置詞典大小為20000,文本序列最大長度為200.

    from keras.preprocessing.text import text_to_word_sequence,one_hot,Tokenizer from keras.preprocessing.sequence import pad_sequences import time vocab_size = 20000 maxlen = 200 print("Start fitting the corpus......") t = Tokenizer(vocab_size) # 要使得文本向量化時省略掉低頻詞,就要設置這個參數(shù) tik = time.time() t.fit_on_texts(X_orig) # 在所有的評論數(shù)據(jù)集上訓練,得到統(tǒng)計信息 tok = time.time() word_index = t.word_index # 不受vocab_size的影響 print('all_vocab_size',len(word_index)) print("Fitting time: ",(tok-tik),'s') print("Start vectorizing the sentences.......") v_X = t.texts_to_sequences(X_orig) # 受vocab_size的影響 print("Start padding......") pad_X = pad_sequences(v_X,maxlen=maxlen,padding='post') print("Finished!")

    上面的代碼可以第一次讀會比較難理解,這里稍微解釋一下:

    Tokenizer是一個類,可以接收一個vocab_size的參數(shù),也就是詞典大小。設置了詞典大小后,在后面生成文本的向量的時候,會把那些低頻詞(詞頻在20000開外的)都篩掉。

    定義了Tokenizer的一個實例t,然后調用方法t.fit_on_texts(X_orig)的作用,就是把我們所有的預料丟進去,讓t去統(tǒng)計,它會幫你統(tǒng)計詞頻,給每個詞分配index,形成字典等等。

    想獲取index和詞的對照字典的話,就使用t.word_index方法。注意,獲取字典的時候,不會篩掉那些低頻詞,是所有詞的一個字典。

    然后,想把一個句子、段落,轉化成對應的index表示的向量怎么辦呢?Tokenizer也提供了便捷的方法,不用你自己去慢慢查表,直接使用t.texts_to_sequences(X_orig)方法,就可以獲取每句話的index組成的向量表示。注意,這里,就已經(jīng)吧低頻詞給過濾掉了,比如一句話有100個詞,其中有30個低頻詞,那么經(jīng)過這個函數(shù),得到的就是長度為70的一個向量。

    得到每個句子的向量后,會發(fā)現(xiàn)大家長度各有不同,長的長短的短,這樣在后面的RNNs訓練時,就不方便批處理。所以,我們還需要對句子進行一個padding(填白,補全),把所有句子弄程統(tǒng)一長度,短的補上0,長的切掉。用的方法就是pad_sequences。

    上面代碼的輸出是:

    Start fitting the corpus...... all_vocab_size 88582 Fitting time: 9.10555362701416 s Start vectorizing the sentences....... Start padding...... Finished!

    可以看到,我們2.5w個文本,幾百萬詞,丟進去統(tǒng)計,效率還是挺高的,不到10秒就統(tǒng)計好了。

    剛剛說了,獲取字典的時候,不會篩掉那些低頻詞,是所有詞的一個字典。但后面我們需要只保留那些高頻詞的一個字典,所以需要進行這樣一個操作,形成一個高頻詞字典:

    import copy x = list(t.word_counts.items()) s = sorted(x,key=lambda p:p[1],reverse=True) small_word_index = copy.deepcopy(word_index) # 防止原來的字典也被改變了 print("Removing less freq words from word-index dict...") for item in s[20000:]:small_word_index.pop(item[0]) print("Finished!") print(len(small_word_index)) print(len(word_index))

    輸出:

    Removing less freq words from word-index dict... Finished! 20000 88582

    詞向量的導入:

    import gensim model_file = '../big_things/w2v/GoogleNews-vectors-negative300.bin' print("Loading word2vec model......") wv_model = gensim.models.KeyedVectors.load_word2vec_format(model_file,binary=True)

    這里采用Google發(fā)布的使用GoogleNews進行訓練的一個300維word2vec詞向量。這個讀者可以自行去網(wǎng)上下載。如果無法下載,可以到公眾號留言申請。

    現(xiàn)在,我們需要把這個詞向量,跟我們本任務中的詞匯的index對應起來,也就是構建一個embedding matrix這樣就可以通過index找到對應的詞向量了。方法也很簡單:

    先隨機初始化一個embedding matrix,這里需要注意的是,我們的詞匯量vocab_size雖然是20000,但是訓練的時候還是會碰到不少詞不在詞匯表里,也在詞向量也查不到,那這些詞怎么處理呢?我們就需要單獨給這些未知詞(UNK)一個index,在keras的文本預處理中,會默認保留index=0給這些未知詞。

    embedding_matrix = np.random.uniform(size=(vocab_size+1,300)) # +1是要留一個給index=0 print("Transfering to the embedding matrix......") # sorted_small_index = sorted(list(small_word_index.items()),key=lambda x:x[1]) for word,index in small_word_index.items():try:word_vector = wv_model[word]embedding_matrix[index] = word_vectorexcept:print("Word: [",word,"] not in wvmodel! Use random embedding instead.") print("Finished!") print("Embedding matrix shape:n",embedding_matrix.shape)

    通過上面的操作,所有的index都對應上了詞向量,那些不在word2vec中的詞和index=0的詞,詞向量就是隨機初始化的值。

    3.劃分訓練集和測試集

    劃分訓練集和測試集,當然使用經(jīng)典的sklearn的train_test_split了。

    廢話少說,直接上代碼:

    from sklearn.model_selection import train_test_split np.random.seed = 1 random_indexs = np.random.permutation(len(pad_X)) X = pad_X[random_indexs] Y = Y_orig[random_indexs] print(Y[:50]) X_train, X_test, y_train, y_test = train_test_split(X,Y,test_size=0.2) print("X_train:",X_train.shape) print("y_train:",y_train.shape) print("X_test:",X_test.shape) print("y_test:",y_test.shape) print(list(y_train).count(1)) print(list(y_train).count(0))

    輸出:

    [0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 1 1 1 0 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 11 0 1 0 1 1 0 1 0 0 1 1 0] X_train: (20000, 200) y_train: (20000,) X_test: (5000, 200) y_test: (5000,) 9982 10018

    訓練樣本2w,測試樣本5k.

    唯一值得注意的一點就是,由于前面我們加載數(shù)據(jù)集的時候,正樣本和負樣本都聚在一塊,所以我們在這里要把他們隨機打亂一下,用的就是numpy的random.permutation方法。這些都是慣用伎倆了。

    恭喜!您已閱讀本文80%的內(nèi)容!

    二、搭建模型跑起來

    做完了數(shù)據(jù)的預處理,后面的東西,就都是小菜一碟了。那么多框架是干嘛的?就是為了讓你用盡可能少的代碼把那些無聊的事情給做了!Keras尤其如此。

    1.模型的結構設計

    處理NLP問題,最常用的模型的就是RNN系列,LSTM和GRU隨便用。然后,一般還會在前面加一個embedding層。

    之前我一直以為embedding層就是把預訓練好的詞向量加進去,實際上不是。即使沒有訓練好的詞向量,我們也可以使用embedding層。因為我們可以用我們的訓練數(shù)據(jù),來訓練出詞的embedding,只不過這個embedding不同于word2vec的那種表達詞的含義的embedding,更多的是針對特定場景下的一個embedding。(不知道這樣說有沒有說清楚...)

    所以,我們直接配置一個embedding層,不提供詞向量都可以訓練。如果提供了詞向量,這樣可以加速我們的訓練,相當于我們已經(jīng)有一個訓練好的參數(shù),提供給了模型,模型無非就需要接著改一改即可,而不是從一個隨機的狀態(tài)來慢慢訓練。

    2. 模型的搭建

    Talk is cheap, the code below is also cheap:

    import keras from keras.models import Sequential,Model from keras.layers import Input,Dense,GRU,LSTM,Activation,Dropout,Embedding from keras.layers import Multiply,Concatenate,Dotinputs = Input(shape=(maxlen,)) use_pretrained_wv = True if use_pretrained_wv:wv = Embedding(VOCAB_SIZE+1,wv_dim,input_length=MAXLEN,weights=[embedding_matrix]) (inputs) else:wv = Embedding(VOCAB_SIZE+1,wv_dim,input_length=MAXLEN)(inputs)h = LSTM(128)(wv) y = Dense(1,activation='sigmoid')(h) m = Model(input=inputs,output=y) m.summary()m.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy']) m.fit(X_train,y_train,batch_size=32,epochs=3,validation_split=0.15)

    從上面的代碼可以知道,想要把預訓練的word2vec詞向量加入到模型中,就是把詞向量作為embedding層的參數(shù)(weights),具體我們需要先構建一個embedding matrix,這個我們在前面已經(jīng)構建好了,然后傳進embedding層即可。

    運行!輸出:

    _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_7 (InputLayer) (None, 200) 0 _________________________________________________________________ embedding_7 (Embedding) (None, 200, 128) 2560128 _________________________________________________________________ lstm_7 (LSTM) (None, 128) 131584 _________________________________________________________________ dense_7 (Dense) (None, 1) 129 ================================================================= Total params: 2,691,841 Trainable params: 2,691,841 Non-trainable params: 0 _________________________________________________________________ Train on 17000 samples, validate on 3000 samples Epoch 1/3 17000/17000 [==============================] - 178s 10ms/step - loss: 0.6711 - acc: 0.5692 - val_loss: 0.6701 - val_acc: 0.5697 Epoch 2/3 17000/17000 [==============================] - 168s 10ms/step - loss: 0.5964 - acc: 0.6479 - val_loss: 0.5072 - val_acc: 0.7940 Epoch 3/3 17000/17000 [==============================] - 169s 10ms/step - loss: 0.5104 - acc: 0.7171 - val_loss: 0.4976 - val_acc: 0.7943

    可以發(fā)現(xiàn),參數(shù)的大部分,都是embedding層的參數(shù)。所以,讀者可以嘗試一下將詞向量參數(shù)固定,可以發(fā)現(xiàn)訓練速度會快得多。但是效果可能會略差一些。

    建議讀者對比一下:

    ①不使用word2vec作為embedding的參數(shù)

    ②使用word2vec作為embedding的參數(shù)并固定參數(shù)

    ③使用word2vec作為embedding的參數(shù)并繼續(xù)fine-tune

    相信會有一些有意思的發(fā)現(xiàn)。

    但是你可能沒時間(~~多半是懶!~~),所以這里我也告訴大家我的實驗結果:

    ①效果最差,時間最長

    ②效果最好,時間較長

    ③效果中等,時間最快


    本文帶著讀者詳細的了解了使用keras進行文本預處理,如何將詞向量加入到訓練模型中提升性能,動手的讀者更可以體會到不同詞向量使用方法的差別。
    這里,我們差不多直觀上感受到了NLP是啥感覺,后面的文章,會主要探討一下Attention機制在這個基礎上的應用,然后我們還會嘗試使用CNN來做一下同樣的任務,看看效果如何。相信我們會有新的發(fā)現(xiàn)!

    如果喜歡我的教程,歡迎關注我的專欄:
    【 DeepLearning.ai學習筆記】
    和我一起一步步學習深度學習。
    歡迎來微信公眾號 SimpleAI 踩踩喲ヾ(????)ノ"~專欄文章目錄:
    Hello NLP(1)——詞向量Why&How
    【DL筆記1】Logistic回歸:最基礎的神經(jīng)網(wǎng)絡
    【DL筆記2】神經(jīng)網(wǎng)絡編程原則&Logistic Regression的算法解析
    【DL筆記3】一步步用python實現(xiàn)Logistic回歸
    【DL筆記4】神經(jīng)網(wǎng)絡詳解,正向傳播和反向傳播
    【DL筆記5】TensorFlow搭建神經(jīng)網(wǎng)絡:手寫數(shù)字識別
    【DL筆記6】從此明白了卷積神經(jīng)網(wǎng)絡(CNN)
    【DL筆記7】他山之玉——窺探CNN經(jīng)典模型
    【DL筆記8】如果你愿意一層一層剝開CNN的心
    【DL筆記9】搭建CNN哪家強?TF,Keras誰在行?
    【DL碎片1】神經(jīng)網(wǎng)絡參數(shù)初始化的學問
    【DL碎片2】神經(jīng)網(wǎng)絡中的優(yōu)化算法
    【DL碎片3】神經(jīng)網(wǎng)絡中的激活函數(shù)及其對比
    【DL碎片4】深度學習中的的超參數(shù)調節(jié)
    【DL碎片5】深度學習中的正則化Regularization

    總結

    以上是生活随笔為你收集整理的wordcloud里面设置mask加载不出来词频_一条龙搞定情感分析:文本预处理、加载词向量、搭建RNN的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 操碰视频在线 | 麻豆美女视频 | 亚洲v欧美v另类v综合v日韩v | 国产精品精品久久久久久 | 日本中文在线观看 | 熟妇高潮精品一区二区三区 | 亚洲操一操 | 91精品国产手机 | 亚洲精品a区 | 波多野结衣中文字幕一区二区三区 | 日本美女毛茸茸 | 国产精品自拍在线 | 天天插伊人 | 三上悠亚在线观看一区二区 | 影音先锋中文字幕在线 | 91网站在线观看视频 | 在线精品自拍 | 奇米一区二区三区 | 日本一区二区三区免费电影 | 中国肥胖女人真人毛片 | 嫩模被强到高潮呻吟不断 | 69视频一区二区 | 成人区人妻精品一熟女 | 天堂久久精品 | 91国偷自产一区二区三区老熟女 | 国产免费看av | www.在线播放| 久久人人做 | 欧美日韩69| 亚洲A∨无码国产精品 | 欧美视频日韩视频 | 五月av在线 | 国产超级av| 午夜精品一区二区三区在线播放 | 色中色在线视频 | 日本成人免费视频 | 黄色av电影在线观看 | 国产尤物视频 | 亚洲AV成人精品 | 奇米色影视 | 美国一级片网站 | 四虎影院在线 | 无套在线观看 | av在线不卡免费看 | 黑人干亚洲女人 | 原来神马电影免费高清完整版动漫 | 亚洲AV成人无码网站天堂久久 | 亚洲高清视频一区二区 | 免费午夜视频在线观看 | 日日夜夜国产 | 日本五十路女优 | 男女啊啊啊 | 成人av在线资源 | 久久午夜夜伦鲁鲁片无码免费 | 日韩v在线 | 爆操巨乳美女 | 国产特黄一级片 | aa视频在线| 进去里视频在线观看 | 欧美成人精品一区 | 天堂亚洲精品 | 挪威xxxx性hd极品 | free性丰满69性欧美 | 欧美女优视频 | 天天射天天操天天干 | 亚洲欧美一区二区三区情侣bbw | 国产亚洲精品久久久久婷婷瑜伽 | 成人爽爽视频 | 爽爽影院免费观看 | 日本护士体内she精2xxx | 乱xxxxx普通话对白 | 毛片视频播放 | 番号动态图 | 亚洲欧美一区二区精品久久久 | 毛片女人| 激情深爱五月 | 黄色的网站在线观看 | jizz中国少妇高潮出水 | 99精品在线免费观看 | 337p亚洲精品色噜噜狠狠 | 国产美女免费无遮挡 | 波多野结衣电影在线播放 | 黄色精品免费 | 欧美巨大荫蒂茸毛毛人妖 | 日本一区二区免费电影 | 成人作爱视频 | 波多野吉衣在线视频 | 永久福利视频 | 日本精品在线播放 | 99免费在线观看视频 | 欧美日本免费 | 亚洲欧美综合久久 | 日本三级中文 | 91久久一区二区三区 | 日本美女一区 | 国产又黄又粗又猛又爽 | 免费网站www在线观看 | 欧美猛操 | 四虎成人精品永久免费av |