如何从 RiTa.js 随机词生成器中删除 space?
How to remove space from RiTa.js random word generator?
我正在开发受 Daniel Shiffman 的 RiTa 库演示启发的单词生成器。现在,代码使用以下行在所有单词和标点符号之间添加了一个 space:
output += " ";
我一直想弄清楚如何更改代码,使 space 不会出现在标点符号(如句点)和单词之间。我认为最简单的方法是使用 if/else 语句,不改变标点符号,但在单词中添加 space,但我也很难弄清楚 what functions from the Rita library to use for this作为语法。
有什么想法吗?这是我的代码:
var input;
var button;
var lexicon;
function setup() {
noCanvas();
lexicon = new RiLexicon();
input = createInput('As I say a noun is the name of a thing.');
button = createButton('submit');
input.changed(processRita);
button.mousePressed(processRita);
input.size(400);
}
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]);
if(alliterations.length == 0){
output+=words[i];
}else{
output += alliterations[Math.floor(Math.random() * alliterations.length)];
}
//console.log("noun");
//console.log(alliterations.length);
} else if (/jj.*/.test(pos[i])) {
var alliterations = lexicon.alliterations(words[i]);
output += alliterations[Math.floor(Math.random() * alliterations.length)];
//console.log("adjective");
} else if (/vb/.test(pos[i])) {
var alliterations = lexicon.alliterations(words[i]);
output += alliterations[Math.floor(Math.random() * alliterations.length)];
//console.log("verbs");
}
else {
//console.log(words[i]);
output += words[i];
} {
output += " ";
}
}
createP(output);
}
为什么你需要一个图书馆?你不能只使用常规的 String
函数来测试 String
是否是标点符号吗?
您可以只使用正则表达式来测试 String
是否与标点符号匹配。或者只是对您关心的每个标点符号使用一系列相等性检查。
您也可以查看 the startsWith()
function and the endsWith()
function。
经过多次尝试和错误,我得到了一位编码教授的帮助,他帮助我解决了这个问题,这比我原先预期的要复杂。为了让这段代码工作,我们在 for 循环的开头添加了这一点:
if(words[i] == "." || words[i] == "," || words[i] == "?" || words[i] == "!"){
output += words[i];
}else{
output += " ";
所以整个代码现在看起来像这样:
for (var i = 0; i < words.length; i++) {
if(words[i] == "." || words[i] == "," || words[i] == "?" || words[i] == "!"){
output += words[i];
}else{
output += " ";
if (/nn.*/.test(pos[i])) {
var alliterations = lexicon.alliterations(words[i]);
if(alliterations.length == 0){
output+=words[i];
}else{
output += alliterations[Math.floor(Math.random() * alliterations.length)];
}
//console.log("noun");
//console.log(alliterations.length);
} else if (/jj.*/.test(pos[i])) {
var alliterations = lexicon.alliterations(words[i]);
output += alliterations[Math.floor(Math.random() * alliterations.length)];
//console.log("adjective");
} else if (/vb/.test(pos[i])) {
var alliterations = lexicon.alliterations(words[i]);
output += alliterations[Math.floor(Math.random() * alliterations.length)];
//console.log("verbs");
}
else {
//console.log(words[i]);
output += words[i];
}
}
}
createP(output);
}
如果使用 RiTa library 函数, 更简单:
function processRita() {
var all, output = [],
words = RiTa.tokenize(input.value()),
pos = RiTa.getPosTags(words);
for (var i = 0; i < words.length; i++) {
if (/[nn|kk|vb|jj].*/.test(pos[i]) && (all = lexicon.alliterations(words[i])).length) {
output.push(RiTa.randomItem(all));
} else {
output.push(words[i]);
}
}
createP(RiTa.untokenize(output));
}
我正在开发受 Daniel Shiffman 的 RiTa 库演示启发的单词生成器。现在,代码使用以下行在所有单词和标点符号之间添加了一个 space:
output += " ";
我一直想弄清楚如何更改代码,使 space 不会出现在标点符号(如句点)和单词之间。我认为最简单的方法是使用 if/else 语句,不改变标点符号,但在单词中添加 space,但我也很难弄清楚 what functions from the Rita library to use for this作为语法。
有什么想法吗?这是我的代码:
var input;
var button;
var lexicon;
function setup() {
noCanvas();
lexicon = new RiLexicon();
input = createInput('As I say a noun is the name of a thing.');
button = createButton('submit');
input.changed(processRita);
button.mousePressed(processRita);
input.size(400);
}
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]);
if(alliterations.length == 0){
output+=words[i];
}else{
output += alliterations[Math.floor(Math.random() * alliterations.length)];
}
//console.log("noun");
//console.log(alliterations.length);
} else if (/jj.*/.test(pos[i])) {
var alliterations = lexicon.alliterations(words[i]);
output += alliterations[Math.floor(Math.random() * alliterations.length)];
//console.log("adjective");
} else if (/vb/.test(pos[i])) {
var alliterations = lexicon.alliterations(words[i]);
output += alliterations[Math.floor(Math.random() * alliterations.length)];
//console.log("verbs");
}
else {
//console.log(words[i]);
output += words[i];
} {
output += " ";
}
}
createP(output);
}
为什么你需要一个图书馆?你不能只使用常规的 String
函数来测试 String
是否是标点符号吗?
您可以只使用正则表达式来测试 String
是否与标点符号匹配。或者只是对您关心的每个标点符号使用一系列相等性检查。
您也可以查看 the startsWith()
function and the endsWith()
function。
经过多次尝试和错误,我得到了一位编码教授的帮助,他帮助我解决了这个问题,这比我原先预期的要复杂。为了让这段代码工作,我们在 for 循环的开头添加了这一点:
if(words[i] == "." || words[i] == "," || words[i] == "?" || words[i] == "!"){ output += words[i]; }else{ output += " ";
所以整个代码现在看起来像这样:
for (var i = 0; i < words.length; i++) {
if(words[i] == "." || words[i] == "," || words[i] == "?" || words[i] == "!"){
output += words[i];
}else{
output += " ";
if (/nn.*/.test(pos[i])) {
var alliterations = lexicon.alliterations(words[i]);
if(alliterations.length == 0){
output+=words[i];
}else{
output += alliterations[Math.floor(Math.random() * alliterations.length)];
}
//console.log("noun");
//console.log(alliterations.length);
} else if (/jj.*/.test(pos[i])) {
var alliterations = lexicon.alliterations(words[i]);
output += alliterations[Math.floor(Math.random() * alliterations.length)];
//console.log("adjective");
} else if (/vb/.test(pos[i])) {
var alliterations = lexicon.alliterations(words[i]);
output += alliterations[Math.floor(Math.random() * alliterations.length)];
//console.log("verbs");
}
else {
//console.log(words[i]);
output += words[i];
}
}
}
createP(output);
}
如果使用 RiTa library 函数, 更简单:
function processRita() {
var all, output = [],
words = RiTa.tokenize(input.value()),
pos = RiTa.getPosTags(words);
for (var i = 0; i < words.length; i++) {
if (/[nn|kk|vb|jj].*/.test(pos[i]) && (all = lexicon.alliterations(words[i])).length) {
output.push(RiTa.randomItem(all));
} else {
output.push(words[i]);
}
}
createP(RiTa.untokenize(output));
}