删除所有包含单词NOT的行

1 投票
3 回答
1028 浏览
提问于 2025-04-17 22:22

我有一个英语单词的字典,文件在 /usr/share/dict/words 这个地方。

我还有一个很大的文件,里面是逐行写的句子。我想通过和字典对比,去掉那些包含外语或不在字典里的奇怪句子。

Master.txt
Thanks to Your Greatness (谢谢你的美好)
Himatnagar has a small Railway Station
Pu$haz Ink

有没有人能帮帮我?我试过用 diff 命令,但它只能逐个单词比较,不能逐句比较。

3 个回答

0

如果你不介意用awk:

awk 'FNR==NR{dict[$1]++;next} {for(i=1;i<=NF;i++)if(!($i in dict))next}1' /usr/share/dict/words file

解释

在FNR==NR后面的花括号部分只处理第一个文件,也就是字典文件。它会把字典里的每个单词都存到一个叫dict[]的哈希表里。第二组花括号里的内容则是处理你的主要输入文件。它会逐行检查每个单词,如果有哪个单词不在字典里,就跳过这一行;如果都在字典里,最后的1就会打印出这一行,因为这是真的。

1

你想要的东西大概是这样的:

仅包含英文句子的程序.py

input_filename = 'INPUT-FILE'
output_filename = 'OUTPUT-FILE'
dictionary_filename = '/usr/share/dict/words'
english_words = set(x[:-1].lower() for x in open(dictionary_filename).readlines())

def lines_with_only_english_words(input_filename):
    with open(input_filename) as fin:
        for line in fin:
            for w in line.split():
                if w.lower() not in english_words:
                    break
            else:
                yield line

with open(output_filename, 'w') as fout:
    fout.writelines(lines_with_only_english_words(input_filename))
python english-sentences-only.py
2

你需要分步骤来完成这个任务。

首先,使用 tr 命令(或者可以用 sed,虽然速度稍慢但更灵活,可以更精确地去掉标点符号等),把句子文件拆分成单词:

tr " " "\n" < hugefile | sort | uniq | grep -v -F -f dictionary > blacklist.txt

grep 命令中加上 -i 选项,这样就可以不区分大小写了(参考 Scott 的评论)。

接着,你可以用 uniq 来收集独特的单词,然后用 grep -v -F -f dictionary 来找出所有不在字典里的单词。

一旦你有了这个“黑名单”,你就可以请求所有不包含黑名单中任何单词的行。你可能还需要考虑大小写的问题:

 grep -v -F -f blacklist.txt > goodlines.txt

在 Python 中,你可以用类似的方法,但可能更高效:

  • 把字典加载到一个列表 D 中。
  • 对于输入的大文件的每一行:
    • 把这一行拆分成单词,并让这个小列表变得独特。我们称这个列表为 W。
    • 计算列表 W 和 D 的交集。
    • 如果交集的长度和 W 的长度相同,说明这一行没有包含未知单词。

撰写回答