2017-05-15 2 views
0

Ich versuche, einen Twitter-Bot zu schreiben, der auf Leute mit einem zufälligen Haiku antwortet, aber ich habe Probleme, die Struktur dafür in Javascript zu schaffen. In dem Code, den ich angehängt habe, sehen Sie, dass ich mit p5.js zwei Textdateien geladen habe, eine mit einem Haufen Substantive und die andere mit einer Reihe von Adjektiven. Ich teile sie dann mit Hilfe von Code, den ich gefunden habe, nach Silbe auf, aber ich kann nicht herausfinden, wie ich meine Liste in einzelne Arrays pro Silbe umwandeln kann.Trennende Wörter nach Syllable Count

wie "oneSyllable = []", "twoSyllable = []" usw.

Jede Hilfe wäre sehr appreciated- auch nur eine Erklärung, was die Regex-Funktion hilft es wäre. Dieser/(? = [^ Laeiouy] es | ed | [^ laeioy] e) $ /, '')

Gibt es auch eine einfachere Möglichkeit, dies innerhalb von Javascript zu tun? Mit p5 muss ich es über die Befehlszeile zum twitter-bot ausführen, was ich noch lernen muss. Wenn du weitere Informationen über die Herstellung eines Haiku-Twitter-Bot hast, lass es mich wissen! Ich habe ein paar Nachforschungen angestellt, aber ich kann keinen Quellcode für die verschiedenen da draußen finden.

Dies ist für einen Code endgültigen bald und ich bin weit weg von meiner Tiefe! Hoffe jemand kann helfen.

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; 
} 

Antwort

0

Ich schlage vor, Worte für Silbe Zahl in einem Wörterbuch organisiert speichern mit den Tasten Silbe Zahl und mehr Werte Listen von Wörtern ist, um die jeweiligen Silbe Zahl aufweist.

bereitgestellt jedes Objekt in JavaScript ist ein assoziatives Array, das für „Wörterbuch“ nur einen weiteren Begriff ist, können Sie mit der folgenden Funktion können am Ende Ihre Listen neu zu organisieren:

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; 
 
}

Wie der (?=[^laeiouy]es|ed|[^laeiouy]e)$ regex, passt es

  • entweder es nichtvoran, a, e, i, o, u oder y,
  • oder ed
  • oder e nicht durch l voran, a, e, i, o, u oder y

sondern nur wenn sie gerade vor Ende der Zeichenfolge (ein Wort in Ihrem Fall) gehen, die durch den Anker $ bezeichnet wird. Die (?=...) ist eine positive Vorausschau und wird hier nur zum Gruppieren der [^laeiouy]es, ed und [^laeiouy]e Muster verwendet, um anzugeben, dass jedem von ihnen das Ende des Strings folgen sollte.

In der Tat ist eine positive Vorausschau hier ein Overkill. Eine Gruppierung mit einem Erfassungs- ((...)) oder Nicht-Erfassungs- ((?:...)) Gruppenkonstrukt wäre ausreichend. Siehe den geänderten Regex in meiner Demo oben.

Verwandte Themen