删除所有包含单词NOT的行
我有一个英语单词的字典,文件在 /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 的长度相同,说明这一行没有包含未知单词。