11萬部影視作品揭秘,掌握過半GRE單詞,居然只需看懂20部電影?
(點擊上方公眾號,可快速關注一起學Python)
作者: 何坦瑨 鏈接:
https://mp.weixin.qq.com/s/rddW_N5yzcXe-eVQ5zQGZQ
殺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部
電影!
一、數據來源
感謝射手站長,他將15年來積累的海量字幕數據無私分享出來,供廣大群眾學習研究使用。其中包括對應於26萬部影視作品的66萬份字幕文件,壓縮後大約75G。經過壓縮格式分類,解壓縮,字幕格式分類,編碼轉換,英文識別,數據清理等過程後,得到對應於114198部影視作品的225190份英文字幕文件。
二、數據分析
1. 英文字幕中有多少GRE單詞?
絕大部分英文字幕包涵0-300個GRE單詞,平均值108,方差52,概率分布如下圖。GRE單詞最多的單個字幕文件來自於莎翁的《哈姆萊特/Hamlet》,內含915個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單詞數目,讀者也可以私信詢問本寶寶哦~
附
解壓縮所有字幕壓縮包詳情代碼:
# gz: 即gzip。通常僅僅能壓縮一個文件。與tar結合起來就能夠實現先打包,再壓縮。 # # tar: linux系統下的打包工具。僅僅打包。不壓縮 # # tgz:即tar.gz。先用tar打包,然後再用gz壓縮得到的文件 # # zip: 不同於gzip。儘管使用相似的演算法,能夠打包壓縮多個文件。只是分別壓縮文件。壓縮率低於tar。 #
# rar:打包壓縮文件。最初用於DOS,基於window操作系統。
import
gzipimport
osimport
tarfileimport
zipfileimport
rarfileimport
reimport
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
namesin
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, filenamesin
os.walk(os.path.join(destination_folder)):# for directory in directories:
# print("directory", os.path.join(root, directory))
for
tmp_filein
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
statusif
__name__ =="__main__"
:# 0. change directory
os.chdir("."
)# 1. unzip all zip files
print("----------------------------"
) print("unzip all zip files"
) file_unzipped = []for
tmp_filein
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_linein
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_folderin
os.listdir("generated"
):if
os.path.isdir(os.path.join("generated"
, tmp_folder) ):if
tmp_folder.startswith("shooter_mirror"
):for
tmp_filein
os.listdir(os.path.join("generated"
, tmp_folder)):if
os.path.isfile(os.path.join("generated"
, tmp_folder, tmp_file)):if
tmp_filein
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_folderin
os.listdir("generated"
):if
os.path.isdir(os.path.join("generated"
, tmp_folder) ):if
tmp_folder.startswith("shooter_mirror"
):for
tmp_filein
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個單詞。
(完)
看完本文有收穫?請轉
發分享給更多人
關注「Java技術人
」,做全棧開發工程師
推薦閱讀
常見Python面試題 — 手寫代碼系列
從00-90後的微信昵稱,發現如下規律。。。
你知道 Python 這五個有趣的彩蛋嗎?
推薦閱讀:
※影視圈的階級圖譜
※比徐崢更應封神的人,是他
※那些年我們從軍事電影里看來的常(tao)識(lu)?
※3個國王追求過她,她是影后,也是王妃,但被出軌,結局極慘
※說哭記者,摸彭于晏肌肉,姜文到底是怎樣一個人?