我试图写一个Twitter机器人回复给随机ha句的人,但我在javascript中创建它的结构时遇到了麻烦。在我附上的代码中,您将看到使用p5.js我已经加载了两个文本文件,一个带有一堆名词,另一个带有一堆形容词。然后我使用我发现的一些代码通过音节将它们拆分,但是我无法弄清楚如何将每个音节的列表重新组织成单独的数组。
喜欢" oneSyllable = []"," twoSyllable = []"等
任何帮助都会非常感激 - 即使只是解释正则表达式函数的作用会有所帮助。这一个 - (/(= = ^ ^ laeiouy)es | ed | [^ laeiouy] e)$ /,'')
另外,有没有更简单的方法在javascript中执行此操作?使用p5意味着我必须使用命令行将它运行到twitter机器人,这是我仍然需要学习的东西。如果您有关于制作haiku twitter机器人的任何其他信息,请告诉我们!我已经做了很多研究,但我找不到任何有关的数据源代码。
这是为了即将到期的代码决赛,我已经超出了我的深度!希望有人可以提供帮助。
function setup() {
createCanvas(600, 6000);
fill(0);
loadStrings("./nouns.txt", doText);
loadStrings("./adjectives.txt", doText2);
}
function doText(data) {
for (var i=0; i<data.length; i++) {
text("Nouns list:", 5, 20);
text(data[i]+ ": " + (new_count(data[i])), 5, 20*i+50);
}
}
function doText2(data) {
for (var j=0; j<data.length; j++) {
text("Adjectives list:", 100, 20);
text(data[j]+ ": " + (new_count(data[j])), 100, 20*j+50);
}
}
function new_count(word) {
word = word.toLowerCase();
if(word.length <= 3) { return 1; }
word = word.replace(/(?=[^laeiouy]es|ed|[^laeiouy]e)$/, '');
word = word.replace(/^y/, '');
return word.match(/[aeiouy]{1,2}/g).length;
}
答案 0 :(得分:0)
我建议在字典中存储由音节计数组织的单词,其中键是音节计数,值是具有相应音节计数的单词列表。
如果JavaScript中的任何对象都是关联数组,这只是“字典”的另一个术语,您可能最终会使用以下函数来重新组织列表:
function groupBySyllableCount(wordList) {
var wordsBySyllableCount = {};
for (var i = 0, len = wordList.length; i < len; i++) {
var slblCount = new_count(wordList[i]);
if (wordsBySyllableCount[slblCount] === undefined) {
wordsBySyllableCount[slblCount] = [wordList[i]];
} else {
wordsBySyllableCount[slblCount].push(wordList[i]);
}
}
return wordsBySyllableCount;
}
// TEST & DEMO:
var nouns = ['air', 'time', 'community', 'year', 'people', 'woman', 'house', 'research'];
var nounsBySyllableCount = groupBySyllableCount(nouns);
console.log(nounsBySyllableCount);
function new_count(word) {
word = word.toLowerCase();
if(word.length <= 3) { return 1; }
word = word.replace(/(?:[^laeiouy]es|ed|[^laeiouy]e)$/, '');
word = word.replace(/^y/, '');
return word.match(/[aeiouy]{1,2}/g).length;
}
从(?=[^laeiouy]es|ed|[^laeiouy]e)$
正则表达式开始,它匹配
es
前面没有l
,a
,e
,i
,o
,u
或{ {1}},y
ed
前面没有e
,l
,a
,e
,i
,o
或{ {1}} 但仅限于它们在字符串结尾之前(在您的情况下为单词),由u
锚表示。 y
是一个积极的前瞻,此处仅用于对$
,(?=...)
和[^laeiouy]es
模式进行分组,以表明每个模式应该跟随字符串的结尾
事实上,使用正向前瞻是一种过度杀伤力。使用捕获(ed
)或非捕获([^laeiouy]e
)组构造进行分组就足够了。请参阅上面演示中的修正正则表达式。