马尔可夫文本生成

时间:2015-01-13 12:33:08

标签: text processing markov

我一直在寻找生成文字。

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

现在知道这不起作用我反正尝试了并将其复制到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
//

使用以下文本用于生成器。

Thus can my love excuse the slow offence
Of my dull bearer when from thee I speed
From where thou art why should I haste me thence
Till I return of posting is no need
O! what excuse will my poor beast then find
When swift extremity can seem but slow
Then should I spur though mounted on the wind.
In winged speed no motion shall I know.
Then can no horse with my desire keep pace.
Therefore desire of perfectst love being made.
Shall neigh no dull flesh in his fiery race;
But love for love thus shall excuse my jade.
Since from thee going, he went wilful-slow
Towards thee Ill run, and give him leave to go.

它完全有效,现在我可以开始改变它来制作更大的文本。我有任何想法让我知道。但是这个案子已经解决了。 感谢Processing forum的ChrisIr。

2 个答案:

答案 0 :(得分:2)

如果您想查看它,RiTa库已经这样做了。或者只是使用它。 http://rednoise.org/rita/

答案 1 :(得分:0)

我认为您使用的代码会使事情变得更复杂。这个Java example更加清晰,应该在Processing中“开箱即用” - 只需复制/粘贴!

这是应该有效的Processing-ified版本,虽然我认为它可能需要一些调整。

// 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();
  }
}