我目前正在尝试Daniel Shiffman的tutorial on rita.js。现在,我正在尝试更改代码以生成头韵(即以相同字母开头的单词),而不是完全随机的单词。我不断收到错误消息,说“替代不是功能”。如何使代码正常工作?

这是我正在使用的当前代码:

var input;
var button;
var lexicon;

function setup() {
  noCanvas();
  lexicon = new RiLexicon();

  input = createInput('It was a dark and stormy night.');
  button = createButton('submit');
  input.changed(processRita);
  button.mousePressed(processRita);
  input.size(200);
}

function processRita() {
var s = input.value();
var rs = new RiString(s);
var words = rs.words();
var pos = rs.pos();
console.log(words);
console.log(pos);

var output = '';
for (var i = 0; i < words.length; i++) {
   if (/nn.*/.test(pos[i])) {
      output += lexicon.alliteration(pos[i]);
      console.log(nn);
    } else {
      output += words[i];
    }

    output += " ";
  }
  createP(output);
}

最佳答案

首先是两个语法问题:


将lexicon.alliteration更改为lexicon.alliterations
console.log(nn)行出错,因为nn是不存在的变量,因此请删除此行。




在pos [i]的值为“ nn”(这是pos方法返回的“词性”标记)时,使用pos [i]作为参数调用alliterations方法。它不能返回任何重复,因为alliterations方法实际上需要一个单词而不是词性标签。
因此,您应该将其传递给单词[i]而不是pos [i]

但是,它返回一个数组,因此您将因此得到很多单词:

It was a dark and stormy abnormal,abnormally,abomination,acknowledge,acknowledged,acknowledgement ...

因此,如果您希望随机分配,可以将其更改为:

var alliterations = lexicon.alliterations(words[i]);
output += alliterations[Math.floor(Math.random() * alliterations.length)];


因此,完整的代码变为:

var input;
var button;
var lexicon;

function setup() {
  noCanvas();
  lexicon = new RiLexicon();

  input = createInput('It was a dark and stormy night.');
  button = createButton('submit');
  input.changed(processRita);
  button.mousePressed(processRita);
  input.size(200);
}

function processRita() {
var s = input.value();
var rs = new RiString(s);
var words = rs.words();
var pos = rs.pos();
console.log(words);
console.log(pos);

var output = '';
for (var i = 0; i < words.length; i++) {
   if (/nn.*/.test(pos[i])) {
      var alliterations = lexicon.alliterations(words[i]);
      output += alliterations[Math.floor(Math.random() * alliterations.length)];
    } else {
      output += words[i];
    }

    output += " ";
  }
  createP(output);
}




不幸的是,RiTa对头韵的定义(单词的第一个重音辅音匹配)并不是您所追求的。

假设您不只是追随以相同字母开头的单词,而是追随以相同音素开头的单词,我找不到
使用RiTa的API进行此操作的有效方法,尽管我编写了以下似乎可以完成此功能的函数;但它遵循不良做法,因为它会访问RiTa的某些“私人”成员,这些成员不打算被访问。供参考,我使用的是RiTa 1.1.40。

function firstPhoneAlliteration(searchWord) {

    var phoneSplitRegex = new RegExp(' |-|' + RiTa.STRESSED); //space or hyphen or the stress character

    function getFirstPhone(word) {
        return lexicon._getRawPhones(word).split(phoneSplitRegex)[0];
    }

    var firstPhoneOfSearchWord = getFirstPhone(searchWord);

    var wordsInLexicon = lexicon.keys;
    var matchedWords = [];

    for (let i = 0; i < wordsInLexicon.length; i++) {
        if (firstPhoneOfSearchWord === getFirstPhone(wordsInLexicon[i])) {
            matchedWords.push(wordsInLexicon[i]);
        }
    }

    return matchedWords;

}


您可能只想要带有匹配词性标签的单词(例如,“ night”将被名词替换),所以您
可以如下过滤单词:

var alliterations = firstPhoneAlliteration(words[i])
    .filter(function (word) {
        return (RiTa.getPosTags(word)[0] === pos[i]);
    });

07-26 02:31