-
Notifications
You must be signed in to change notification settings - Fork 0
/
AutoCorrector.java
143 lines (123 loc) · 3.87 KB
/
AutoCorrector.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
import java.io.*;
import java.util.LinkedList;
import java.util.Scanner;
public class AutoCorrector {
private PrefixTree dictionary;
private EditDistance myEditDistance;
@SuppressWarnings("unused")
private LinkedList<String> words;
@SuppressWarnings("unused")
private AutoCorrector myCorrector;
// create a new AutoCorrector object given a filename
public AutoCorrector(String fileName) throws IOException {
dictionary = new PrefixTree();
BufferedReader myReader = new BufferedReader(new FileReader(fileName));
while (myReader.ready()) {
String currentWord = myReader.readLine();
dictionary.addWord(currentWord);
}
myReader.close();
}
public static void main(String[] args) {
try {
// make an autocorrector with the given filename
AutoCorrector myCorrector = new AutoCorrector(args[0]);
String suggestion;
String input;
Scanner inWord = new Scanner(System.in);
// enter the loop and ask the user for input
boolean again = true;
while (again == true) {
System.out.println("Please enter a word to autocorrect.");
input = inWord.next();
// code below deals with weird scanner errors
if (input == null) {
input = inWord.next();
}
suggestion = myCorrector.correct(input);
if (suggestion != null) {
System.out.println("My suggestion is: " + suggestion);
}
// if there's no matching word, print the user's word
if (suggestion == null) {
System.out.println("Your word was: " + input);
}
System.out
.println("Do you want to input another word? (yes/no)");
String choice = inWord.next();
if (choice == null) {
choice = inWord.next();
}
if (choice.equals("no")) {
again = false;
}
if (!choice.equals("no") && !choice.equals("yes")) {
System.out.println("You didn't input 'no,' so I'm"
+ " going to assume you want to keep "
+ "using the autocorrector. "
+ "Input 'no' to stop next time.");
}
}
inWord.close();
} catch (IOException e) {
System.out.println("Sorry, I couldn't find that file.");
// e.printStackTrace();
}
}
@SuppressWarnings("static-access")
public String correct(String word) {
boolean foundPrefix = false;
String substring = word.substring(0, word.length() - 1);
int substringLength = word.length();
String prefixMatch = word;
PrefixTree wordList;
// check if the word is contained in the dictionary
if (dictionary.contains(word)) {
return word;
}
// check each possible prefix using substring
else {
while (foundPrefix == false && substring.length() > 1) {
substringLength--;
substring = word.substring(0, substringLength);
// System.out.println("substring: " + substring);
if (dictionary.contains(substring)) {
prefixMatch = substring;
foundPrefix = true;
}
}
}
// System.out.println("prefixMatch: " + " y " + prefixMatch + " y ");
if (dictionary.contains(prefixMatch) == false) {
System.out.println("Unknown word.");
return null;
}
// get the prefix tree for the final prefix
wordList = dictionary.findPrefix(substring);
// recursively find the list of words
LinkedList<String> words = wordList.findWords();
int counter = 0;
LinkedList<String> addWords = new LinkedList<String>();
for (String w : words) {
addWords.add(counter,
prefixMatch.substring(0, prefixMatch.length() - 1) + w);
}
// System.out.println("addWords: " + addWords.toString());
// get the minimum edit distance
int minEditDistance = Integer.MAX_VALUE;
int editDistance;
String corrected = "";
// compare edit distances
for (String w : addWords) {
// System.out.println("w: " + w);
editDistance = myEditDistance.editDistance(w, word);
// System.out.println("w: " + w + " " + "editDistance: "
// + editDistance);
if (editDistance < minEditDistance) {
minEditDistance = editDistance;
corrected = w;
}
}
return corrected;
}
}