python - 从字幕文件中删除不在单词列表中的单词(常用单词)
问题描述
我有一些字幕文件,我不打算学习这些字幕中的每一个单词,没有必要学习一些硬术语,比如:锁骨、发育不良......
我在这里找到了这个脚本:Remove words from a cell that are not in a list。但我不知道如何修改或运行它。(我使用的是linux)
这是我们的示例:
字幕文件(.srt):
2
00:00:13,000 --> 00:00:15,000
患有锁颅发育不良的人很好。
3000 个常用词的词表 (.txt):
......
人 很好 ......
_
_
我们需要的输出 (.srt):
2
00:00:13,000 --> 00:00:15,000
有 * * 的人很好。
或者在可能的情况下标记它们(.srt):
2
00:00:13,000 --> 00:00:15,000
患有锁颅*发育不良*的人很好。
如果有一个只使用纯文本(没有时间码)的解决方案,没关系,只需解释如何运行它
谢谢。
解决方案
以下仅处理每个'.srt'
文件的第 3 行。它可以很容易地适应处理其他行和/或其他文件。
import os
import re
from glob import glob
with open('words.txt') as f:
keep_words = {line.strip().lower() for line in f}
for filename_in in glob('*.srt'):
filename_out = f'{os.path.splitext(filename_in)[0]}_new.srt'
with open(filename_in) as fin, open(filename_out, 'w') as fout:
for i, line in enumerate(fin):
if i == 2:
parts = re.split(r"([\w']+)", line.strip())
parts[1::2] = [w if w.lower() in keep_words else '*' for w in parts[1::2]]
line = ''.join(parts) + '\n'
fout.write(line)
结果(对于subtitle.rst
您给出的示例:
! cat subtitle_new.rst
2
00:00:13,000 --> 00:00:15,000
People with * * are good.
替代方案:只需在'*'
词汇表外的单词旁边添加一个:
# replace:
# parts[1::2] = [w if w.lower() in keep_words else '*' for w in parts[1::2]]
parts[1::2] = [w if w.lower() in keep_words else f'{w}*' for w in parts[1::2]]
那么输出是:
2
00:00:13,000 --> 00:00:15,000
People with cleidocranial* dysplasia* are good.
解释:
- 第一个
open
用于读取所有想要的单词,确保它们是小写的,然后将它们放入set
(用于快速成员资格测试)。 - 我们
glob
用来查找所有以'.srt'
. - 对于每个这样的文件,我们构造一个从它派生的新文件名,即
'..._new.srt'
. - 我们读取了所有行,但只修改了行
i == 2
(即第 3 行,因为enumerate
默认情况下从 0 开始)。 line.strip()
删除尾随的换行符。- 我们本来可以
line.strip().split()
将这一行分成几个词,但它会'good.'
作为最后一个词留下;不好。使用的正则表达式通常用于拆分单词(特别是,它留下单引号,例如"don't"
; 它可能是也可能不是您想要的,当然可以随意调整)。 - 我们使用捕获组拆分
r"([\w']+)"
而不是拆分非单词字符,以便我们同时拥有单词以及将它们分开的内容parts
。例如,'People, who are good.'
变成['', 'People', ', ', 'who', ' ', 'are', ' ', 'good', '.']
。 - 单词本身是 的所有其他元素
parts
,从索引 1 开始。 - 如果单词
'*'
的小写形式不在 中,我们将其替换为keep_words
。 - 最后我们重新组装该行,并且通常将所有行输出到新文件。
推荐阅读
- c - 为什么 qemu 有时会比 ptrace 计数更多有时更少的指令?
- qt - 在 Qwt 图中使用一对一标签
- python - 如何在 2d 列表 python 中找到具有相同变量的值的总和,仅使用列表理解?
- haskell - 在模式匹配的不同情况下推导出不同的类型类约束
- javascript - 如何处理由崩溃导致的 404 页面返回。反应路由器
- swift - 停止在 UITableView 的嵌套 UICollectionView 中播放视频或仅在嵌套结构中的可见单元格上播放
- svelte - Svelte (rollup) - 错误:意外的令牌(请注意,您需要 @rollup/plugin-json 来导入 JSON 文件)
- datetime - 如果 yaxis 包含空 dateTime 数据并且 useUTC 为 false,则图表未呈现并引发脚本错误
- r - 在运行时为克隆的元素创建 R 闪亮绑定?
- html - Shopify - 具有单独样式的重复块