Commit d60e9278 authored by Adam Blank's avatar Adam Blank
Browse files

Code after lecture

parent ba020de9
Showing with 389517 additions and 0 deletions
+389517 -0
import java.io.FileNotFoundException;
public class Main {
public static char getBestChoice(QuadGramLikelihoods likelihoods, String before, String after) {
char bestLetter = '?';
double best = Double.NEGATIVE_INFINITY;
/*
char bestLetter = 'A';
double best = likelihoods.get(before + 'A' + after);
*/
for (char letter = 'A'; letter <= 'Z'; letter++) {
String quadgram = before + letter + after;
if (likelihoods.get(quadgram) > best) {
bestLetter = letter;
best = likelihoods.get(quadgram);
}
}
return bestLetter;
// for every letter in the alphabet,
// combine before + L + after
// ask for for likelihood of that combo
// keep a running "maximum" letter
}
private static final int N = 4;
public static String[] deduceHiddenLetter(QuadGramLikelihoods likelihoods, String hidden) {
String[] results = new String[N];
int qmark = hidden.indexOf('?');
for (int i = 0; i < N; i++) {
String before = hidden.substring(qmark - i, qmark);
String after = hidden.substring(qmark + 1, qmark - i + N);
System.out.println(before + "?" + after);
char best = getBestChoice(likelihoods, before, after);
results[i] = hidden.substring(0, qmark) +
best +
hidden.substring(qmark + 1, hidden.length());
}
return results;
}
public static void main(String[] args) throws FileNotFoundException {
QuadGramLikelihoods likelihoods = new QuadGramLikelihoods();
String hidden = "PSYC?OLOGY";
//SYC? or YC?O ...
String[] deduced = deduceHiddenLetter(likelihoods, hidden);
for (int i = 0; i < deduced.length; i++) {
System.out.println(hidden + " -> " + deduced[i]);
}
}
}
import java.io.File;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class QuadGramLikelihoods {
private Map<String, Double> likelihoods;
private double notFoundLikelihood;
public QuadGramLikelihoods() throws FileNotFoundException {
Map<String, Integer> freqs = getQuadFrequencies();
long total = 0;
for (String qg : freqs.keySet()) {
total += freqs.get(qg);
}
total += freqs.keySet().size();
this.likelihoods = new HashMap<>();
for (String qg : freqs.keySet()) {
this.likelihoods.put(qg, Math.log10((double)freqs.get(qg) / (double)total));
}
this.notFoundLikelihood = Math.log10(1.0/total);
}
public static Map<String, Integer> getQuadFrequencies() throws FileNotFoundException {
Scanner quadgrams = new Scanner(new File("english_quadgrams.txt"));
Map<String, Integer> freqs = new HashMap<>();
while (quadgrams.hasNextLine()) {
String line = quadgrams.nextLine();
String[] pieces = line.split("\\s");
String quadgram = pieces[0];
int freq = Integer.parseInt(pieces[1]);
freqs.put(quadgram, freq);
}
return freqs;
}
/**
* Returns the log-likelihood of the provided quad-gram.
* @param quadgram the quad-gram to get the likelihood of
* @return the log-likelihood as calculated by our data set
*/
public double get(String quadgram) {
Double likelihood = likelihoods.get(quadgram);
if (likelihood != null) {
return likelihood;
}
else {
return this.notFoundLikelihood;
}
}
}
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import java.io.FileNotFoundException;
import static org.junit.jupiter.api.Assertions.*;
public class Tests {
@Order(0)
@DisplayName("Test deduceHiddenLetter")
@ParameterizedTest
@CsvSource({
"?SYCHOLOGY,,,,PSYCHOLOGY",
"P?YCHOLOGY,,,PSYCHOLOGY,PSYCHOLOGY",
"PS?CHOLOGY,,PSYCHOLOGY, PSUCHOLOGY, PSSCHOLOGY",
"PSY?HOLOGY,PSYCHOLOGY, PSYCHOLOGY, PSYSHOLOGY, PSYWHOLOGY",
"PSYC?OLOGY,PSYCHOLOGY, PSYCHOLOGY, PSYCHOLOGY, PSYCCOLOGY",
"PSYCH?LOGY,PSYCHALOGY, PSYCHILOGY, PSYCHELOGY, PSYCHOLOGY",
"PSYCHO?OGY,PSYCHOOOGY, PSYCHOTOGY, PSYCHOLOGY, PSYCHOLOGY",
"PSYCHOL?GY,PSYCHOLDGY, PSYCHOLOGY, PSYCHOLOGY,",
"PSYCHOLO?Y,PSYCHOLOGY, PSYCHOLOGY,,",
"PSYCHOLOG?,PSYCHOLOGY,,,",
"PSYCHOLOGY,PSYCHOLOGY,PSYCHOLOGY,PSYCHOLOGY,PSYCHOLOGY",
})
public void testDeduceHiddenLetter(String hidden, String correct0, String correct1, String correct2, String correct3) throws FileNotFoundException {
QuadGramLikelihoods likelihoods = new QuadGramLikelihoods();
String[] correct = {correct0, correct1, correct2, correct3};
String[] deduced = Main.deduceHiddenLetter(likelihoods, hidden);
assertArrayEquals(correct, deduced);
}
}
This diff is collapsed.
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment