为了边看美剧边学英语,我写了个字幕处理脚本
每个英语学渣(好吧,其实这个说的就是学渣本渣了♀)都有这样一个梦想:能够一边轻松愉快地看着美剧,一边自己的英语听力水平还能蹭蹭地往上涨。知乎上也有很多人分享了自己通过美剧练习听力的方法,比如说只开英文字幕或者干脆就不要字幕。但是这两个方法都有自己的缺点,只开英文字幕的方法虽然说避免了下意识只看中文,但是却造成了只看字幕不听读音,从而练习了阅读忽略了听力;不开字幕的方法确实做到了强迫自己必须认真听,可是对于很多人来说,美剧中充满了大量的陌生词汇,比如说:
这句话中的 betrayal 是背叛的名词形式,可能很多人就不认识,或者说认识但是却没听过他的正确发音。这样一来,对这句话的理解就会出现障碍。美剧中还有很多类似情况,用这样的听力材料显然是不适合的。为了应对这种情况,我有了个想法:将字幕中的词汇拆分,并进行词频的检测,如果词频在 4000(可以根据自己的情况进行调整)以内,则将单词删除,如果词频在 4000 以外,则单独标注出该词的中文,效果如下:
这样一来,这句话对于我来说就没有任何词汇上的障碍,假如一遍听不懂,我就可以放心大胆的再听一遍而不必担心是由于词汇的问题造成的理解障碍。
下面介绍程序的大体思路:
首先观察字幕文件,选择后缀名为 srt 的字幕文件用记事本打开如下(其他类型的字幕文件用记事本打开以后格式非常复杂,此处不讨论):
观察文本特点,撰写相应的正则表达式。
虽然在 Python 中使用正则表达式有几个步骤,但每一步都相当简单。
- 用
import re
导入正则表达式模块。 - 用
re.compile()
函数创建一个Regex
对象(记得使用原始字符串)。 - 向
Regex
对象的search()
方法传入想查找的字符串。它返回一个Match
对象。 - 调用
Match
对象的group()
方法,返回实际匹配文本的字符串。
常用的匹配规则:
?
匹配零次或一次前面的分组。*
匹配零次或多次前面的分组。- 匹配一次或多次前面的分组。
{n}
匹配 n 次前面的分组。{n,}
匹配 n 次或更多前面的分组。{,m}
匹配零次到 m 次前面的分组。{n,m}
匹配至少 n 次、至多 m 次前面的分组。{n,m}?
或*?
或?
对前面的分组进行非贪心匹配。^spam
意味着字符串必须以 spam 开始。spam$
意味着字符串必须以 spam 结束。.
匹配所有字符,换行符除外。\d
、\w
和\s
分别匹配数字、单词和空格。\D
、\W
和\S
分别匹配出数字、单词和空格之外的所有字符。[abc]
匹配方括号内的任意字符(诸如 a、b 或 c)。[^abc]
匹配不在方括号内的任意字符
Python中转义字符使用倒斜杠(\
)。字符串'\n'
表示一个换行字符,而不是倒斜杠加上一个小写的n。你需要输入转义字符\\
,才能打印出一个倒斜杠。所以'\\n'
表示一个倒斜杠加上一个小写的 n。但是,通过在字符串的第一个引号之前加上r
,可以将该字符串标记为原始字符串,它不包括转义字符。输入r'\d\d\d-\d\d\d-\d\d\d\d'
,比输入'\\d\\d\\d-\\d\\d\\d-\\d\\d\\d\\d'
要容易得多。
由上述相应规则结合文本特点得到:
#空行、行数标号正则表达式
rgx_none_and_num = re.compile(r'\d{1,2}\n')
#时间正则表达式
rgx_time = re.compile(r'\d\d:\d\d:\d\d,\d\d\d --> \d\d:\d\d:\d\d,\d\d\d\n')
之后,因为要查询词频,我在事先已经准备好了词频表:
要处理表格,需要用到 openpyxl 模块,下面是从电子表格文件中读取单元格涉及的所有函数、方法和数据类型。
- 导入
openpyxl
模块。 - 调用
openpyxl.load_workbook()
函数。 - 取得
Workbook
对象。 - 调用
get_active_sheet()
或get_sheet_by_name()
工作簿方法。 - 取得
Worksheet
对象。 - 使用索引或工作表的
cell()
方法,带上row
和column
关键字参数。 - 取得
Cell
对象。 - 读取
Cell
对象的value
属性。
由上述结合表格内容,建立词库字典:
#词频在4000以后的字典:
wordlist4001 = {}
#事先将名为“1-20000.xlsx”的词频表放在当前工作目录
excel_content = openpyxl.load_workbook('1-20000.xlsx')
sheet = excel_content['Sheet1']
for row in range(4000,20201):wordlist4001[sheet.cell(row,1).value] = sheet.cell(row,2).value
#词频在4000以前的字典:
wordlist4000 = {}
for row in range(1,4001):wordlist4000[sheet.cell(row,1).value] = sheet.cell(row,2).value
所有准备工作完成后,开始读取字幕文件和处理字幕文件,最后新建一个处理过后的字幕文件。完整程序如下:
# -*- coding:utf-8 -*-#导入模块
import re,openpyxl#读入字幕文件
text=open('The.Big.Bang.Theory.s05e05.720p.x264.chs&eng.srt','r')#空行、行数标号正则表达式
rgx_none_and_num = re.compile(r'\d{1,2}\n')#时间正则表达式
rgx_time = re.compile(r'\d\d:\d\d:\d\d,\d\d\d --> \d\d:\d\d:\d\d,\d\d\d\n')#处理字幕文件
first_step = text.readlines()#新建一个字幕文件
new_file = open('C:\\Users\\SYQ\Desktop\\处理版.srt','w')#建立4000后的字典
wordlist4001 = {}
excel_content = openpyxl.load_workbook('1-20000.xlsx')
sheet = excel_content['Sheet1']
for row in range(4000,20201):wordlist4001[sheet.cell(row,1).value] = sheet.cell(row,2).value
#建立4000前的字典
wordlist4000 = {}
for row in range(1,4001):wordlist4000[sheet.cell(row,1).value] = sheet.cell(row,2).value#挑选出文字行进行处理
for line in first_step:#如果为空行,行数标号,则不动if rgx_none_and_num.search(line):new_file.write(line)#如果为时间行则不动elif rgx_time.search(line):new_file.write(line)#如果为字幕行,则处理else:words = line.lower().split()for word in words:#如果单词不在字典中,则跳过if word in wordlist4000:pass#如果单词在字典中,则添加翻译elif word not in wordlist4001:passelse:new_word = word ':' wordlist4001[word] '\n'new_file.write(new_word)#关闭文件
text.close()
new_file.close()
因为我也是一个 python 初学者,因此在实现这个想法的过程中也遇到了很多问题,最后实现的方法可能也显得很笨拙,但是最后实现了还是很开心的,哈哈哈。
----------
本文是我们编程教室新春征稿活动的一篇投稿,来自作者 @ 司夜。他和我们很多读者一样,学习 python 的时间并不长,但已经把 python 应用到自己的日常学习生活中,并整理成文投稿给我们,这很值得肯定。 在实践中应用和 向他人讲解都是非常好的学习方式。不用在意自己写的代码还不够完善, Done is better than perfect!
我们编程教室会持续向所有人开放,如果有投稿或参与志愿者的意向,欢迎随时在公众号里给我们留言。
另外,关于编程与英语的结合,我们之前也有过不少文章,感兴趣的可以阅读:
Crossin:我们用程序整理出了一份Python英语高频词汇表,拿走不谢!
分享一个强大的英汉词典开源数据库
英语 vs 编程
【每周一坑】单词本(此系列可在公众号“ 每周一坑”栏目中查看)
════
其他文章及回答:
学编程:如何自学Python | 新手引导 | 一图学Python
开发案例:智能防挡弹幕 | 红包提醒 | 流浪地球
欢迎搜索及关注:Crossin的编程教室
为了边看美剧边学英语,我写了个字幕处理脚本相关推荐
- python 英语词频统计软件_为了边看美剧边学英语,我写了个字幕处理脚本
每个英语学渣(好吧,其实这个说的就是学渣本渣了)都有这样一个梦想:能够一边轻松愉快地看着美剧,一边自己的英语听力水平还能蹭蹭地往上涨.知乎上也有很多人分享了自己通过美剧练习听力的方法,比如说只开英文字 ...
- python英语词频_为了边看美剧边学英语,我写了个字幕处理脚本
每个英语学渣(好吧,其实这个说的就是学渣本渣了 ♀️)都有这样一个梦想:能够一边轻松愉快地看着美剧,一边自己的英语听力水平还能蹭蹭地往上涨.知乎上也有很多人分享了自己通过美剧练习听力的方法,比如说只 ...
- 看美剧,学英语,背单词,赚美刀
什么?学习背单词还可以赚钱?什么样的平台会给出这样的福利?今天要说的这款"美叨Mumbler"小程序就可以做到.是的,这款小程序最近搞了这样的活动,详细什么情况?下面就来给大家好好 ...
- 学英语看美剧学地道英文必看的10部美剧!
学英语看美剧学地道英文必看的10部美剧 1.Desperate housewives 绝望主妇 时而压抑.时而诙谐.人物性格刻划得鲜明,只是觉得剧情不是那么贴近生活,不过里面的句子还有哲理性,几个主演 ...
- 完整技术帖,看美剧学英语之法
经常打着学英语的旗号看电影,但是又只看中文字幕+画面,就是自欺欺人,一箭单雕就不错了还想一箭双雕. 转自:http://www.douban.com/group/topic/39303301/ 相信很 ...
- 看美剧学英语:《老友记》20句实用英语口语
看美剧学英语:<老友记>20句实用英语口语 <老友记>是许多美剧迷们的入门美剧,经典中的经典,不仅帮你提升口语,更能回忆温暖剧情,今天小编为大家整理20句经典英语口语,赶紧往下 ...
- 【转】不要乱看美剧学英语
[转]不要乱看美剧学英语 babyballoon2009-07-31 14:11 转自Peter Learns To Talk 现在大家最喜欢看的就是美剧,网上看,下载看,买碟看.BT的种子星火燎原, ...
- 看美剧学英语 看一部大片胜过在美生活十天
<飞屋环游记>等经典动画片 英语( 论坛)非常地道,语速相对缓慢,而且语气夸张,比较能吸引中学生们的兴趣. <绝望主妇>用词和语言非常标准. <老友记>被认为最适合 ...
- 看美剧学英语之场景记忆法
转载地址:网址 前一段时间有朋友问了一下如何学习好英语,说实话这个问题有点大,有点严肃,担心误人子弟哦.我就结合自己的心得体会来说一下看美剧学英语利用到的场景记忆法以及如何帮助记忆的原理吧. 最初自己 ...
最新文章
- 自学python还是报班-没有基础想学python为什么一定要报班?
- python可以开多少线程_Python开启线程,在函数中开线程的实例
- 中科燕园GIS外包案例之五---地下管线GIS管理信息系统
- MySQL高级 - 锁 - InnoDB行锁 - 行锁升级为表锁
- 洪水同频率放大的方法_我们应该怎么选择放大器配件?
- 登录注册实现(服务器数据)
- Java并发编程(03):多线程并发访问,同步控制
- WCF发布到IIS 7.0,并以https访问
- java使用Post方式发送https请求的方法,直接可以用
- 关于心理的二十五种倾向(查理#183;芒格)-2
- P2525 Uim的情人节礼物·其之壱(入门,数学)
- 计算机网络操作系统的主要功能和类型,操作系统的五大管理功能和四大分类
- Expo大作战(三十八)--expo sdk api之 FileSystem(文件操作系统)
- POS系统example.launch 的位置_关于信用卡用户使用个人POS机的建议!
- 基于SpringBoot的在线学生请假管理系统的设计与实现毕业设计源码060935
- 程序员申请加班调休被HR拒绝:996是行规,不想加班就滚?
- FPGA跨时钟域打两拍和三拍问题
- 高效率的网站打开速度优化方法
- [ERROR] [MY-012576] [InnoDB] Unable to create temporary file; errno: 30
- Java抓包分析四(基于jnetpcap进行抓包)——分析Http请求数据包