Text 马尔可夫文本生成

Text 马尔可夫文本生成,text,processing,markov,Text,Processing,Markov,我一直在寻找生成文本 到目前为止,我学到的是,我将不得不使用单词级马尔可夫文本生成。我在这个网站上找到了一些这样的例子 现在知道这是行不通的,我无论如何都试过了,并把它复制到了Processing。错误是找不到正确的库 有没有人做过这件事,或者可以为我指出一个好的方向,让我找到更多关于处理文本生成的信息。甚至有人想合作。开放源码什么的 我想要的与网站上的示例没有太大区别,除了字母计数应该是基于单词的,数据库是由我输入的单词给出的。最后一部分可以改成另一个来源,我还在集思广益。但事实上一切都可以用

我一直在寻找生成文本

到目前为止,我学到的是,我将不得不使用单词级马尔可夫文本生成。我在这个网站上找到了一些这样的例子

现在知道这是行不通的,我无论如何都试过了,并把它复制到了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();
  }
}