2016-11-14 2 views
2

В настоящее время я экспериментирую с Даниэлем Шиффманом tutorial on rita.js. Прямо сейчас я пытаюсь изменить код, чтобы генерировать аллитерацию (т. Е. Слова, начинающиеся с той же буквы), а не полностью случайное слово. Я продолжаю возвращать ошибки, которые говорят, что «аллитерация не является функцией». Как я могу заставить код работать?Использование rita.js для генерации аллитерации

Вот текущий код, я работаю с:

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])) { 
     output += lexicon.alliteration(pos[i]); 
     console.log(nn); 
    } else { 
     output += words[i]; 
    } 

    output += " "; 
    } 
    createP(output); 
} 
+0

Быстрый просмотр ссылки [здесь] (https://rednoise.org/rita/reference/index.php) показывает, что RiLexicon имеет метод аллитерации ** s **, а не аллитерацию, поэтому просто нужно будет измените имя метода. – Jon

+0

Я пробовал оба, а также тег isAlliteration, и ни одно из них не работает. –

ответ

1

Сначала несколько синтаксических вопросы:

  • Изменения 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]); 
    }); 
+0

Эй, спасибо за вашу помощь! Однако этот код, похоже, не создает аллитераций, просто случайных существительных. Есть идеи? –

+0

@WiriginiaVoolf Я добавил некоторую информацию о генерации слов, начиная с той же фонемы. – Jon

+0

Спасибо, Джон. Обновленный код не работает для меня, возможно, по ряду причин. Пока я решил отказаться от этой идеи и перейти к чему-то еще. –

Смежные вопросы