我有一个.NET应用程序,根据一个名词,我希望它能正确地在单词前加上"a"或"an"。我该怎么做?
在您认为答案仅仅是检查第一个字母是否为元音字母之前,请考虑以下短语:
- 一次诚实的错误(an honest mistake)
- 一辆二手车(a used car)
我有一个.NET应用程序,根据一个名词,我希望它能正确地在单词前加上"a"或"an"。我该怎么做?
在您认为答案仅仅是检查第一个字母是否为元音字母之前,请考虑以下短语:
你可能无法得到比这更好的结果-它肯定会击败大多数基于规则的系统。
编辑:我已经用JS/C#实现了这个。 您可以在浏览器中尝试它,或者下载它使用的小型、可重复使用的javascript实现。 .NET实现包是 AvsAn
on nuget. 实现非常简单,所以如果需要,将其移植到任何其他语言都应该很容易。
事实证明,“规则”比我想像的要复杂得多:
这只是强调基于规则的系统构建起来会很棘手!
您需要使用一份异常列表。我认为并非所有的异常情况都被很好地定义了,因为它有时取决于发音者的口音。
一个愚蠢的方法是使用 Google 的两个可能性(使用其中一个搜索 API),然后使用最受欢迎的:
或者:
因此,“a europe”和“an honest”是正确的版本。
如果你能找到一个单词拼写到发音的来源,例如:
"honest":"on-ist"
"horrible":"hawr-uh-buhl, hor-"
你可以根据拼音字符串的第一个字符来做决策。为了提高性能,你可以使用这种查找方法预先生成异常集,并在执行过程中使用这些更小的查找集代替原始集合。您需要手动实现并添加所需的异常,例如如果第一个字母是'H',后跟'O',如'honest'、'hour'等,以及相反的单词如'europe'、'university'、'used'等。
由于“a”和“an”是由语音规则而不是拼写约定确定的,因此我可能会像这样做:
function aOrAn($next_word)
{
$_an = array('hour', 'honest', 'heir', 'heirloom');
$_a = array('use', 'useless', 'user');
$_vowels = array('a','e','i','o','u');
$_endings = array('ly', 'ness', 'less', 'lessly', 'ing', 'ally', 'ially');
$_endings_regex = implode('|', $_endings);
$tmp = preg_match('#(.*?)(-| |$)#', $next_word, $captures);
$the_word = trim($captures[1]);
//$the_word = Format::trimString(Utils::pregGet('#(.*?)(-| |$)#', $next_word, 1));
$_an_regex = implode('|', $_an);
if (preg_match("#($_an_regex)($_endings_regex)#i", $the_word)) {
return 'an';
}
$_a_regex = implode('|', $_a);
if (preg_match("#($_a_regex)($_endings_regex)#i", $the_word)) {
return 'a';
}
if (in_array(strtolower($the_word{0}), $_vowels)) {
return 'an';
}
return 'a';
}
最简单的方法可能是先创建规则,然后创建一个例外列表并使用它。我不认为会有太多的例外情况。
伙计,我意识到这可能是一个已经解决的争论,但我认为可以比使用维基百科的临时语法规则更容易地解决,最多只能推导出方言语法。
最好的解决方案似乎是使用a或an来触发后面单词基于音素的匹配,其中某些音素总是与"an"相关联,而剩下的则属于"a"。
卡内基梅隆大学为此类检查提供了一个很棒的在线工具 - http://www.speech.cs.cmu.edu/cgi-bin/cmudict - 它包含125k个单词和39个匹配的音素。输入一个单词即可提供整个音素集合,其中只有第一个是重要的。
如果单词未出现在字典中,例如“NSA”并且全部大写,则系统可以假定该单词是一个首字母缩略词,并根据同一原始规则集使用第一个字母确定使用哪个不定冠词。
@Nathan Long: 下载维基百科并不是一个坏主意。不需要所有的图片、视频和其他媒体。
我用php和javascript写了一个(较差的)程序,以读取整个瑞典维基百科(或至少可以从有关数学文章开始的所有文章)。我在数据库中收集了所有单词和内部链接,并跟踪每个单词的频率。我现在将其用作各种任务的单词数据库: * 查找可以从给定字母集合(包括通配符)创建的所有单词 * 为瑞典语创建了一个简单的语法文件(数据库中不存在的所有单词都被认为是不正确的)。
哦,而且使用我的笔记本电脑和10Mbit连接大约花费一周的时间来下载整个维基百科。
当你正在做这件事时,请记录所有与英语语言不一致的情况,并查看其中是否有些错误。进行修复并回馈社区。
可以参考Perl的Lingua::EN::Inflect模块。请查看源代码中的sub _indef_article
。