歡迎光臨
每天分享高質量文章

爬了11萬部影視作品發現:看懂這20部電影就能讓你英文詞彙量爆表

導讀:殺G之路漫漫,求索之人蹌蹌。如何邊看電影邊記單詞,娛樂學習兩不誤?且讓大資料告訴我們,究竟哪些影視作品大量出現GRE單詞?看懂多少部影視作品,就可以掌握過半GRE詞彙?

作者:何坦瑨

來源:戀習Python(ID:sldata2017)

知乎連結:https://zhuanlan.zhihu.com/p/42470066

殺G之路漫漫,求索之人蹌蹌。如何邊看電影邊記單詞,娛樂學習兩不誤?且讓大資料告訴我們,究竟哪些影視作品大量出現GRE單詞?看懂多少部影視作品,就可以掌握過半GRE詞彙?

說明:GRE,全稱Graduate Record Examination,中文名稱為美國研究生入學考試,適用於除法律與商業外的各專業,由美國教育考試服務處(Educational Testing Service,簡稱ETS)主辦。GRE是世界各地的大學各類研究生院(除管理類學院,法學院)要求申請者所必須具備的一個考試成績,也是教授對申請者是否授予獎學金所依據的最重要的標準。GRE,首次由美國哈佛,耶魯,哥倫比亞,普林斯頓四所大學聯合舉辦,初期由卡耐基基金會(Carnegie Foundation)承辦,1948年交由新成立的教育測試中心ETS負責。

先放結論:都說沒有調查就沒有發言權,本文透過對11萬部影視作品進行大資料分析,為大家找出那些與GRE最相關的作品。原來包含最多GRE單詞的是哈姆萊特!看懂時長4小時的哈姆萊特可以幫你掌握915個GRE單詞!而掌握過半GRE詞彙,可能只需要看懂20部電影!

01 資料來源

感謝射手站長,他將15年來積累的海量字幕資料無私分享出來,供廣大群眾學習研究使用。其中包括對應於26萬部影視作品的66萬份字幕檔案,壓縮後大約75G。經過壓縮格式分類,解壓縮,字幕格式分類,編碼轉換,英文識別,資料清理等過程後,得到對應於114198部影視作品的225190份英文字幕檔案。

02 資料分析

1. 英文字幕中有多少GRE單詞?

絕大部分英文字幕包涵0-300個GRE單詞,平均值108,方差52,機率分佈如下圖。GRE單詞最多的單個字幕檔案來自於莎翁的《哈姆萊特/Hamlet》,內含915個GRE單詞,難怪讓人如痴如醉!所謂“一千個讀者,就有一千個哈姆萊特”,大概是……看到這些單詞不認識啊!所以就只好亂猜啦,然後每個人都猜得不一樣!反正本寶寶是看得醉了……

▲英文字幕中的GRE單詞分佈

2. 最“學術”的十大影視作品

有的作品包含GRE單詞比較多,但時間也很長。到底哪些影視的“價效比”最高呢?根據GRE單詞佔所有英文詞條的比例排序,以下列出10大最“學術”(GRE單詞佔比最高)的影視作品供參考。其中有來自莎翁的作品有三部——《哈姆萊特/Hamlet》,《麥克白/Macbeth》和《奧塞羅/Othello》,平均每4個不同單詞裡面就有一個可以在紅寶書裡找到!現在,你們知道誰是真正的GRE狂魔了麼!!!

經常有一種錯覺,那些喜歡看紀錄片的同學都逼格很高。現在知道,這並不是錯覺!在top 10高頻GRE電影中,六成是來自Discovery,國家地理和BBC的紀錄片。所以,人家用來思考說話的語言就已經和凡人拉開檔次了好嘛!


3. 看電影背GRE的學習曲線

現在問題來了,走過多少路才叫做成長,最少看完多少電影才學完GRE?考慮到不同影片的單詞大量重覆,這並不是一個簡單的問題。

用數學的語言說,是給定全集U以及一個包含n個集合且這n個集合的並集為全集的集合S,要找到S的一個最小的子集,使得他們的並集等於全集,簡稱最小集合改寫,是一個經典的NP難問題。(?一臉懵逼,能不能說人話!)

翻譯成中文就是說,這個問題很難,非常難,難到本寶寶不會,地球人到現在也沒有找到優雅的解法?……所以本寶寶就偷懶用貪心演演算法做個簡版的回答啦~如果本寶寶每次都觀看可以使當前GRE詞彙量增加最多的一部影片,那麼本寶寶的GRE學習曲線將是如下這樣,紅線表示累計學到的GRE詞彙量,綠線表示每多看一部電影可以學到的GRE新詞數目。

在這時,本寶寶發現了一個秘密:如果看懂x軸上的前20部影片,本寶寶就可以掌握4143個GRE單詞,超過全部8250個GRE單詞的半數!本寶寶決定把這份電影清單分享給大家,如果想要知道特定電影的GRE單詞數目,讀者也可以私信詢問本寶寶哦~


▲GRE單詞學習曲線

附解壓縮所有字幕壓縮包詳情程式碼:

# gz: 即gzip。通常僅僅能壓縮一個檔案。與tar結合起來就能夠實現先打包,再壓縮。

#

# tar: linux系統下的打包工具。僅僅打包。不壓縮

#

# tgz:即tar.gz。先用tar打包,然後再用gz壓縮得到的檔案

#

# zip: 不同於gzip。儘管使用相似的演演算法,能夠打包壓縮多個檔案。只是分別壓縮檔案。壓縮率低於tar。

#

# rar:打包壓縮檔案。最初用於DOS,基於window作業系統。


import gzip

import os

import tarfile

import zipfile

import rarfile

import re

import shutil


# gz

# 因為gz一般僅僅壓縮一個檔案,全部常與其它打包工具一起工作。比方能夠先用tar打包為XXX.tar,然後在壓縮為XXX.tar.gz

# 解壓gz,事實上就是讀出當中的單一檔案

def un_gz(file_name):

"""ungz zip file"""

f_name = file_name.replace(".gz", "")

#獲取檔案的名稱,去掉

g_file = gzip.GzipFile(file_name)

#建立gzip物件

open(f_name, "w+").write(g_file.read())

#gzip物件用read()開啟後,寫入open()建立的檔案裡。

g_file.close()

#關閉gzip物件


# tar

# XXX.tar.gz解壓後得到XXX.tar,還要進一步解壓出來。

# 註:tgz與tar.gz是同樣的格式,老版本號DOS副檔名最多三個字元,故用tgz表示。

# 因為這裡有多個檔案,我們先讀取全部檔案名稱。然後解壓。例如以下:

# 註:tgz檔案與tar檔案同樣的解壓方法。

def un_tar(file_name):

   # untar zip file"""

tar = tarfile.open(file_name)

names = tar.getnames()

if os.path.isdir(file_name + "_files"):

pass

else:

os.mkdir(file_name + "_files")

#因為解壓後是很多檔案,預先建立同名目錄

for name in names:

tar.extract(name, file_name + "_files/")

tar.close()


# zip

# 與tar類似,先讀取多個檔案名稱,然後解壓。例如以下:


def un_zip(file_name, destination_folder=None):

"""unzip zip file"""

zip_file = zipfile.ZipFile(file_name)

if destination_folder == None:

destination_folder = file_name + '_files'

if os.path.isdir(destination_folder):

pass

elif not os.path.exists(destination_folder):

os.makedirs(destination_folder)

else:

destination_folder = destination_folder + '_files'

os.makedirs(destination_folder)

for names in zip_file.namelist():

zip_file.extract(names, destination_folder)

zip_file.close()


# rar

# 由於rar通常為window下使用,須要額外的Python包rarfile。

#

# 可用地址: http://sourceforge.net/projects/rarfile.berlios/files/rarfile-2.4.tar.gz/download

#

# 解壓到Python安裝檔案夾的/Scripts/檔案夾下,在當前窗體開啟命令列,

#

# 輸入Python setup.py install

#

# 安裝完畢。


def un_rar(file_name, destination_folder=None):

"""unrar zip file"""

rar = rarfile.RarFile(file_name)

if destination_folder == None:

destination_folder = file_name + '_files'

if os.path.isdir(destination_folder):

pass

elif not os.path.exists(destination_folder):

os.makedirs(destination_folder)

else:

destination_folder = destination_folder + '_files'

os.makedirs(destination_folder)

# os.chdir(, destination_folder)

rar.extractall(path=destination_folder)

rar.close()


# uncompress zip and rar

def uncompress(file_name, destination_folder=None):

# status == 1 for successful

# status == 0 for error

status = 1


# find destination_folder

if destination_folder == None:

destination_folder = file_name + '_files'

# unrar

if tmp_file[-4:].lower() == '.rar':

# uncompress rar

try:

un_rar(file_name, destination_folder)

status = 1

except:

status = 0

# unzip

elif tmp_file[-4:].lower() == '.zip':

# uncompress rar

try:

un_zip(file_name, destination_folder)

status = 1

except:

status = 0

return status


# uncompress a zip and rar and also uncompress the zip and rar in sub-folders while walking through the tree

def uncompress_tree(file_name, destination_folder=None):

# status == 1 for successful

# status == 0 for error

status = 1


# find destination_folder

if destination_folder == None:

destination_folder = file_name + '_files'

# unrar

if file_name[-4:].lower() == '.rar':

# uncompress rar

try:

un_rar(file_name, destination_folder)

status = 1

except:

status = 0

# unzip

elif file_name[-4:].lower() == '.zip':

# uncompress rar

try:

un_zip(file_name, destination_folder)

status = 1

except:

status = 0


# walk through sub-folders and uncompress

if status == 1:

for root, directories, filenames in os.walk(os.path.join(destination_folder)):

# for directory in directories:

#   print('directory', os.path.join(root, directory))

for tmp_file in filenames:

if tmp_file[-4:].lower() == '.rar' or tmp_file[-4:].lower() == '.zip':

status = uncompress_tree(os.path.join(root, tmp_file), os.path.join(root, tmp_file[:-4]))

os.remove(os.path.join(root, tmp_file))

if status != 1:

break

if status != 1:

break

# if status != 1 and imcomplete folder established, clean all generated files

if status != 1 and os.path.exists(destination_folder):

shutil.rmtree(destination_folder)

return status


if __name__ == '__main__':

# 0. change directory

os.chdir('.')


# 1. unzip all zip files

print('----------------------------')

print('unzip all zip files')

file_unzipped = []

for tmp_file in os.listdir('rsc'):

if os.path.isfile(os.path.join('rsc', tmp_file)):

if re.match('shooter_mirror.*\.zip', tmp_file):

un_zip(os.path.join('rsc', tmp_file),

os.path.join('generated', tmp_file[:-4]))

file_unzipped.append(tmp_file)


print('len(file_unzipped)', len(file_unzipped))

print()


# 2. rename files from zip to get sub-folders which are compresses as .rar and .zip

print('----------------------------')

print('rename all files')

# get mapping dict

with open('rsc/rename_subtitleWeb.txt', 'r') as fr:

data = fr.readlines()


map_dict = {}

for tmp_index, tmp_line in enumerate(data[:]):

if tmp_line.startswith('ren'):

tmp_data = tmp_line.strip().split()

map_dict[tmp_data[1]] = tmp_data[1] + '_' + tmp_data[2].strip('\"')

# print(map_dict)


# rename files

file_renamed = []

file_skipped = []

for tmp_folder in os.listdir('generated'):

if os.path.isdir(os.path.join('generated', tmp_folder) ):

if tmp_folder.startswith('shooter_mirror'):

for tmp_file in os.listdir(os.path.join('generated', tmp_folder)):

if os.path.isfile(os.path.join('generated', tmp_folder, tmp_file)):

if tmp_file in map_dict:

# DEBUG

# if tmp_file != '000001':

#   continue

file_renamed.append(tmp_file)

os.rename(os.path.join('generated', tmp_folder, tmp_file), 

os.path.join('generated', tmp_folder, map_dict[tmp_file]))

else:

file_skipped.append(tmp_file)

file_not_found = sorted(list(set(map_dict) - set(file_renamed)))

# print('file_renamed', file_renamed)

print('file_skipped', file_skipped)

# print('file_not_found', file_not_found)

print('len(file_renamed)', len(file_renamed))

print('len(file_skipped)', len(file_skipped))

print('len(map_dict)', len(map_dict))

print('len(file_not_found)', len(file_not_found))

print()


# 3. uncompress sub-folders

print('----------------------------')

print('uncompress sub-folders')

file_uncompressed = []

file_error = []

file_skipped = []

for tmp_folder in os.listdir('generated'):

if os.path.isdir(os.path.join('generated', tmp_folder) ):

if tmp_folder.startswith('shooter_mirror'):

for tmp_file in os.listdir(os.path.join('generated', tmp_folder)):

if os.path.isfile(os.path.join('generated', tmp_folder, tmp_file)):

if tmp_file[-4:].lower() == '.rar' or tmp_file[-4:].lower() == '.zip':

# uncompress rar or zip

uncompress_status = uncompress_tree(os.path.join('generated', tmp_folder, tmp_file),

os.path.join('generated', 'uncompressed_' + tmp_folder, tmp_file[:-4]))

if uncompress_status == 1:

file_uncompressed.append(tmp_file)

else:

file_error.append(tmp_file)

else:

file_skipped.append(tmp_file) 

# print('file_uncompressed', file_uncompressed)

print('file_error', file_error)

print('file_skipped', file_skipped)

print('len(file_uncompressed)', len(file_uncompressed))

print('len(file_error)', len(file_error))

print('len(file_skipped)', len(file_skipped))



Take away


1. 看懂時長4小時的哈姆萊特就可以幫你掌握915個GRE單詞哦!

2. GRE成績最好的那個同學可能是威廉·莎士比亞。

3. 看紀錄片提高逼格是可以有科學原理的!

4. 學完半數GRE單詞可能只需看懂20部劇作。


註1:並不保證看電影學英語是最高效的GRE的備考方法。
註2:因字幕版本,檔案格式,內容分節等原因,有的作品對應有若干份字幕。
註3:本寶寶蒐集了網上不同版本的GRE詞彙串列,合併起來共8250個單詞。

更多精彩


在公眾號後臺對話方塊輸入以下關鍵詞

檢視更多優質內容!


PPT | 報告 | 讀書 | 書單 | 乾貨

Python | 機器學習 | 深度學習 | 神經網路

區塊鏈 | 揭秘 | 高考 | 數學

猜你想看

Q: 這20部電影你看過幾部

歡迎留言與大家分享

覺得不錯,請把這篇文章分享給你的朋友

轉載 / 投稿請聯絡:baiyu@hzbook.com

更多精彩,請在後臺點選“歷史文章”檢視

贊(0)

分享創造快樂