Сначала несколько синтаксических вопросы:
- Изменения lexicon.alliteration в lexicon.alliteration сек
- Линии
console.log(nn)
ошибок, поскольку nn - это переменная, которая не существует, поэтому удалите эту строку.
Метод повторы вызывается с поз [I] в качестве параметра, в то время, когда поз [I] имеет значение «пп», которая представляет собой «часть-из-речь» Тег возвращенный методом pos. Он не может возвращать любые аллитерации, потому что метод аллитераций фактически ожидает слово, а не тег части речи. Таким образом, вы должны передать его слова [я] вместо поз [I]
Однако он возвращает массив, так что вы будете в конечном итоге с большим количеством слов, таким образом:
It was a dark and stormy abnormal,abnormally,abomination,acknowledge,acknowledged,acknowledgement ...
Так вместо этого, если вы хотите случайная аллитерация вы можете изменить его на:
var alliterations = lexicon.alliterations(words[i]);
output += alliterations[Math.floor(Math.random() * alliterations.length)];
Так полный код становится:
var input;
var button;
var lexicon;
function setup() {
noCanvas();
lexicon = new RiLexicon();
input = createInput('It was a dark and stormy night.');
button = createButton('submit');
input.changed(processRita);
button.mousePressed(processRita);
input.size(200);
}
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]);
output += alliterations[Math.floor(Math.random() * alliterations.length)];
} else {
output += words[i];
}
output += " ";
}
createP(output);
}
К сожалению, определение аллитерации RiTa (где первый подчеркнутый согласный слов совпадает) не то, что вы после.
Предполагая, что вы не просто после слов, начинающихся с одной и той же буквы, но слов, начинающихся с одной и той же фонемы, я не могу найти эффективный способ сделать это с помощью API RiTa, хотя я написал следующую функцию который, похоже, выполняет эту работу; но он следует за плохой практикой, потому что он обращается к некоторым из «частных» членов RiTa, которые не предназначены для доступа. Для справки я использую RiTa 1.1.40.
function firstPhoneAlliteration(searchWord) {
var phoneSplitRegex = new RegExp(' |-|' + RiTa.STRESSED); //space or hyphen or the stress character
function getFirstPhone(word) {
return lexicon._getRawPhones(word).split(phoneSplitRegex)[0];
}
var firstPhoneOfSearchWord = getFirstPhone(searchWord);
var wordsInLexicon = lexicon.keys;
var matchedWords = [];
for (let i = 0; i < wordsInLexicon.length; i++) {
if (firstPhoneOfSearchWord === getFirstPhone(wordsInLexicon[i])) {
matchedWords.push(wordsInLexicon[i]);
}
}
return matchedWords;
}
Вы, наверное, хотите только слова с соответствующей частью, из речи тега (так что «ночь», например, будет заменено существительным), так что вы могли фильтровать слова следующим образом:
var alliterations = firstPhoneAlliteration(words[i])
.filter(function (word) {
return (RiTa.getPosTags(word)[0] === pos[i]);
});
Быстрый просмотр ссылки [здесь] (https://rednoise.org/rita/reference/index.php) показывает, что RiLexicon имеет метод аллитерации ** s **, а не аллитерацию, поэтому просто нужно будет измените имя метода. – Jon
Я пробовал оба, а также тег isAlliteration, и ни одно из них не работает. –