Подтвердить что ты не робот

Заменить неправильное использование "a" и "an" в текстовом вводе

Я заинтересован в проверке или автоматической корректировке использования неопределенных статей "a" и "an" в блоках английского текста с textarea.

Грамматическое правило состоит в том, что выбор статьи зависит от звука, который начинается с следующего слова. Подробности здесь и здесь. Это кажется невероятно широким, однако в предыдущем ответе было высказано предположение (Как я могу правильно прикрепить слово с символом "a" и "a" ??) до ссылайтесь на огромную базу данных английского текста, чтобы создать эвристику, чтобы вывести правильную неопределенную статью для использования в данной ситуации. Eamon Nerbonne комментирует, что он это сделал, поэтому как я могу применить это решение для этой практической реализации?

Функция, которую я до сих пор реализует простейшей частью грамматического правила; он использует , когда следующее слово начинается с гласного, а a. Он также учитывает существующую капитализацию статьи. Однако в реальности это нецелесообразно, поскольку исключения из этого правила очень распространены. Например, "лошадь" правильная, а "честь" и "HTTP-адрес" - нет.

Как моя функция может быть расширена, чтобы правильно обрабатывать фактическое произношение слов, следующих за статьями, включая тихие буквы, акронимы и "иногда-y"? Я не требую 100% -ной точности - лучше, чем 80%, будет достаточно, чтобы улучшить текст, который я исправляю.

Здесь моя функция fixArticles(); см. фрагмент для приведенного примера.

function fixArticles( txt ) {
  var valTxt = txt.replace(/\b(a|an) (\w*)\b/gim, function( match, article, following ) {
    var newArticle = article.charAt(0);
    switch (following.charAt(0).toLowerCase()) {
      case 'a':
      case 'e':
      case 'i':
      case 'o':
      case 'u':
        newArticle += 'n'; // an
        break;
      default:
        // a
        break;
    }
    if (newArticle !== article) {
      newArticle = "<span class='changed'>" + newArticle + "</span>";
    }
    return newArticle+' '+following;

  });

  document.getElementById('output-text').innerHTML = valTxt.replace(/\n/gm,'<br/>');
}

function fixArticles( txt ) {
  var valTxt = txt.replace(/\b(a|an) (\w*)\b/gim, function( match, article, following ) {
    var newArticle = article.charAt(0);
    switch (following.charAt(0).toLowerCase()) {
      case 'a':
      case 'e':
      case 'i':
      case 'o':
      case 'u':
        newArticle += 'n'; // an
        break;
      default:
        // a
        break;
    }
    if (newArticle !== article) {
      newArticle = "<span class='changed'>" + newArticle + "</span>";
    }
    return newArticle+' '+following;

  });
  
  document.getElementById('output-text').innerHTML = valTxt.replace(/\n/gm,'<br/>');
}
input, label {
    display:block;
}
.changed {
  font-weight: bold;
}
<label for="input-text">Enter text</label>
<textarea id="input-text" cols="50" rows="5">An wise man once said: "A apple an day keeps the doctor away."
Give me an break.
I would like an apple.
My daughter wants a hippopotamus for Christmas.
It was an honest error.
Did a user click the button?
An MSDS (material safety data sheet) was used to record the data.
</textarea>
<input type="button" value="Fix a/an" onClick="fixArticles(document.getElementById('input-text').value)">
<hr>
<div id="output-text"/>
4b9b3361

Ответ 1

Следуя легкомысленному ответу на Как я могу правильно прикрепить слово с помощью "a" и "an" ,, Eamon Nerbonne выполнил данный совет и разработал эффективный алгоритм, который точно идентифицирует правильную неопределенную статью для использования перед любым следующим текстом. Так что спасибо @JayMEE за указатель, он действительно помог.

Реализация алгоритма выходит за рамки базовых Q и A - вы можете прочитать об этом в Eamon запись в блоге и Репозиторий GitHub. Тем не менее, он прост в использовании!

Здесь fixArticles() можно изменить, чтобы использовать простую, уменьшенную версию кода Eamon, AvsAn-simple.min.js. См. JSFiddle Demo.

function fixArticles(txt) {
  var valTxt = txt.replace(/\b(a|an) ([\s\(\"'"‘-]?\w*)\b/gim, function(match, article, following) {
    var input = following.replace(/^[\s\(\"'"‘-]+|\s+$/g, ""); //strip initial punctuation symbols
    var res = AvsAnSimple.query(input);
    var newArticle = res.replace(/^a/i, article.charAt(0));
    if (newArticle !== article) {
      newArticle = "<span class='changed'>" + newArticle + "</span>";
    }
    return newArticle + ' ' + following;
  });

  document.getElementById('output-text').innerHTML = valTxt.replace(/\n/gm, '<br/>');
}