首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从字幕文件中删除不在单词列表(普通单词)中的单词

从字幕文件中删除不在单词列表(普通单词)中的单词
EN

Stack Overflow用户
提问于 2021-01-03 14:24:20
回答 2查看 252关注 0票数 1

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

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

下面是我们的例子:

字幕文件(.srt):

2

00:00:13,000 -> 00:00:15,000

锁骨颅发育不良的人很好。

300个常用单词的单词列表(.txt):

...

人民

使用

好的

..。

我们需要的输出(.srt)

2

00:00:13,000 -> 00:00:15,000

有**的人很好。

或者在可能的情况下标记它们(.srt):

2

00:00:13,000 -> 00:00:15,000

锁骨颅发育不良的人很好。

如果有一个解决方案只适用于纯文本(没有时间代码),没关系,只需解释如何运行它

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-03 14:42:48

下面只处理每个'.srt'文件的第3行。它可以很容易地适应处理其他行和/或其他文件。

代码语言:javascript
运行
复制
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为例):

代码语言:javascript
运行
复制
! cat subtitle_new.rst
2
00:00:13,000 --> 00:00:15,000
People with * * are good.

备选方案:只需在词汇量不足的单词旁边添加一个'*'

代码语言:javascript
运行
复制
# 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]]

然后,产出如下:

代码语言:javascript
运行
复制
2
00:00:13,000 --> 00:00:15,000
People with cleidocranial* dysplasia* are good.

解释:

第一个'.srt'.

  • For用于读取所有想要的单词,确保它们是小写的,并将它们放入set (用于快速成员资格测试)。

  • 我们使用glob查找每个文件中的所有文件名,我们构造一个新的文件名作为'..._new.srt'.

  • We在所有行中读取,但只修改第3行(即第3行,由于默认情况下从0).

  • line.strip()开始,enumerate删除了后面的换行符。

  • 我们本来可以使用line.strip().split()将行拆分成单词,但它会将'good.'保留为最后一个单词;不太好。使用的正则表达式通常用于分隔单词(特别是,它保留在单引号中,例如"don't";它可能是您想要的,也可能不是您想要的,当然可以随意调整)。

  • 我们使用捕获组拆分r"([\w']+)",而不是在非单词字符上拆分,这样我们就可以在parts中同时使用单词和分隔它们的内容。例如,['', 'People', ', ', 'who', ' ', 'are', ' ', 'good', '.'].

  • The 'People, who are good.'本身就是parts的所有其他元素,从索引1开始。

  • 我们用'*'替换单词,如果它们的小写形式不在keep_words.

  • Finally中,我们就重新组装该行,并通常将所有行输出到新文件中。
票数 0
EN

Stack Overflow用户

发布于 2021-01-03 14:54:05

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

代码语言:javascript
运行
复制
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*替换所有不在普通word文件中的单词,保留原始文件,并将所有内容放入新的输出文件

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65550885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档