本文中所涉及的图片以及其他材料内容,均为相关MOOC字幕获取过程当中的操作截图或代码示例,不代表个人的立场、观点。本文的核心内容是技术操作的相关说明。
求求管理员别卡我了,期末季好不容易写了一篇嘤嘤嘤我太难了(=___=)
对于一个开卷的在线考试来说,最大的好处就是计算机可以帮助我们搜索。
但是数据库总是要建的吧~
于是我做了一个尝试,也就是把MOOC字幕整理成可搜索的文档。
首先我发现了这样的经验
然而时间有一点久远,今年MOOC的投入必然加大了,不至于把资料还摆在触手可及的位置上。
另外:而且按Ctrl+Shift+I就可以进入Network界面了,哪有那么麻烦
然后就各种搜索发现了神器,见这位开源巨佬的GitHub仓库
没学过Python,按作者说的和自己的理解,下载后在项目文件下输入
pyinstaller Mooc.spec
python -m Mooc
然后至少选择标清(否则没有这个文件),即可发现对应的文件夹下出现了字幕文件*.srt
经过一系列bat和wsl shell的尝试,最终发现都不如直接解散文件夹来的利索。
为了解散一个文件夹下所有的子文件夹:
*.*
就会搜索出当前文件夹下的所有文件和子文件夹文件名按照要求要涂掉了……
为了防止操作过程失手,我们采用复制一套副本的方式。比如这样:
在此之前,由于名称都有一个奇怪的前缀。这是由中国大学MOOC网站的周学制划分的。所以还得将其整理一下。
别用正则了,多麻烦啊 使用VSCode的多行光标,用很直观、人性化的操作方式快捷操作几十行,未尝不可
对于更名,由于排序方式(比如10会排在2前面这种智障 问题)、编码(中文很容易乱)的问题说实话就是不会脚本,使用脚本将已经清洗好的名称依次重命名,会出现很多麻烦
于是这里采用了手动粘贴……不过因为文件夹里的顺序和name文件是一致的,所以问题也不太大。很快就粘完了。
这时候,更麻烦的问题出现了……
如何清洗这样的文件?
为了清洗固定结构(幸好是固定的啊!!)的.srt
文件,我们编写了如下的C++程序
#include
using namespace std;
vector<string> name;
int main()
{
freopen("name.txt", "r", stdin);
string tmp; int t, l = 0, cnt = 0;
while (getline(cin, tmp))
name.push_back(tmp);
ifstream fin("[1.1.1]--1.课程开设时代背景.srt", ios::in);
ofstream fout("cooked.txt", ios::app);
if (!fin) cout << "open wrong" << endl;
while (!fin.eof())
{
fin >> t;
fin.ignore('\n');
if (t <= l)
cout << name[cnt++] << endl;;
getline(fin, tmp);//即是能启动,到这里也不会读入
getline(fin, tmp);
fout << tmp;
fin.ignore('\n');
}
return 0;
}
但即便是单个文件(如程序中给出的那个),也不能很好地读入到如下的C++文件当中。
合并后的直接就无法启动。大数据量是致命的。
所幸文件仅有几十个 =______=
又是一个……体现我超低智商的操作。
当时被气蒙了,没有想到vim是可以打开几万行的文件的啊!!!那就先合并再操作吧~尽管那样的话没有标题,也算有得有失吧(每个文件结尾插入4行#,然后再删减的时候,既可以保留结束符#,也可以保证奇偶结构不被破坏)
这个结构
可以先删除偶数行,再删除奇数行
于是,简化成了三条指令,即
vim [文件名]
:%normal jdd #删除偶数行
:%normal jkdd #删除奇数行
如果事先做了这一步,那么清洗数据本来是一件很简单的事情。可惜……
一个简单的bat:
@echo off
chcp 65001 #保证中文可用
set work_path=%cd% #为了正则查找/r模式可用
for /r %work_path% %%i in (*.srt) do ( #/r模式模糊查找
echo %%i >> raw.txt #echo直接输入名称,作为章节号
type %%i >> raw.txt #type是将文件后缀到指定文件后面
)
pause
如果不需要章节号,只用‘#’作一节结束的标记的话,也可以
@echo off
chcp 65001
set work_path=%cd%
for \r %work_path% %%i in (*.srt) do echo '###' >> raw.txt #最好插入四行,否则会影响奇偶相消
pause
然后使用
copy *.srt raw.txt
即可合并。
半分钟可以干我手动一个个文件半小时的活。
其实如果设计一下合并的脚本,好像也可以加标题比如空行+空行+标题+空行。这个稳定的四行结构非常重要。
这个随个人了,我目的只是为查询建立一个数据库。那就不搞了吧。留个目录就行,查找起来效率也挺高。二十多万字……幸好没有打算手动记。
如果有需要北大版史纲的可以cue我……(卑微=____=)