Javascript 替换不正确使用的";a「;及;";文本输入

Javascript 替换不正确使用的";a「;及;";文本输入,javascript,regex,Javascript,Regex,我对验证或自动更正atextarea中英文文本块中不定冠词“a”和“an”的使用感兴趣 语法规则是,冠词的选择取决于下一个单词开头的发音。细节和细节。这看起来难以置信的宽泛,但是在之前的回答()中有一个建议,即引用一个巨大的英文文本数据库来创建启发式,以推断在给定情况下使用的正确的不定冠词。Eamon Nerbonne评论说他已经做到了这一点,那么我如何将该解决方案应用到实际实现中呢 到目前为止,我使用的函数实现了语法规则中最简单的部分;当下列单词以元音开头时,它使用an,否则使用a。它还尊重本

我对验证或自动更正a
textarea
中英文文本块中不定冠词“a”和“an”的使用感兴趣

语法规则是,冠词的选择取决于下一个单词开头的发音。细节和细节。这看起来难以置信的宽泛,但是在之前的回答()中有一个建议,即引用一个巨大的英文文本数据库来创建启发式,以推断在给定情况下使用的正确的不定冠词。Eamon Nerbonne评论说他已经做到了这一点,那么我如何将该解决方案应用到实际实现中呢

到目前为止,我使用的函数实现了语法规则中最简单的部分;当下列单词以元音开头时,它使用an,否则使用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/>');
}
输入文本
一位智者曾经说过:“一天一苹果,医生远离你。”
让我休息一下。
我想要个苹果。
我女儿圣诞节想要一只河马。
这是一个诚实的错误。
用户是否单击了按钮?
使用MSDS(材料安全数据表)记录数据。


在对的轻率回答之后,伊蒙·内尔博恩遵循给定的建议,提出了一种高效的算法,能够准确地识别出正确的不定冠词,以便在任何后续文本之前使用。因此,感谢@JayMEE的指点,它确实有帮助

该算法的实现超出了基本问答的范围-您可以在Eamon的和中阅读。然而,它的使用非常简单

下面介绍了如何修改
fixArticles()
,以使用Eamon代码的简化版本。看

function fixArticles(txt){
var valTxt=txt.replace(/\b(a | an)([\s\(\“'”-])?\w*)\b/gim,函数(匹配,文章,以下){
var input=following.replace(//^[\s\(\“''''-]+\s+$/g,”);//去除初始标点符号
var res=AvsAnSimple.query(输入);
var newArticle=res.replace(/^a/i,article.charAt(0));
如果(新文章!==文章){
newArticle=“”+newArticle+”;
}
返回newArticle+“”+以下内容;
});
document.getElementById('output-text')。innerHTML=valTxt.replace(/\n/gm,
); }
很难做到,但对于基于规则的系统来说,这确实是一个算法问题,而不仅仅是JS和正则表达式。这不是一个坏问题。与问题的编码无关,但我非常确定“MSDS”是不正确的。另外,我想知道
soundex
(字符串发音代码)可能对这个问题有用。@TimLewis-眼光好-这是我预期结果中的一个输入错误-重点是我当前的脚本是错误的。正如JayMee链接到的答案中提到的,除了有一个例外列表之外,几乎不可能想出一个算法来准确预测哪篇文章是正确的要使用的一个。请注意,您可以避免以下有点复杂的
。通过稍微调整原始正则表达式来替换
行:
/\b(a | an)(\s[\s\(\“'”-]*)(\w+)\b/
-这样,初始标点是一个单独的捕获,因此您不需要进一步处理
后续的
。另外,如果
返回newArticle+初始标点+后续的话,您可以在替换中保留间隔符+初始标点;
哦,
var res=article[0]+res.substr(1)怎么样
?我喜欢标记更改过的文章的触感-很好的细节!哦,而且库已经处理标点符号了,所以你真的不应该这样做。它不会忽略
-
-你认为应该(你心里有没有一个例子?)@Eamonnerbnne好的方面-我将重新讨论我的实现。Wrt标点符号,我在GitHub上从您的示例代码开始,认为您必须有理由允许使用这些字符中的每一个。我还没有看到
-
的有效示例,但有大量的
)示例。当我进入PC时,我将分享我的regex101示例。
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/>');
}