-2

我一直在寻找生成文本。

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

现在知道这行不通,我还是尝试了它并将其复制到处理中。存在找不到正确库的错误。

有没有人已经做到了这一点,或者可以为我指出一个好的方向,以找到更多关于通过处理进行文本生成的信息。或者甚至是想要合作的人。开源,什么不是。

我想要的与网站上的示例并没有什么不同,除了字母计数应该是基于单词的,并且数据库是由我在那里输入的单词给出的。最后一部分可以更改为我仍在头脑风暴中的其他来源。但实际上一切都可以用文字来表达。如果您有任何想法,请随时贡献。

当我从其他论坛了解更多信息时,我会编辑这篇文章。因此,当有解决方案时,我可以将其传递给其他人。

编辑:基于点击的解决方案生成

// 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.

它完全有效,现在我可以开始更改它以制作更大的文本。我有人有想法让我知道。但这个案子为我解决了。感谢处理论坛的 ChrisIr。

4

2 回答 2

2

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

于 2015-01-24T00:02:29.710 回答
0

我认为您使用的代码使事情变得更加复杂。这个Java 示例更加清晰,并且应该在处理中“开箱即用”——只需复制/粘贴!

这是应该工作的处理化版本,尽管我认为它可能需要一些调整。

// 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();
  }
} 
于 2015-01-15T23:19:23.470 回答