【问题标题】:Appropriate article (a/an) in String.FormatString.Format 中的适当文章 (a/an)
【发布时间】:2009-05-05 16:47:21
【问题描述】:

我正在寻找一种文化敏感的方式,以便在使用适当的冠词 (a/an) 的同时将名词正确插入句子中。它可以使用 String.Format,或者如果其他地方存在适当的方法,也可以使用其他方法。

例如:

基本句:“你正在看一个/一个 {0}”

这应该格式化为:“你在看胡萝卜”或“你在看鸡蛋”。

我目前通过手动检查要插入的单词的第一个字符然后手动插入“a”或“an”来执行此操作。但我担心当应用程序本地化为其他语言时,这可能会限制我。

有解决这个问题的最佳实践吗?

解决方案:问题似乎很复杂,以至于不存在以我最初所说的方式解决此问题的实用程序或框架。似乎最好的解决方案(在我的情况下)是将文章与名词一起存储在数据库中,以便翻译人员可以拥有他们需要的控制级别。谢谢大家的建议!

【问题讨论】:

  • 有一点要注意;即使是“首字母”解决方案也不完美。 “an”的用法出现在以下单词以元音 SOUND 开头时,因此正确的术语是(例如)“an herbivore”,尽管“herbivore”以“h”开头。

标签: language-agnostic localization grammar nlp


【解决方案1】:

问题是即使是英文,a-vs-an也不是由起始字母决定的,而是由起始决定的。你可以根据起始字母用英文做出一个很好的假设,但也有一些例外(例如“小时”、“用户”)。

最好的办法是访问一个单词的发音以便能够选择。

除此之外,最好的办法是列出常见异常,然后猜测其余的。


来自Wikipedia

“a”或“an”的选择是 由语音规则决定 而不是拼写约定。 “安”是 在演讲中使用以消除 尴尬的声门停止(瞬间沉默 暂停),否则需要 在“a”和后面的单词之间,例如 “X光片”……以下 段落是“an”的拼写规则 如果拼音规则可以使用 没看懂。

【讨论】:

    【解决方案2】:

    除了 lc(一小时,一顶帽子)指出的问题之外,不同语言的语法规则差异很大。例如,许多基于拉丁语的语言会根据名词的“性别”和“数字”来切换名词的冠词,有时可以从单词的最后几个字符推断出来,但与英语有同样的问题……有很多例外。

    如果您正在讨论对界面进行本地化,我会将文章存储为每种语言的界面元素的名词。如果您正在处理用户输入,我看不到这样做的简单方法。

    【讨论】:

      【解决方案3】:

      old text adventure computer games 时代,解决此问题的一种方法是将“a”、“an”、“the”等作为事物实际名称的一部分。当你在这些游戏中看到“一个邮箱”时,没有智能 AI 来确定“a”。对象的名称是“邮箱”。在某些游戏中,它可能会说“你打开邮箱”,这听起来很愚蠢,而在其他游戏中,它可能会说“你打开邮箱”,这意味着输入的对象有另一个名称,用于不同的语法上下文。我建议你走这条路,而不是你现在走的路。

      【讨论】:

        【解决方案4】:

        其他语言也有类似的问题,但在不同的上下文中,例如取决于对象的性别或对象的实际数量(而且有些语言不仅区分一两个对象,而且一两个对象的语法不同或两个以上的俄语对象)。

        使用德语示例:

        “你正在看 a(n) X”的等价物是:

        “Du siehst ein X”
        或“Du siehst eine X”
        或“Du siehst einen X”

        取决于对象X的性别。而对象的性别是你无法猜测的,它与对象的名称有关,只是根据历史传统。

        因此,在大多数语言中没有简单的方法来实现这种区别。我的建议是始终使用适用于所有情况的配方,例如

        “您正在查看 X 类型的对象”
        或“您正在查看 a(n) X”
        或“你在看一个 X”

        【讨论】:

          【解决方案5】:

          这在文化上有多敏感?您正在尝试做的只有在英语中才有意义。其他语言可能需要对句子进行完全不同的更改。有些可能会修饰名词,有些可能会改变句子结构,有些可能会重新排列单词等等。

          当本地化为其他语言时,您尝试执行的操作中断。没有自动的方法来解决这个问题。

          举个简单的例子,考虑一下当你尝试写“the {something}”时会发生什么 在英语中,您只需在单词前面加上“the”就可以了。在法语中,根据性别以及是否为复数,您可以在其前面加上 le、la 或 les。 在丹麦语中,您改为添加“en”或“et”后缀。因此,当单词 table 翻译为“bord”时,“table”变成了“bordet”。并且“椅子”(stol)变成了“偷来的”。

          解决这个问题的唯一有意义的方法是让翻译者控制整个句子。不要以为你可以到处插入一些与文化相关的词。

          因此,在实践中,最好的解决方案可能是接受您的应用程序不能简单地本地化。也许您可以确保一些关键语言是可能的,除此之外,忽略这个问题。然后,如果您将来需要将应用程序翻译成语言 X,请与翻译人员一起对应用程序代码进行必要的更改。

          或者,您必须完全放弃尝试自己构造句子。确保句子正确的唯一方法是让译者写下整个句子。当然,当您希望能够交换单个单词时,这会导致问题。

          【讨论】:

          • 嗯,这在瑞典语中是有意义的。而且由于人们永远无法知道它在任何语言中是否有意义,因此这并不是一种完全荒谬的方法。但我同意翻译应该是逐句的,而不是逐名词的。有些语言甚至可能没有名词,对吧?
          • 我很清楚这种方法仅限于英语(正如其他人指出的那样,它甚至不能解决所有英语场景)。这就是我提出这个问题的原因
          • 如果您期望它工作,这是一种荒谬的方法。他要求采取一种文化敏感的方法,在这种情况下,这是荒谬的。在“它用英语工作,如果我能把它翻译成,比如说,德语,西班牙语和俄语”的更有限的上下文中,它可以工作,但它不再尊重文化一般
          • @DivisionByZorro:问题是不存在适用于所有语言的解决方案(除了“让翻译者翻译整个句子”)。这不仅是您建议的解决方案不起作用,而且问题在不同语言中完全不同。如果您希望本地化在一般情况下起作用,那么整个方法是有缺陷的。
          【解决方案6】:

          有一个名为 .NET inflector 的库用于复数/单数化,可能会以相同的方式重新利用或扩展此类事物。您在这里寻找的是一般规则,然后您可以调整例外情况......例如,以通常发音为元音的字母组合开头的单词。虽然这[严格来说]不是文化敏感的,但它至少应该让你开始用英语。

          【讨论】:

            猜你喜欢
            • 2021-02-10
            • 2011-07-19
            • 2023-04-01
            • 2011-03-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多