Skip to content
This repository was archived by the owner on Nov 17, 2020. It is now read-only.

Commit 19d9204

Browse files
committed
Course4 Week3
1 parent f6c7637 commit 19d9204

5 files changed

Lines changed: 249 additions & 0 deletions

File tree

Course 4 - Java Programming Principles of Software Design/Week 3/src/MarkovRunner.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,22 @@ public void runMarkovModel() {
4848
printOut(text);
4949
}
5050

51+
public void runMarkov() {
52+
FileResource fr = new FileResource("src/data/confucius.txt");
53+
String st = fr.asString();
54+
st = st.replace('\n', ' ');
55+
MarkovWordOne markovWord = new MarkovWordOne();
56+
runModel(markovWord, st, 120, 139);
57+
}
58+
59+
public void runMarkovTwo() {
60+
FileResource fr = new FileResource("src/data/confucius.txt");
61+
String st = fr.asString();
62+
st = st.replace('\n', ' ');
63+
MarkovWordTwo markovWordTwo = new MarkovWordTwo();
64+
runModel(markovWordTwo, st, 100, 832);
65+
}
66+
5167
private void printOut(String s){
5268
String[] words = s.split("\\s+");
5369
int psize = 0;
@@ -69,5 +85,7 @@ public static void main(String args[]) {
6985
//obj.runMarkovOne();
7086
//obj.runMarkovFour();
7187
obj.runMarkovModel();
88+
//obj.runMarkov();
89+
//obj.runMarkovTwo();
7290
}
7391
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
2+
/**
3+
* Write a description of class MarkovWordOne here.
4+
*
5+
* @author (your name)
6+
* @version (a version number or a date)
7+
*/
8+
9+
import java.util.*;
10+
11+
public class MarkovWordOne implements IMarkovModel {
12+
private String[] myText;
13+
private Random myRandom;
14+
15+
public MarkovWordOne() {
16+
myRandom = new Random();
17+
}
18+
19+
public void setRandom(int seed) {
20+
myRandom = new Random(seed);
21+
}
22+
23+
public void setTraining(String text){
24+
myText = text.split("\\s+");
25+
}
26+
27+
public String getRandomText(int numWords){
28+
StringBuilder sb = new StringBuilder();
29+
int index = myRandom.nextInt(myText.length-1); // random word to start with
30+
String key = myText[index];
31+
sb.append(key);
32+
sb.append(" ");
33+
34+
for(int k=0; k < numWords-1; k++){
35+
ArrayList<String> follows = getFollows(key);
36+
if (follows.size() == 0) {
37+
break;
38+
}
39+
index = myRandom.nextInt(follows.size());
40+
String next = follows.get(index);
41+
sb.append(next);
42+
sb.append(" ");
43+
key = next;
44+
}
45+
46+
return sb.toString().trim();
47+
}
48+
49+
private int indexOf(String[] words, String target, int start) {
50+
for (int k = start; k < words.length; k++) {
51+
if (words[k].equals(target))
52+
return k;
53+
}
54+
return -1;
55+
}
56+
57+
private ArrayList<String> getFollows(String key) {
58+
ArrayList<String> follows = new ArrayList<String>();
59+
int pos = 0;
60+
while (pos < myText.length) {
61+
int start = indexOf(myText, key, pos);
62+
if (start == -1)
63+
break;
64+
if (start + key.length() >= myText.length-1)
65+
break;
66+
String next = myText[start+1];
67+
follows.add(next);
68+
pos = start + 1;
69+
}
70+
return follows;
71+
}
72+
73+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import java.util.ArrayList;
2+
import java.util.Random;
3+
4+
public class MarkovWordTwo implements IMarkovModel {
5+
private String[] myText;
6+
private Random myRandom;
7+
8+
public MarkovWordTwo() {
9+
myRandom = new Random();
10+
}
11+
12+
public void setRandom(int seed) {
13+
myRandom = new Random(seed);
14+
}
15+
16+
public void setTraining(String text){
17+
myText = text.split("\\s+");
18+
}
19+
20+
public String getRandomText(int numWords){
21+
StringBuilder sb = new StringBuilder();
22+
int index = myRandom.nextInt(myText.length-2); // random word to start with
23+
String key1 = myText[index];
24+
String key2 = myText[index+1];
25+
sb.append(key1);
26+
sb.append(" ");
27+
sb.append(key2);
28+
sb.append(" ");
29+
30+
for(int k=0; k < numWords-1; k++){
31+
ArrayList<String> follows = getFollows(key1, key2);
32+
if (follows.size() == 0) {
33+
break;
34+
}
35+
index = myRandom.nextInt(follows.size());
36+
String next = follows.get(index);
37+
sb.append(next);
38+
sb.append(" ");
39+
key1 = key2;
40+
key2 = next;
41+
}
42+
43+
return sb.toString().trim();
44+
}
45+
46+
private int indexOf(String[] words, String target1, String target2, int start) {
47+
for (int k = start; k < words.length; k++) {
48+
if (words[k].equals(target1) && words[k+1].equals(target2))
49+
return k;
50+
}
51+
return -1;
52+
}
53+
54+
private ArrayList<String> getFollows(String key1, String key2) {
55+
ArrayList<String> follows = new ArrayList<String>();
56+
int pos = 0;
57+
while (pos < myText.length) {
58+
int start = indexOf(myText, key1, key2, pos);
59+
if (start == -1)
60+
break;
61+
if (start + key1.length() >= myText.length-1 || start + key2.length() >= myText.length-1)
62+
break;
63+
String next = myText[start+2];
64+
follows.add(next);
65+
pos = start + 1;
66+
}
67+
return follows;
68+
}
69+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
public class WordGram {
2+
private String[] myWords;
3+
private int myHash;
4+
5+
public WordGram(String[] source, int start, int size) {
6+
myWords = new String[size];
7+
System.arraycopy(source, start, myWords, 0, size);
8+
}
9+
10+
public String wordAt(int index) {
11+
if (index < 0 || index >= myWords.length) {
12+
throw new IndexOutOfBoundsException("bad index in wordAt "+index);
13+
}
14+
return myWords[index];
15+
}
16+
17+
public int length(){
18+
return myWords.length;
19+
}
20+
21+
public String toString(){
22+
String ret = "";
23+
for (int k = 0; k < myWords.length; k++)
24+
ret += myWords[k] + " ";
25+
return ret.trim();
26+
}
27+
28+
public boolean equals(Object o) {
29+
WordGram other = (WordGram) o;
30+
if (this.length() != other.length())
31+
return false;
32+
else {
33+
for (int i = 0; i < myWords.length; i++) {
34+
if (!myWords[i].equals(other.wordAt(i)))
35+
return false;
36+
}
37+
}
38+
return true;
39+
}
40+
41+
public WordGram shiftAdd(String word) {
42+
WordGram out = new WordGram(myWords, 0, myWords.length);
43+
44+
String[] shiftedWords = new String[out.length()];
45+
for(int i = 0; i < out.length()-1; i++)
46+
shiftedWords[i] = out.wordAt(i+1);
47+
shiftedWords[shiftedWords.length-1] = word;
48+
49+
return new WordGram(shiftedWords, 0, shiftedWords.length);
50+
}
51+
52+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import java.util.*;
2+
3+
public class WordGramTester {
4+
public void testWordGram(){
5+
String source = "this is a test this is a test this is a test of words";
6+
String[] words = source.split("\\s+");
7+
int size = 4;
8+
for(int index = 0; index <= words.length - size; index += 1) {
9+
WordGram wg = new WordGram(words,index,size);
10+
System.out.println(index+"\t"+wg.length()+"\t"+wg);
11+
}
12+
}
13+
14+
public void testWordGramEquals(){
15+
String source = "this is a test this is a test this is a test of words";
16+
String[] words = source.split("\\s+");
17+
ArrayList<WordGram> list = new ArrayList<WordGram>();
18+
int size = 4;
19+
for(int index = 0; index <= words.length - size; index += 1) {
20+
WordGram wg = new WordGram(words,index,size);
21+
list.add(wg);
22+
}
23+
WordGram first = list.get(0);
24+
System.out.println("checking "+first);
25+
for(int k=0; k < list.size(); k++){
26+
//if (first == list.get(k)) {
27+
if (first.equals(list.get(k))) {
28+
System.out.println("matched at "+k+" "+list.get(k));
29+
}
30+
}
31+
}
32+
33+
public static void main(String args[]) {
34+
WordGramTester obj = new WordGramTester();
35+
obj.testWordGramEquals();
36+
}
37+
}

0 commit comments

Comments
 (0)