如何从文本文件中删除所有英文行?

如何从文本文件中删除所有英文行?

我有这个文本文件:

714
01:11:22,267 --> 01:11:27,731
Auch wenn noch viele Generationen auf einen Wechsel hoffen,
Even if it takes many generations hoping for a change,

715
01:11:27,732 --> 01:11:31,920
werde ich mein Bestes geben
und hoffe, dass andere das gleiche tun.
I'm giving mine, I'm doing my best
hoping the other will do the same

716
01:11:31,921 --> 01:11:36,278
Wir haben eine harte Arbeit vor uns, 
um den Lauf der Dinge zu ändern. 
it's going to be hard work
for things to turn around.

717
01:11:36,879 --> 01:11:42,881
Wenn man die Zentren künstlicher Besamung, 
die Zuchtlaboratorien und die modernen Kuhställe besichtigt, 
When visiting artificial insemination centers,
the selection center, modern stables,
...

并想解析它,以便只保留非英语行

这可能吗?

答案1

有一个困难的方法和一个更容易的方法。困难的方法是使用自然语言解析来给出给定行是英语的概率并丢弃这些行。

更简单的方法是获取英语列表停用词并删除包含该列表中的元素的行。如果您想减少对行进行错误分类的可能性,您还可以在您未能拒绝的行中查找德语停用词,以检查它们是否可能是德语。

这是一个非常快速但肮脏的脚本,用于使用链接的停用词列表进行过滤:

#!/usr/bin/python
english_stop = set()
with open('english-stop-words.txt') as estop:
    for line in estop:
        bar = line.find('|')
        if bar > -1:
            line = line[0:bar]
        line = line.strip()
        if line:
            english_stop.add(line)

with open('mixed-german.txt') as mixg:
    for line in mixg:
        for word in line.lower().split():
            if word in english_stop:
                break
        else:
            print line[:-1]

和输出:

714
01:11:22,267 --> 01:11:27,731
Auch wenn noch viele Generationen auf einen Wechsel hoffen,

715
01:11:27,732 --> 01:11:31,920
werde ich mein Bestes geben
und hoffe, dass andere das gleiche tun.

716
01:11:31,921 --> 01:11:36,278
Wir haben eine harte Arbeit vor uns, 
um den Lauf der Dinge zu ändern. 

717
01:11:36,879 --> 01:11:42,881
Wenn man die Zentren künstlicher Besamung, 
die Zuchtlaboratorien und die modernen Kuhställe besichtigt, 

稍微更完整的版本应该忽略各种标点符号,例如单词中的,.英语撇号。'通过查找英语中从未出现过的代码点(例如 )可以获得更高的准确性,«ßü但这留给读者作为练习。

答案2

在您的示例中,这将起作用:

awk -v RS= -F '\n' -v OFS='\n' '{NF=NF/2+1;printf "%s", $0 RT}'

细节

  • RS=。设置记录分隔符。空值是一种特殊情况,意味着一条记录就是一个段落(由空行分隔的行序列)。
  • -F '\n':设置字段分隔符(领域每条记录中都有行)。
  • OFS='\n':设置输出字段分隔符。

对于每个记录(段落):

  • NF=1+NF/2(或NF=2(前 2 行)+ (NF-2)/2(剩余行的一半)):更改字段数以排除英文字段。
  • printf "%s", $0 RT: 打印记录后跟记录终止符(以恢复段落之间相同的间距)。要了解上面的代码正在做什么,如果您在其中添加一些打印语句会很有帮助。像这样的东西:

假设 Unix 行结尾。如果文件是 MSDOS 格式(与字幕文件一样),则需要使用d2u或对其进行预处理dos2unix

答案3

这种方法的关键是能够访问良好的英语单词数据库。我的系统上有这个文件,/usr/share/dict/words其中有很多单词,但可以使用其他来源代替。

方法

grep我的一般方法是像这样使用:

$ grep -vwf /usr/share/dict/words sample.txt

您的示例输出位于sample.txt.

在我有限的测试中,字典的大小words似乎陷入了grep困境。我的版本有 40 万多行。所以我开始做这样的事情来打破它:

$ head -10000 /usr/share/dict/words > ~/10000words

样本运行 (10k)

使用“字典”中的前 10k 个单词来运行您的文件。

$ grep -vwf ~/10000words sample.txt
714
01:11:22,267 --> 01:11:27,731
Auch wenn noch viele Generationen auf einen Wechsel hoffen,

715
01:11:27,732 --> 01:11:31,920
werde ich mein Bestes geben
und hoffe, dass andere das gleiche tun.
I'm giving mine, I'm doing my best
hoping the other will do the same

716
01:11:31,921 --> 01:11:36,278
Wir haben eine harte Arbeit vor uns, 
um den Lauf der Dinge zu ändern. 
it's going to be hard work
for things to turn around.

717
01:11:36,879 --> 01:11:42,881
Wenn man die Zentren künstlicher Besamung, 
die Zuchtlaboratorien und die modernen Kuhställe besichtigt, 
When visiting artificial insemination centers,
the selection center, modern stables,

笔记:在我的 i5 笔记本电脑上,这种方法的运行时间约为 1.5 秒。

这似乎是一个可行的方法。当我把它增加到 100k 行时,它开始需要很长时间,但我在完成之前中止了它,这样你就可以将字典words分成几个文件。

笔记:当我将其减少到 50k 行时,花了 32 秒。

深入研究(50k 行)

当我开始将字典扩展到 50k 时,我遇到了我担心的问题,即语言之间的重叠。

$ grep -vwf ~/50000words sample.txt
714
01:11:22,267 --> 01:11:27,731

715
01:11:27,732 --> 01:11:31,920
werde ich mein Bestes geben
und hoffe, dass andere das gleiche tun.
hoping the other will do the same

716
01:11:31,921 --> 01:11:36,278
Wir haben eine harte Arbeit vor uns, 
um den Lauf der Dinge zu ändern. 

717
01:11:36,879 --> 01:11:42,881
Wenn man die Zentren künstlicher Besamung, 
die Zuchtlaboratorien und die modernen Kuhställe besichtigt, 
the selection center, modern stables,

分析问题

这种方法的一个好处是您可以删除-v并查看重叠的位置:

$ grep -wf ~/50000words sample.txt
Auch wenn noch viele Generationen auf einen Wechsel hoffen,
Even if it takes many generations hoping for a change,
I'm giving mine, I'm doing my best
it's going to be hard work
for things to turn around.
When visiting artificial insemination centers,

这个词auf显然是两种语言的......好吧,至少它在我的words文件中,所以这可能是一种根据需要完善单词列表的尝试和错误方法。

笔记:我知道这是这个词,auf因为grep它被涂成红色,由于 SE 8-) 的有限性质,它没有出现在上面的输出中。

$ grep auf ~/50000words 
auf
aufait
aufgabe
aufklarung
auftakt
baufrey
Beaufert
beaufet
beaufin
Beauford
Beaufort
beaufort
bechauffeur

答案4

这看起来像一个.srt文件。如果是,并且每个字幕的英语行数始终与德语行数相同,那么您可以使用:

awk 'BEGIN { RS="\r\n\r\n"; FS="\r\n"} {for (i=1;i<=(NF-2)/2+2; i++) print $i "\r"; print "\r"}' old.srt > new.srt

其中old.srtnew.srt是您选择的输入和输出文件。

相关内容