Text 马尔可夫文本生成
我一直在寻找生成文本 到目前为止,我学到的是,我将不得不使用单词级马尔可夫文本生成。我在这个网站上找到了一些这样的例子 现在知道这是行不通的,我无论如何都试过了,并把它复制到了Processing。错误是找不到正确的库 有没有人做过这件事,或者可以为我指出一个好的方向,让我找到更多关于处理文本生成的信息。甚至有人想合作。开放源码什么的 我想要的与网站上的示例没有太大区别,除了字母计数应该是基于单词的,数据库是由我输入的单词给出的。最后一部分可以改成另一个来源,我还在集思广益。但事实上一切都可以用文字表达。如果你有任何想法,请随时贡献 当我从其他论坛了解更多信息时,我会编辑这篇文章。因此,当有解决方案时,我可以将其传递给其他人 编辑:基于单击的解决方案生成Text 马尔可夫文本生成,text,processing,markov,Text,Processing,Markov,我一直在寻找生成文本 到目前为止,我学到的是,我将不得不使用单词级马尔可夫文本生成。我在这个网站上找到了一些这样的例子 现在知道这是行不通的,我无论如何都试过了,并把它复制到了Processing。错误是找不到正确的库 有没有人做过这件事,或者可以为我指出一个好的方向,让我找到更多关于处理文本生成的信息。甚至有人想合作。开放源码什么的 我想要的与网站上的示例没有太大区别,除了字母计数应该是基于单词的,数据库是由我输入的单词给出的。最后一部分可以改成另一个来源,我还在集思广益。但事实上一切都可以用
// required imports for Processing
import java.util.Hashtable;
import java.util.Vector;
String inputFile = "Sonnet51.txt";
Markov markovChain1;
String sentence = "";
void setup() {
size (900, 500);
background(0);
markovChain1 = new Markov();
// load text
String[] input = loadStrings(inputFile);
for (String line : input) {
markovChain1.addWords(line);
println(line);
}
// generate a sentence!
sentence = markovChain1.generateSentence();
println("-------------");
}
void draw() {
background(0);
// noLoop();
fill(255);
text(sentence, 19, 190);
fill(2, 255, 2);
text("Please press mouse", 19, height-33);
}
void mousePressed() {
// generate a sentence!
sentence = markovChain1.generateSentence();
println(sentence);
}
// ==========================================
class Markov {
Hashtable<String, Vector<String>> markovChain =
new Hashtable<String, Vector<String>>();
Markov() {
markovChain.put("_start", new Vector<String>());
markovChain.put("_end", new Vector<String>());
}
void addWords(String line) {
String[] words = line.split(" ");
for (int i=0; i<words.length; i++) {
if (i == 0) {
Vector<String> startWords = markovChain.get("_start");
startWords.add(words[i]);
Vector<String> suffix = markovChain.get(words[i]);
if (suffix == null) {
suffix = new Vector<String>();
suffix.add(words[i+1]);
markovChain.put(words[i], suffix);
}
}
else if (i == words.length-1) {
Vector<String> endWords = markovChain.get("_end");
endWords.add(words[i]);
}
else {
Vector<String> suffix = markovChain.get(words[i]);
if (suffix == null) {
suffix = new Vector<String>();
suffix.add(words[i+1]);
markovChain.put(words[i], suffix);
}
else {
suffix.add(words[i+1]);
markovChain.put(words[i], suffix);
}
}
}
}
String generateSentence() {
String newPhrase = "";
String nextWord = "";
Vector<String> startWords = markovChain.get("_start");
int startWordsLen = startWords.size();
nextWord = startWords.get(int(random(startWordsLen)));
newPhrase += " " + nextWord;
while (nextWord.charAt (nextWord.length ()-1) != '.') {
Vector<String> wordSelection=null;
wordSelection = markovChain.get(nextWord);
if (wordSelection!=null) {
int wordSelectionLen = wordSelection.size();
nextWord = wordSelection.get(int(random(wordSelectionLen-1)));
newPhrase += " " + nextWord;
}
else
{
return newPhrase.toString();
}
}
return newPhrase.toString();
}
} // class
//
它完全可以工作,现在我可以开始改变它来制作更大的文本。我有任何想法让我知道。但这个案子对我来说已经解决了。
多亏了Processing forum的ChrisIr。我认为您使用的代码使事情变得更加复杂。这更清晰,在处理过程中应该“开箱即用”——只需复制/粘贴即可 这是应该可以工作的版本,尽管我认为它可能需要一些调整
// required imports for Processing
import java.util.Hashtable;
import java.util.Vector;
String inputFile = "Sonnet51.txt";
Markov markovChain;
void setup() {
markovChain = new Markov();
// load text
String[] input = loadStrings(inputFile);
for (String line : input) {
markovChain.addWords(line);
}
// generate a sentence!
String sentence = markovChain.generateSentence();
println(sentence);
}
class Markov {
Hashtable<String, Vector<String>> markovChain = new Hashtable<String, Vector<String>>();
Markov() {
markovChain.put("_start", new Vector<String>());
markovChain.put("_end", new Vector<String>());
}
void addWords(String line) {
String[] words = line.split(" ");
for (int i=0; i<words.length; i++) {
if (i == 0) {
Vector<String> startWords = markovChain.get("_start");
startWords.add(words[i]);
Vector<String> suffix = markovChain.get(words[i]);
if (suffix == null) {
suffix = new Vector<String>();
suffix.add(words[i+1]);
markovChain.put(words[i], suffix);
}
} else if (i == words.length-1) {
Vector<String> endWords = markovChain.get("_end");
endWords.add(words[i]);
} else {
Vector<String> suffix = markovChain.get(words[i]);
if (suffix == null) {
suffix = new Vector<String>();
suffix.add(words[i+1]);
markovChain.put(words[i], suffix);
} else {
suffix.add(words[i+1]);
markovChain.put(words[i], suffix);
}
}
}
}
String generateSentence() {
String newPhrase= "";
String nextWord = "";
Vector<String> startWords = markovChain.get("_start");
int startWordsLen = startWords.size();
nextWord = startWords.get(int(random(startWordsLen)));
newPhrase += " " + nextWord;
while (nextWord.charAt (nextWord.length()-1) != '.') {
Vector<String> wordSelection = markovChain.get(nextWord);
int wordSelectionLen = wordSelection.size();
nextWord = wordSelection.get(int(random(wordSelectionLen)));
newPhrase += " " + nextWord;
}
return newPhrase.toString();
}
}
//处理所需的导入
导入java.util.Hashtable;
导入java.util.Vector;
字符串inputFile=“Sonnet51.txt”;
马尔可夫链;
无效设置(){
马尔可夫链=新马尔可夫();
//加载文本
String[]输入=加载字符串(inputFile);
for(字符串行:输入){
markovChain.addWords(行);
}
//生成一个句子!
String语句=markovChain.generateSentence();
println(句子);
}
类马尔可夫{
Hashtable markovChain=新的Hashtable();
马尔可夫(){
markovChain.put(“_start”,new Vector());
markovChain.put(“_end”,new Vector());
}
void addWords(字符串行){
String[]words=line.split(“”);
对于(int i=0;i如果你想查看它,RiTa库已经这样做了。或者只是使用它。请展示一些代码。请解释具体问题。代码似乎创建了一个单词的排序列表,并对其执行二进制搜索。没有频率/权重/系数,因此几乎没有马尔可夫过程。哦,他似乎在存储将多个单词组合成一个“单词”.糟糕。我没有写代码。我的问题是在哪里可以找到基于马尔可夫的文本生成代码进行处理。你上面的人要了一个代码,所以我从我找到的资源中拿出了一个。你可以给我另一个资源来帮我,或者把你的分析很好地用于其他人,比如我。否则我真的看不到请指出您的评论。如果我错了,请解释。如果您想要“基于单词”的马尔可夫:标记文本并使用(旧状态X标记编号)-->>新状态作为传递函数。(也可以添加一些权重或频率)wildplasser您能联系我了解更多信息吗,我也是荷兰人。也许这样更容易理解吧!?会有很大帮助。public static Hashtable>markovChain=new Hashtable>()字段markovChain不能声明为静态;静态字段只能声明为静态或顶级类型。您可以解释此错误吗,我使用的是processing不确定
字符来自何处。您需要删除这些字符。然后,您可以删除公共静态
部分并声明>Hashtable
与任何其他变量一样!int Hashtable{String,Vector{String}}markovChain=新Hashtable{String,Vector{String}}();像这样?我确实需要保留哈希表声明,不是吗?啊,我想你在粘贴代码时遇到了一些奇怪的格式问题。你需要导入以下内容:import java.util.Hashtable;
和import java.util.Vector;
。然后:Hashtable markovChain=new Hashtable()
啊,好吧,是我的错,我做的第一件事就是搜索那些库,把它们放在加工草图中。(复制/粘贴到草图中通常会起作用),尽管现在我找不到那些库。
// required imports for Processing
import java.util.Hashtable;
import java.util.Vector;
String inputFile = "Sonnet51.txt";
Markov markovChain;
void setup() {
markovChain = new Markov();
// load text
String[] input = loadStrings(inputFile);
for (String line : input) {
markovChain.addWords(line);
}
// generate a sentence!
String sentence = markovChain.generateSentence();
println(sentence);
}
class Markov {
Hashtable<String, Vector<String>> markovChain = new Hashtable<String, Vector<String>>();
Markov() {
markovChain.put("_start", new Vector<String>());
markovChain.put("_end", new Vector<String>());
}
void addWords(String line) {
String[] words = line.split(" ");
for (int i=0; i<words.length; i++) {
if (i == 0) {
Vector<String> startWords = markovChain.get("_start");
startWords.add(words[i]);
Vector<String> suffix = markovChain.get(words[i]);
if (suffix == null) {
suffix = new Vector<String>();
suffix.add(words[i+1]);
markovChain.put(words[i], suffix);
}
} else if (i == words.length-1) {
Vector<String> endWords = markovChain.get("_end");
endWords.add(words[i]);
} else {
Vector<String> suffix = markovChain.get(words[i]);
if (suffix == null) {
suffix = new Vector<String>();
suffix.add(words[i+1]);
markovChain.put(words[i], suffix);
} else {
suffix.add(words[i+1]);
markovChain.put(words[i], suffix);
}
}
}
}
String generateSentence() {
String newPhrase= "";
String nextWord = "";
Vector<String> startWords = markovChain.get("_start");
int startWordsLen = startWords.size();
nextWord = startWords.get(int(random(startWordsLen)));
newPhrase += " " + nextWord;
while (nextWord.charAt (nextWord.length()-1) != '.') {
Vector<String> wordSelection = markovChain.get(nextWord);
int wordSelectionLen = wordSelection.size();
nextWord = wordSelection.get(int(random(wordSelectionLen)));
newPhrase += " " + nextWord;
}
return newPhrase.toString();
}
}