如何解决从字幕文件中删除不在词表常用词中的词
我有一些字幕文件,我不打算学习这些字幕中的每一个单词,没有必要学习一些硬术语,例如:颅骨发育不良、颅骨发育不良...
我在这里找到了这个脚本: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*
替换不在常用单词文件中的每个单词,保留原始文件并将所有内容放入新的输出文件中
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。