我目前正在尝试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]);
});