专栏首页Crossin的编程教室为了边看美剧边学英语,我写了个字幕处理脚本

为了边看美剧边学英语,我写了个字幕处理脚本

每个英语学渣(好吧,其实这个说的就是学渣本渣了

)都有这样一个梦想:能够一边轻松愉快地看着美剧,一边自己的英语听力水平还能蹭蹭地往上涨。知乎上也有很多人分享了自己通过美剧练习听力的方法,比如说只开英文字幕或者干脆就不要字幕。但是这两个方法都有自己的缺点,只开英文字幕的方法虽然说避免了下意识只看中文,但是却造成了只看字幕不听读音,从而练习了阅读忽略了听力;不开字幕的方法确实做到了强迫自己必须认真听,可是对于很多人来说,美剧中充满了大量的陌生词汇,比如说:

这句话中的 betrayal 是背叛的名词形式,可能很多人就不认识,或者说认识但是却没听过他的正确发音。这样一来,对这句话的理解就会出现障碍。美剧中还有很多类似情况,用这样的听力材料显然是不适合的。为了应对这种情况,我有了个想法:将字幕中的词汇拆分,并进行词频的检测,如果词频在 4000(可以根据自己的情况进行调整)以内,则将单词删除,如果词频在 4000 以外,则单独标注出该词的中文,效果如下:

这样一来,这句话对于我来说就没有任何词汇上的障碍,假如一遍听不懂,我就可以放心大胆的再听一遍而不必担心是由于词汇的问题造成的理解障碍。

下面介绍程序的大体思路:

首先观察字幕文件,选择后缀名为 srt 的字幕文件用记事本打开如下(其他类型的字幕文件用记事本打开以后格式非常复杂,此处不讨论):

观察文本特点,撰写相应的正则表达式

虽然在 Python 中使用正则表达式有几个步骤,但每一步都相当简单。

  1. import re导入正则表达式模块。
  2. re.compile()函数创建一个Regex对象(记得使用原始字符串)。
  3. Regex对象的search()方法传入想查找的字符串。它返回一个Match对象。
  4. 调用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 模块,下面是从电子表格文件中读取单元格涉及的所有函数、方法和数据类型。

  1. 导入openpyxl模块。
  2. 调用openpyxl.load_workbook()函数。
  3. 取得Workbook对象。
  4. 调用get_active_sheet()get_sheet_by_name()工作簿方法。
  5. 取得Worksheet对象。
  6. 使用索引或工作表的cell()方法,带上rowcolumn关键字参数。
  7. 取得Cell对象。
  8. 读取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:                pass            else:                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的编程教室(crossincode)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-02-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 用Python做一个简单的翻译工具

    编程本身是跟年龄无关的一件事,不论你现在是十四五岁,还是四五十岁,如果你热爱它,并且愿意持续投入其中,必定会有所收获。

    Crossin先生
  • [数据可视化]绘制持仓榜单的“棒棒糖图”

    图中线的两端是圆点或者菱形,旁边都有标注持仓证券商和相对应的持多仓数或持空仓数,且左右线颜色不同。画图思路大体就是:先画水平线图,再用 scatter 散点图画...

    Crossin先生
  • 用Python制作一份你专属的爱豆日历

    最近我在看《Python编程快速上手-让繁琐工作自动化》一书,看到书中「处理Excel电子表格」章节时触发了灵感,想着我也可以用 Python 做出一份专属日历...

    Crossin先生
  • python3 爬虫学习:自动给你心上人的微博点赞(一)

    在之前的案例里面,我们学习了使用requests、BeautifulSoup库来爬取豆瓣读书的数据,今天我们要来学习一个新的工具:selenium.

    python鱼霸霸
  • python3 爬虫学习:自动给你心上人的微博点赞(一)

    在之前的案例里面,我们学习了使用requests、BeautifulSoup库来爬取豆瓣读书的数据,今天我们要来学习一个新的工具:selenium.

    python鱼霸霸
  • CTF学习交流群 第一期入群题writeup大放送

    CTF学习交流群,由于加群人数已经超过预期,故此第一期3个入群题完成它们的“使命”,现在入群题正在更换中,现放出第一期3个入群题的简单writeup,欢迎讨论交...

    ChaMd5安全团队
  • 正则表达式的学习与小结

    目前,正则表达式已经在很多软件中得到广泛的应用,包括*nix(Linux, Unix等),HP等操作系统,PHP,C#,Java等开发环境,以及很多的应用软件中...

    阳光岛主
  • 敏捷开发价值观

    个体的互动要高于流程和工具; 可工作的软件要高于详尽的文档; 客户的合作高于合同谈判; 响应变化高于遵循计划;

    needrunning
  • 【Linux】学习笔记(六) Linux 文件搜索

    whereis 只能搜索二进制文件(-b),man 帮助文件(-m)和源代码文件(-s)

    韩旭051
  • 【本周主题】JavaScript单线程与异步

    xing.org1^

扫码关注云+社区

领取腾讯云代金券