删除字典中包含单词NOT的所有行

时间:2014-03-14 21:25:58

标签: python bash unix

我有/usr/share/dict/words

的英文单词词典

我有一个庞大的句子文件,一行一行。我试图通过与字典进行比较,用外语和词汇单词来删除这些奇怪的句子。

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

有人可以帮忙吗?我尝试使用diff,但它只能在单词级别而不是句子级别进行比较

3 个答案:

答案 0 :(得分:2)

您需要分阶段执行此操作。

首先,使用tr(或者sed - 稍慢但更灵活,允许更精确地删除标点符号等),您将句子文件分块为单词:

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

-i选项添加到grep以防止不区分大小写(请参阅Scott的评论)。

然后,您使用uniq收集唯一字词,然后使用grep -v -F -f dictionary获取字典中的所有字词。

一旦你有了这个&#34;黑名单&#34;,你可以请求包含黑名单本身中的任何单词的所有行。同样,您可能想要考虑大小写:

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

在Python中,您可以采用更有效的方式遵循相同的方法:

  • 将字典加载到列表D中。
  • 输入hugefile的每一行
    • 将其拆分为单词并使此小列表唯一。让这是W。
    • 计算两个列表W和D的交集。
    • 如果其长度与W的长度相同,则该行不包含未知单词。

答案 1 :(得分:1)

你想要这样的东西:

<强> english-sentences-only.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 :(得分: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将打印该行,因为它是真的。