Java - 马尔可夫链文本生成器 - 解析文本文件
Java - Markov Chain Text Generator - Parse text file
我需要使用 "The Tale of Two Cities" 的纯文本文件为我的算法 class 创建马尔可夫链文本生成器(由古腾堡计划提供)。我目前停留在第一阶段,即解析文本文件并从字符中生成键值对,以便将它们添加到符号 table 以完成其余工作(实际上生成新文本)。
澄清一下,这就是我想要的键值对(假设字母表是文本文件):
- abc = 键 | d = 值
- bcd = 键 | e = 值
- cde = 键 | f = 值
- 以此类推
我正在使用 BufferedReader 读取每一行,然后解析每一行,但我这样做的方式是错误的,我想不出解决办法。为了遍历每一行中的字符,我使用 for 循环到达当前字符,然后到达当前字符 +1,依此类推。本质上,我最终不得不到达下一行(尚未读取)并收到 StringIndexOutOfBounds 异常。
我需要一种方法来移动到下一行并继续对整个文件进行迭代。
这是我目前的情况:
import java.io.BufferedReader;
import java.io.IOException;
public class MarkovTextGenerator {
public static void main(String[] args) throws IOException {
/***********************************************************
* Begin parsing through text file, character by character *
***********************************************************/
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
String line;
while ((line = br.readLine()) != null) {
for (int i = 0; i < line.length(); i++) {
String char1 = line.substring(i, i + 1);
String char2 = line.substring(i + 1, i + 2);
String char3 = line.substring(i + 2, i + 3);
char value = line.charAt(i + 3);
String key = char1 + char2 + char3;
System.out.println(key);
System.out.println(value);
}
}
}
/******************
* End of parsing *
******************/
}
}
for 循环的迭代应该只进行到 i < line.length() - 3
。抛出 StringIndexOutOfBounds
异常是因为 line.substring
调用将经过字符串的最后一个字符。
例如
"abc".substring(2,3)
会抛出异常,因为字符串后面没有剩余的字符。
我需要使用 "The Tale of Two Cities" 的纯文本文件为我的算法 class 创建马尔可夫链文本生成器(由古腾堡计划提供)。我目前停留在第一阶段,即解析文本文件并从字符中生成键值对,以便将它们添加到符号 table 以完成其余工作(实际上生成新文本)。
澄清一下,这就是我想要的键值对(假设字母表是文本文件):
- abc = 键 | d = 值
- bcd = 键 | e = 值
- cde = 键 | f = 值
- 以此类推
我正在使用 BufferedReader 读取每一行,然后解析每一行,但我这样做的方式是错误的,我想不出解决办法。为了遍历每一行中的字符,我使用 for 循环到达当前字符,然后到达当前字符 +1,依此类推。本质上,我最终不得不到达下一行(尚未读取)并收到 StringIndexOutOfBounds 异常。 我需要一种方法来移动到下一行并继续对整个文件进行迭代。
这是我目前的情况:
import java.io.BufferedReader;
import java.io.IOException;
public class MarkovTextGenerator {
public static void main(String[] args) throws IOException {
/***********************************************************
* Begin parsing through text file, character by character *
***********************************************************/
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
String line;
while ((line = br.readLine()) != null) {
for (int i = 0; i < line.length(); i++) {
String char1 = line.substring(i, i + 1);
String char2 = line.substring(i + 1, i + 2);
String char3 = line.substring(i + 2, i + 3);
char value = line.charAt(i + 3);
String key = char1 + char2 + char3;
System.out.println(key);
System.out.println(value);
}
}
}
/******************
* End of parsing *
******************/
}
}
for 循环的迭代应该只进行到 i < line.length() - 3
。抛出 StringIndexOutOfBounds
异常是因为 line.substring
调用将经过字符串的最后一个字符。
例如
"abc".substring(2,3)
会抛出异常,因为字符串后面没有剩余的字符。