summaryrefslogtreecommitdiff
path: root/RGens/src/main/java/bjc/rgens/text/markov
diff options
context:
space:
mode:
authorbculkin2442 <bjculkin@mix.wvu.edu>2017-03-26 11:31:17 -0400
committerbculkin2442 <bjculkin@mix.wvu.edu>2017-03-26 11:31:17 -0400
commit2abf8d66776a61f7698830da3b80ab524d7318ef (patch)
treeb68cb7bea4e89a0d90b1832ea04d72a543774ae8 /RGens/src/main/java/bjc/rgens/text/markov
parent3cb61c2aede328e2c302f8cfd030478727fca66c (diff)
Update
Diffstat (limited to 'RGens/src/main/java/bjc/rgens/text/markov')
-rwxr-xr-xRGens/src/main/java/bjc/rgens/text/markov/Markov.java41
-rw-r--r--RGens/src/main/java/bjc/rgens/text/markov/StandaloneMarkov.java59
-rw-r--r--RGens/src/main/java/bjc/rgens/text/markov/StandaloneTextGenerator.java42
-rwxr-xr-xRGens/src/main/java/bjc/rgens/text/markov/TextGenerator.java47
4 files changed, 113 insertions, 76 deletions
diff --git a/RGens/src/main/java/bjc/rgens/text/markov/Markov.java b/RGens/src/main/java/bjc/rgens/text/markov/Markov.java
index a07f44e..9eb4134 100755
--- a/RGens/src/main/java/bjc/rgens/text/markov/Markov.java
+++ b/RGens/src/main/java/bjc/rgens/text/markov/Markov.java
@@ -4,26 +4,26 @@ import java.util.Map.Entry;
import java.util.*;
/**
- * Represents a k-character substring. Can give a pseudo-random suffix
- * character based on probability.
+ * Represents a k-character substring. Can give a pseudo-random suffix character
+ * based on probability.
*
* @author Daniel Friedman (Fall 2011)
*
*/
public class Markov {
- String substring;
- int count = 0;
+ String substring;
+ int count = 0;
- TreeMap<Character, Integer> map;
+ TreeMap<Character, Integer> map;
/**
* Constructs a Markov object from a given substring.
*
- * @param substring
- * the given substring.
+ * @param substr
+ * the given substring.
*/
- public Markov(String substring) {
- this.substring = substring;
+ public Markov(String substr) {
+ this.substring = substr;
map = new TreeMap<>();
@@ -34,13 +34,13 @@ public class Markov {
* Constructs a Markov object from a given substring and suffix
* character. Suffix characters are stored in a TreeMap.
*
- * @param substring
- * the specified substring.
+ * @param substr
+ * the specified substring.
* @param suffix
- * the specified suffix.
+ * the specified suffix.
*/
- public Markov(String substring, Character suffix) {
- this.substring = substring;
+ public Markov(String substr, Character suffix) {
+ this.substring = substr;
map = new TreeMap<>();
@@ -59,7 +59,7 @@ public class Markov {
* Adds a suffix character to the TreeMap.
*
* @param c
- * the suffix character to be added.
+ * the suffix character to be added.
*/
public void add(char c) {
add();
@@ -67,8 +67,7 @@ public class Markov {
if (map.containsKey(c)) {
int frequency = map.get(c);
map.put(c, frequency + 1);
- } else
- map.put(c, 1);
+ } else map.put(c, 1);
}
/**
@@ -76,7 +75,7 @@ public class Markov {
* of times the specified suffix follows the substring in a text.
*
* @param c
- * the specified suffix.
+ * the specified suffix.
* @return the frequency count.
*/
public int getFrequencyCount(char c) {
@@ -106,7 +105,7 @@ public class Markov {
* Finds whether or not the given suffix is in the TreeMap.
*
* @param c
- * the given suffix.
+ * the given suffix.
* @return True if the suffix exists in the TreeMap, false otherwise.
*/
public boolean containsChar(char c) {
@@ -138,8 +137,8 @@ public class Markov {
/**
* Using probability, returns a pseudo-random character to follow the
* substring. Character possibilities are added to an ArrayList
- * (duplicates allowed), and a random number from 0 to the last index
- * in the ArrayList is picked. Since more common suffixes occupy more
+ * (duplicates allowed), and a random number from 0 to the last index in
+ * the ArrayList is picked. Since more common suffixes occupy more
* indices in the ArrayList, the probability of getting a more common
* suffix is greater than the probability of getting a less common
* suffix.
diff --git a/RGens/src/main/java/bjc/rgens/text/markov/StandaloneMarkov.java b/RGens/src/main/java/bjc/rgens/text/markov/StandaloneMarkov.java
index bc31847..8934daa 100644
--- a/RGens/src/main/java/bjc/rgens/text/markov/StandaloneMarkov.java
+++ b/RGens/src/main/java/bjc/rgens/text/markov/StandaloneMarkov.java
@@ -2,39 +2,66 @@ package bjc.rgens.text.markov;
import java.util.Map;
+/**
+ * A standalone Markov generator.
+ *
+ * @author bjculkin
+ *
+ */
public class StandaloneMarkov {
- private int k;
+ private int ord;
- private Map<String, Markov> markovHash;
- private String firstSub;
+ private Map<String, Markov> hash;
+ private String first;
- public StandaloneMarkov(int k, Map<String, Markov> markovHash, String firstSub) {
- this.k = k;
- this.markovHash = markovHash;
- this.firstSub = firstSub;
+ /**
+ * Create a new standalone Markov generator.
+ *
+ * @param order
+ * The order of this generator.
+ *
+ * @param markovHash
+ * The generators to use.
+ *
+ * @param firstSub
+ * The string to start out with.
+ */
+ public StandaloneMarkov(int order, Map<String, Markov> markovHash, String firstSub) {
+ ord = order;
+ hash = markovHash;
+ first = firstSub;
}
- public String generateTextFromMarkov(int M) {
+ /**
+ * Generate random text from the markov generator.
+ *
+ * @param charsToGenerate
+ * The number of characters of text to generate.
+ *
+ * @return The randomly generate text.
+ */
+ public String generateTextFromMarkov(int charsToGenerate) {
StringBuilder text = new StringBuilder();
- for (int i = k; i < M; i++) {
- if (i == k) {
- text.append(firstSub);
- if (text.length() > k) i = text.length();
+ for (int i = ord; i < charsToGenerate; i++) {
+ if (i == ord) {
+ text.append(first);
+
+ if (text.length() > ord) i = text.length();
}
- String sub = text.substring((i - k), (i));
- Markov tmp = markovHash.get(sub);
+ String sub = text.substring(i - ord, i);
+ Markov tmp = hash.get(sub);
if (tmp != null) {
Character nextChar = tmp.random();
+
text.append(nextChar);
} else {
- i = k - 1;
+ i = ord - 1;
}
}
return text.toString();
}
-
}
diff --git a/RGens/src/main/java/bjc/rgens/text/markov/StandaloneTextGenerator.java b/RGens/src/main/java/bjc/rgens/text/markov/StandaloneTextGenerator.java
index 92bc653..17cd670 100644
--- a/RGens/src/main/java/bjc/rgens/text/markov/StandaloneTextGenerator.java
+++ b/RGens/src/main/java/bjc/rgens/text/markov/StandaloneTextGenerator.java
@@ -5,19 +5,25 @@ import java.io.Reader;
import java.util.HashMap;
import java.util.Map;
+/**
+ * Create a Markov generate from a provided source.
+ *
+ * @author bjculkin
+ *
+ */
public class StandaloneTextGenerator {
-
/**
- * Build a markov generator from a provided source
+ * Build a markov generator from a provided source.
+ *
+ * @param order
+ * The markov order to use.
*
- * @param k
- * The markov order to use
* @param reader
- * The source to seed the generator from
- * @return The markov generator for the provided text
+ * The source to seed the generator from.
+ *
+ * @return The markov generator for the provided text.
*/
- public static StandaloneMarkov generateMarkovMap(int k,
- Reader reader) {
+ public static StandaloneMarkov generateMarkovMap(int order, Reader reader) {
Map<String, Markov> hash = new HashMap<>();
Character next = null;
@@ -25,9 +31,10 @@ public class StandaloneTextGenerator {
try {
next = (char) reader.read();
} catch (IOException e1) {
- System.out
- .println("IOException in stepping through the reader");
+ System.out.println("IOException in stepping through the reader");
+
e1.printStackTrace();
+
System.exit(1);
}
@@ -40,19 +47,19 @@ public class StandaloneTextGenerator {
try {
next = (char) reader.read();
} catch (IOException e) {
- System.out.println(
- "IOException in stepping through the reader");
+ System.out.println("IOException in stepping through the reader");
+
e.printStackTrace();
}
}
String origFile = origFileBuffer.toString();
- String firstSub = origFile.substring(0, k);
+ String firstSub = origFile.substring(0, order);
- for (int i = 0; i < origFile.length() - k; i++) {
- String sub = origFile.substring(i, i + k);
- Character suffix = origFile.charAt(i + k);
+ for (int i = 0; i < origFile.length() - order; i++) {
+ String sub = origFile.substring(i, i + order);
+ Character suffix = origFile.charAt(i + order);
if (hash.containsKey(sub)) {
Markov marvin = hash.get(sub);
@@ -64,7 +71,6 @@ public class StandaloneTextGenerator {
}
}
- return new StandaloneMarkov(k, hash, firstSub);
+ return new StandaloneMarkov(order, hash, firstSub);
}
-
}
diff --git a/RGens/src/main/java/bjc/rgens/text/markov/TextGenerator.java b/RGens/src/main/java/bjc/rgens/text/markov/TextGenerator.java
index 770acd9..7d20d79 100755
--- a/RGens/src/main/java/bjc/rgens/text/markov/TextGenerator.java
+++ b/RGens/src/main/java/bjc/rgens/text/markov/TextGenerator.java
@@ -10,16 +10,19 @@ import java.io.*;
*/
public class TextGenerator {
/**
+ * Main method.
+ *
* @param args
- * when used with three arguments, the first represents the
- * k-order of the Markov objects. The second represents the
- * number of characters to print out. The third represents
- * the file to be read.
+ * when used with three arguments, the first represents
+ * the k-order of the Markov objects. The second
+ * represents the number of characters to print out. The
+ * third represents the file to be read.
*
- * When used with two arguments, the first represents the
- * k-order of the Markov objects, and the second represents
- * the file to be read. The generated text will be the same
- * number of characters as the original file.
+ * When used with two arguments, the first represents the
+ * k-order of the Markov objects, and the second
+ * represents the file to be read. The generated text
+ * will be the same number of characters as the original
+ * file.
*/
public static void main(String[] args) {
int k = 0;
@@ -31,38 +34,40 @@ public class TextGenerator {
if (args.length == 3) {
k = Integer.parseInt(args[0]);
M = Integer.parseInt(args[1]);
+
file = args[2];
} else if (args.length == 2) {
k = Integer.parseInt(args[0]);
+
file = args[1];
} else {
- System.out
- .println("\n" + "Usage: java TextGenerator k M file");
- System.out.println(
- "where k is the markov order, M is the number");
- System.out.println(
- "of characters to be printed, and file is the");
- System.out.println(
- "name of the file to print from. M may be left out."
- + "\n");
+ System.out.println("\n" + "Usage: java TextGenerator k M file");
+ System.out.println("where k is the markov order, M is the number");
+ System.out.println("of characters to be printed, and file is the");
+ System.out.println("name of the file to print from. M may be left out." + "\n");
System.exit(1);
}
StandaloneMarkov markov = null;
try (FileReader reader = new FileReader(file)) {
- markov = StandaloneTextGenerator.generateMarkovMap(k,
- reader);
+ markov = StandaloneTextGenerator.generateMarkovMap(k, reader);
+
+ String generatedText = markov.generateTextFromMarkov(M);
+ String desiredText = generatedText.substring(0, Math.min(M, text.length()));
- System.out.println(markov.generateTextFromMarkov(M)
- .substring(0, Math.min(M, text.length())));
+ System.out.println(desiredText);
} catch (FileNotFoundException e) {
System.out.println("File not found.");
+
e.printStackTrace();
+
System.exit(1);
} catch (IOException ioex) {
System.out.println("IOException");
+
ioex.printStackTrace();
+
System.exit(1);
}
}