簡體   English   中英

刪除字典中包含單詞NOT的所有行

[英]Remove all lines containing word NOT in dictionary

我有/usr/share/dict/words的英文單詞/usr/share/dict/words

我有一個巨大的句子文件,一行一行。 我試圖通過與字典進行比較來刪除這些奇怪的句子與外來詞匯和詞匯詞匯。

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

有人可以幫忙嗎? 我嘗試使用diff但它只能在單詞級別而不是句子級別進行比較

你需要分階段做到這一點。

首先,使用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.
  • 對於輸入hugefile的每一行
    • 將其拆分為單詞並使這個小列表唯一。 讓這是W.
    • 計算W和D兩個列表的交集。
    • 如果其長度與W的長度相同,則該行不包含未知單詞。

你想要這樣的東西:

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

如果你不介意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將打印該行,因為它是真的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM