小能豆

从字幕文件中删除不在单词表(常用词)中的单词

py

我有一些字幕文件,我并不打算记住这些字幕里的每一个字,也没必要记住一些很难的术语,比如:cleidocranial,dysplasia…

我在这里找到了这个脚本:从不在列表中的单元格中删除单词。但我不知道如何修改或运行它。(我使用的是 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
患有颅骨发育不良的人身体状况良好。

如果有仅使用纯文本(没有时间码)的解决方案,则可以,只需解释如何运行它即可,


阅读 20

收藏
2024-12-31

共1个答案

小能豆

以下仅处理每个'.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
  • 最后,我们重新组合该行,并将所有行输出到新文件中。
2024-12-31