按音节计数分隔单词

时间:2017-05-15 04:50:57

标签: javascript arrays regex sorting twitter

我试图写一个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;
}

1 个答案:

答案 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前面没有laeiou或{ {1}},
  • y
  • ed前面没有elaeio或{ {1}}

但仅限于它们在字符串结尾之前(在您的情况下为单词),由u锚表示。 y是一个积极的前瞻,此处仅用于对$(?=...)[^laeiouy]es模式进行分组,以表明每个模式应该跟随字符串的结尾

事实上,使用正向前瞻是一种过度杀伤力。使用捕获(ed)或非捕获([^laeiouy]e)组构造进行分组就足够了。请参阅上面演示中的修正正则表达式。