2019年1月4日 星期五

深度學習 - 認識IMDb數據集 - 正反兩面影評

深度學習 - 認識IMDb數據集 - 正反兩面影評

網路電影資料庫(Internet Movie Database,簡稱IMDb),搜集了50000則電影評價,其評價極端的兩極化,不是非常正面就是非常負面。我們可以用此數據做DL練習,此為二分類的練習。

from 
keras.datasets import imdb
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)

此數據當然已經經過keras處理過,用於練習使用,其將電影評論文字檔擷取純文字後,再將所有文字丟進一個word_index() 的dict(),這邊我們只讀取重複10000次以內的字符
(num_words=10000)

接著來看看資料的型態

接著可以看到資料型態是一個0維的純量list data。
>>> train_data.dtype
dtype('O')

我們可以看到train_data[0] 是一大堆數字組成,其實就是word_index 中的value值。
我們來嘗試將這些數字翻譯成文字吧!

前提:首先train_data我們已經知道是經過將文字轉成數字的資料型態處理。


目標:想知道處理之前的train_data是什麼文章內容?


思路:先理解train_data[0]怎麼來的?
  1. 將所有文章的文字符建立一個dict(),每個文字會對應一個value,即word_index['word':value] 這樣的dict()。
  2. 影評文章 film_review[0] = ['word1','word2','word3'....'wordx'] 對應word_index的value抓出來建立一個list。
  3. 程式碼可能如下(自己推測):
  4. 以第1篇影評文章為例:  (若要輸入n篇文章,使用for迴圈 j到n film_review[j] )
    train_data=[]
    train_data.append([word_index.get('%s'%i,0) for i in film_review[0]])
    其中,dict.get(key,defaut=none) 指定輸入key,返回對應value,若找無此key則返回none。 key 若為純文字,需要將文字格式化,我使用%s來達成。


  5. 這邊知道train_data怎麼來的之後,現在要做的就是將指定value找回對應key值,所以會需要一個reverse_word_index() 來做這件事情。
  6. reverse_word_index = dict([(value, key) for (key, value) in word_index.items()])

  7. 最後,建立一個翻譯的list來存放decode的文字資料。
  8. translate_film_review = ' '.join(
        [reverse_word_index.get(i - 3, '?') for i in train_data[0]])

貼上練習程式碼:
from keras.datasets import imdb
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)

word_index = imdb.get_word_index()
reverse_word_index = dict([(value, key) for (key, value) in word_index.items()])
decoded_review = ' '.join([reverse_word_index.get(i - 3, '?') for i in train_data[0]])
translate_film_review = ' '.join(
    [reverse_word_index.get(i - 3, '?') for i in train_data[0]])

這邊貼上之前練習將文章轉成文字list的片段程式碼 (單字出現頻率統計練習
import re
fp = open("/Users/lido/Library/Preferences/PyCharmCE2018.3/scratches/sample.txt","r")
article = fp.read()
new_article = re.sub("[^a-zA-Z\s]","",article)
words = new_article.split()
word_counts={}
for word in words:
    if word.lower() in word_counts:
        word_counts[word.lower()] = word_counts[word.lower()] +1    else:
        word_counts[word.lower()] = 1

key_list = list(word_counts.keys())

練習將之前的文章轉成word_index中的value顯示
news_review=[]
news_review.append([word_index.get('%s'%i,0) for i in key_list])
print(news_review)

也可以使用下面方法:
"""for i in key_list:
a=word_index.get('%s'%i)
print(a)
news_review.append(a)"""

輸出結果:



沒有留言:

張貼留言