我有兴趣验证或自动纠正英文文本块中不定冠词"a"和"an"的使用textarea.
语法规则是文章的选择取决于开始下一个单词的声音.细节在这里和这里.这看起来非常广泛,但是在之前的答案中有一个建议(如何正确地用"a"和"an"前缀一个单词?)来引用一个庞大的英文文本数据库来创建启发式来推断出正确的不确定性在特定情况下使用的文章.Eamon Nerbonne评论说他已经这样做了,那么我该如何将这个解决方案应用到这个实际的实现中呢?
到目前为止,我所使用的函数实现了语法规则中最简单的部分; 它使用的时候下面的词以元音开头,和一个其他.它还尊重该文章的现有资本化.但在实际使用中,这是不实际的,因为该规则的例外情况非常普遍.例如,"一匹马"是正确的,而"荣誉"和"一个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/>');
}
Run Code Online (Sandbox Code Playgroud)
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/>');
}Run Code Online (Sandbox Code Playgroud)
input, label {
display:block;
}
.changed {
font-weight: bold;
}Run Code Online (Sandbox Code Playgroud)
<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"/>Run Code Online (Sandbox Code Playgroud)
样本输入的预期输出是:
一个智者曾经说过:" 一个苹果一个一天,医生远离我."
给我一个休息时间.
我想要一个苹果.
我女儿想要一只河马过圣诞节.
这是一个诚实的错误.
用户是否点击了按钮?
的 MSDS(物质安全数据表)被用来记录数据.
遵循对如何正确地在单词前面添加“a”和“an”的轻率回答?,Eamon Nerbonne 遵循了给定的建议,并产生了一种有效的算法,可以准确地识别在任何后续文本之前使用的正确的不定冠词。所以感谢@JayMEE 的指点,它确实有帮助。
\n\n该算法的实现超出了基本问答的范围 - 您可以在 Eamon 的博客文章和GitHub 存储库中阅读相关内容。然而,它的使用非常简单!
\n\n以下是如何fixArticles()修改以使用 Eamon 代码的简单、缩小版本AvsAn-simple.min.js. 请参阅JSFiddle 演示。
function fixArticles(txt) {\n var valTxt = txt.replace(/\\b(a|an) ([\\s\\(\\"\'\xe2\x80\x9c\xe2\x80\x98-]?\\w*)\\b/gim, function(match, article, following) {\n var input = following.replace(/^[\\s\\(\\"\'\xe2\x80\x9c\xe2\x80\x98-]+|\\s+$/g, ""); //strip initial punctuation symbols\n var res = AvsAnSimple.query(input);\n var newArticle = res.replace(/^a/i, article.charAt(0));\n if (newArticle !== article) {\n newArticle = "<span class=\'changed\'>" + newArticle + "</span>";\n }\n return newArticle + \' \' + following;\n });\n\n document.getElementById(\'output-text\').innerHTML = valTxt.replace(/\\n/gm, \'<br/>\');\n}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
272 次 |
| 最近记录: |