Заменить неправильное использование "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"/>
Ответы
Ответ 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/>');
}