同様のトピックを見てきましたが、私が達成しようとしているものと正確に比較できる解決策はありません。
テキスト内の各文字の出現頻度に基づいて、単純な文字置換を行う必要がある暗号テキストがあります。私はすでにテキストを正規化する関数を持っています (小文字、文字以外の文字なし、 no 、文字の出現回数を数え、各文字の相対頻度を取得します。文字は辞書のキーであり、頻度は値です。
別の辞書に AZ の予想文字頻度 (k=文字、v=頻度) もありますが、次に何をすべきか少し混乱しています。
私がする必要があると思うのは、正規化された暗号テキスト、予想される文字 freq dict [d1]、および暗号文字 freq dict [d2] を取得し、次のように反復することです (一部の疑似コード)。
for word in text:
for item in word:
for k,v in d2.items():
if d2[v] == d1[v]:
replace any instance of d2[k] with d1[k] in text
decoded_text=open('decoded_text.txt', 'w')
decoded_text.write(str('the decoded text')
ここでは、テキストを取得して、「d2 の値が d1 の値と一致する場合、d2[k] のインスタンスをテキスト内の d1[k] に置き換えます」と言いたいと思います。
私はそこにかなりの数の基本的なpythonロジックエラーを犯したに違いないことを認識しています(私はPythonで比較的新しいです)が、正しい方向に進んでいますか?
前もって感謝します
アップデート:
有益な提案をありがとうございました。私のコードに合うようにいくつかの変更を加えて、Karl Knechtel の方法を試すことにしました。しかし、私はまだ問題を抱えています (完全に私の実装で)
問題の暗号文ファイルを取得するデコード関数を作成しました。これは、以前に作成された count 関数を呼び出します。この関数は、辞書を返します (文字:浮動小数点としての頻度)。これは、k と v が浮動小数点数ではなく、属性として .upper を使用できないため、「大文字バージョンにする」コードが機能しないことを意味していました。したがって、このデコード関数を呼び出すと、暗号文の文字頻度が返され、暗号文自体がエンコードされたままになります。
def sorted_histogram(a_dict):
return [x[1] for x in sorted(a_dict.items(), key=itemgetter(1))]
def decode(filename):
text=open(filename).read()
cipher=text.lower()
cipher_dict=count(filename)
english_histogram = sorted_histogram(english_dict)
cipher_histogram = sorted_histogram(cipher_dict)
mapping = dict(zip(english_histogram, cipher_histogram)
translated = ''.join(
mapping.get(c, c)
for c in cipher
)
return translated