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

2024-04-26 01:35:02 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

下面是我们的示例:

字幕文件(.srt):

2
00:00:13,000 --> 00:00:15,000
People with cleidocranial dysplasia are good.

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

...
people
with
are
good
...

我们需要的输出(.srt)

2
00:00:13,000 --> 00:00:15,000
People with * * are good.

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

2
00:00:13,000 --> 00:00:15,000
People with cleidocranial* dysplasia* are good.

如果有一个解决方案只处理纯文本(没有时间码),那没关系,只需解释如何运行它
多谢各位


Tags: 文件脚本withpeople单词areremove字幕
2条回答

以下仅处理每个'.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(即第三行,因为默认情况下enumerate从0开始)
  • line.strip()删除尾随的换行符
  • 我们本可以使用line.strip().split()将行拆分为单词,但它会将'good.'作为最后一个单词;不太好。使用的正则表达式通常用于拆分单词(特别是,它在单引号中留下如"don't";它可能是您想要的,也可能不是您想要的,当然可以随意调整)
  • 我们使用捕获组拆分r"([\w']+)"而不是对非单词字符进行拆分,这样我们就有了两个单词以及在parts中分隔它们的内容。例如,'People, who are good.'变成了['', 'People', ', ', 'who', ' ', 'are', ' ', 'good', '.']
  • 单词本身是parts的每一个其他元素,从索引1开始
  • 如果单词的小写形式不是^{,我们将其替换为'*'
  • 最后,我们重新组装该行,并通常将所有行输出到新文件

您可以简单地运行以下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*替换公共单词文件中不存在的每个单词,保留原始文件并将所有内容放入新的输出文件中

相关问题 更多 >