Algorithm to find the correct word
There are many strategies, and which is best will  likely depend on a number of details not listed in the question.

For short words, the most efficient solution is to precompute everything.  For each word in the dictionary, compute all possible words that can be obtained from it.  Store these in a giant hashtable.  If a word can be obtained in multiple ways, keep only the way with highest frequency.  Then, finding the correction for a new word is as simple as looking it up in the hashtable.

For long words, one approach would be to consider only the first K letters of the word (for some K) and ignore the remaining letters, and then use the precomputation method above.  The hash table will have to list all ways to complete the first K letters to a full word.  You would choose K to balance off the space needed for the hashtable and time needed for the precomputation, vs the time to correct a word.

Other strategies you could consider: (1) iterate through the dictionary in decreasing order of frequency, check whether it matches the input word; (2) generate all possible variants of the input word (by all possible combinations of replacing each letter by some adjacent letter or leaving it unchanged), look each up in the dictionary, and keep the highest-frequency match; (3) use locality-sensitive hashing to find all matches in the dictionary, and keep the highest-frequency one.  I suspect precomputation may be better than all of these in practice, though.