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

问题描述

我有一些字幕文件,我不打算学习这些字幕中的每一个单词,没有必要学习一些硬术语,例如:颅骨发育不良、颅骨发育不良...

在这里找到了这个脚本:Remove words from a cell that aren't in a list。但我不知道如何修改或运行它。 (我使用的是 linux)

这是我们的例子:

字幕文件 (.srt):

2
00:00:13,000 --> 00:00:15,000
颅骨发育不良的人好。

3000 个常用词的词表 (.txt):

...
人们



...

我们需要的输出 (.srt)

2
00:00:13,000
有**的人很好。

或者如果可能的话就标记它们(.srt):

2
00:00:13,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
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 替换它们。
  • 最后,我们重新组合该行,并且通常将所有行输出到新文件中。
,

你可以像这样简单地运行一个 python 脚本:

with open("words.txt","rt") as words:
    #create a list with every word
    wordList = words.read().split("\n")

with open("subtitle.srt","rt") as subtitles:
    with open("subtitle_output.srt","wt") as out:
        for line in subtitles.readlines():
            if line[0].isdigit():
                #ignore the line as it starts with a digit
                out.write(line)
                continue
            else:
                for word in line.split():
                    if not word in wordList:
                        out.write(line.replace(word,f"*{word}*"))

此脚本将使用修改后的 *word* 替换不在常用单词文件中的每个单词,保留原始文件并将所有内容放入新的输出文件中