Python 从字幕文件中删除非';(常用词)词表中的t

Python 从字幕文件中删除非';(常用词)词表中的t,python,text,grep,subtitle,Python,Text,Grep,Subtitle,我有一些字幕文件,我不打算学习这些字幕中的每一个单词,没有必要学习一些硬词,如:锁骨颅骨,发育不良 我在这里找到了这个脚本:。但我不知道如何修改或运行它。(我正在使用linux) 以下是我们的例子: 字幕文件(.srt): 2 00:00:13000-->00:00:15000 锁骨颅骨发育不良的人是好的 3000个常用词的词表(.txt): … 人们 与 是 好的 我们需要的输出(.srt): 2 00:00:13000-->00:00:15000 有**的人很好 或者,如果可能的话,只需标

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

我在这里找到了这个脚本:。但我不知道如何修改或运行它。(我正在使用linux)

以下是我们的例子:

字幕文件(.srt):

2
00:00:13000-->00:00:15000
锁骨颅骨发育不良的人是好的

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


人们


好的

我们需要的输出(.srt)

2
00:00:13000-->00:00:15000
有**的人很好

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

2
00:00:13000-->00:00:15000
锁骨颅骨发育不良的人是好的

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

谢谢。

以下仅处理每个
'.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
    用于读入所有想要的单词,确保它们是小写的,并将它们放入
    集合中(用于快速成员资格测试)
  • 我们使用
    glob
    查找所有以
    '.srt'
    结尾的文件名
  • 对于每个这样的文件,我们构造一个新的文件名,从中派生为
    “…\u new.srt”
  • 我们读取所有行,但只修改行
    i==2
    (即第三行,因为
    枚举
    默认从0开始)
  • line.strip()
    删除尾随的换行符
  • 我们本可以使用
    line.strip().split()
    将行拆分为单词,但它会将
    作为最后一个单词。
    不好。使用的正则表达式通常用于拆分单词(特别是,它会在单引号中留下如
    “don”
    ;它可能是您想要的,也可能不是您想要的,当然可以随意调整)
  • 我们使用捕获组拆分
    r”([\w']+)“
    ,而不是对非单词字符进行拆分,这样我们就有了两个单词以及将它们分隔成
    部分的内容。例如,
    “人,谁是好的。”
    变成了
    [“人”,“人”,“谁”,“是”,“好的”,“好的”。]
  • 单词本身是
    部分的每一个其他元素,从索引1开始
  • 如果单词的小写形式不在
    keep_words
    中,我们将其替换为
    '*'
  • 最后,我们重新组装该行,并通常将所有行输出到新文件

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

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
    用于读入所有想要的单词,确保它们是小写的,并将它们放入
    集合中(用于快速成员资格测试)
  • 我们使用
    glob
    查找所有以
    '.srt'
    结尾的文件名
  • 对于每个这样的文件,我们构造一个新的文件名,从中派生为
    “…\u new.srt”
  • 我们读取所有行,但只修改行
    i==2
    (即第三行,因为
    枚举
    默认从0开始)
  • line.strip()
    删除尾随的换行符
  • 我们本可以使用
    line.strip().split()
    将行拆分为单词,但它会将
    作为最后一个单词。
    不好。使用的正则表达式通常用于拆分单词(特别是,它会在单引号中留下如
    “don”
    ;它可能是您想要的,也可能不是您想要的,当然可以随意调整)
  • 我们使用捕获组拆分
    r”([\w']+)“
    ,而不是对非单词字符进行拆分,这样我们就有了两个单词以及将它们分隔成
    部分的内容。例如,
    “人,谁是好的。”
    变成了
    [“人”,“人”,“谁”,“是”,“好的”,“好的”。]
  • 单词本身是
    部分的每一个其他元素,从索引1开始
  • 如果单词的小写形式不在
    keep_words
    中,我们将其替换为
    '*'
  • 最后,我们重新组装该行,并通常将所有行输出到新文件

您只需运行如下python脚本:

以open(“words.txt”、“rt”)作为单词:
#创建一个包含每个单词的列表
wordList=words.read().split(“\n”)
以open(“subtitle.srt”、“rt”)作为字幕:
打开(“subtitle_output.srt”、“wt”)作为输出:
对于字幕中的行。readlines():
如果行[0]。isdigit():
#忽略以数字开头的行
输出。写入(行)
持续
其他:
对于第行中的单词。拆分():
如果单词列表中没有单词:
out.write(line.replace(word,f“*{word}*”)

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

您只需运行如下python脚本:

以open(“words.txt”、“rt”)作为单词:
#创建一个包含每个单词的列表
wordList=words.read().split(“\n”)
以open(“subtitle.srt”、“rt”)作为字幕:
打开(“subtitle_output.srt”、“wt”)作为输出:
对于字幕中的行。readlines():
如果我