【问题标题】:Separating Words by Syllable Count按音节数分隔单词
【发布时间】:2017-10-13 18:47:35
【问题描述】:

我正在尝试编写一个 twitter 机器人来回复带有随机俳句的人,但我无法在 javascript 中为其创建结构。在我附加的代码中,您会看到使用 p5.js 我加载了两个文本文件,一个带有一堆名词,另一个带有一堆形容词。然后我使用我找到的一些代码将它们按音节拆分,但我无法弄清楚如何将我的列表重新组织成每个音节数量的单独数组。

如“oneSyllable = []”、“twoSyllable = []”等

任何帮助都将不胜感激 - 即使只是解释正则表达式函数的作用也会有所帮助。这个- (/(?=[^laeiouy]es|ed|[^laeiouy]e)$/, '')

另外,有没有更简单的方法可以在 javascript 中执行此操作?使用 p5 意味着我必须使用命令行将它运行到 twitter 机器人,这是我仍然需要学习的东西。如果您有任何有关制作俳句 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;
}

【问题讨论】:

    标签: javascript arrays regex sorting twitter


    【解决方案1】:

    我建议将按音节计数组织的单词存储在字典中,键是音节计数,值是具有相应音节计数的单词列表。

    如果 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 前面没有laeiouy
    • ed
    • e前面没有laeiouy

    但前提是它们正好在字符串结尾(在您的情况下是一个词)之前,由$ 锚表示。 (?=...) 是一个正向预测,在这里仅用于对 [^laeiouy]esed[^laeiouy]e 模式进行分组,以说明它们中的每一个都应该跟在字符串的末尾。

    事实上,在这里使用积极的前瞻是一种矫枉过正的做法。使用捕获 ((...)) 或非捕获 ((?:...)) 组结构进行分组就足够了。请参阅上面我的演示中修改后的正则表达式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-01
      • 2012-02-24
      • 2018-08-30
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 2022-07-03
      相关资源
      最近更新 更多