c#中是否有任何算法可以对单词进行单数-复数?

问题描述 投票:0回答:12

C# 中是否有任何算法可以对单词进行单数复数(英语),或者是否存在 .net 库来执行此操作(也可能采用不同的语言)?

c# algorithm
12个回答
195
投票

您还拥有 System.Data.Entity.Design.PluralizationServices.PluralizationService

更新:旧答案值得更新。现在还有 Humanizer:https://github.com/MehdiK/Humanizer


20
投票

世界语我可以做到,没有特殊情况!

string plural(string noun) { return noun + "j"; }

对于英语,熟悉规则名词复数以及不规则名词复数的规则会很有用。维基百科上有一整篇关于英语复数的文章,其中也可能有一些有用的信息。


14
投票

大多数 ORM 都有尝试,尽管它们通常并不完美。我知道 Castle 有它的 Inflector Class 你可能可以四处看看。不过,“完美”地做到这一点并不是一件容易的事(英语“规则”并不是真正的规则:)),所以这取决于您是否对“合理猜测”方法感到满意。


12
投票

我在 Java 中作弊 - 我希望能够为“There were n Something(s)”生成正确的字符串,所以我写了下面的内容。小重载实用方法:

static public String pluralize(int val, String sng) {
    return pluralize(val,sng,(sng+"s"));
    }

static public String pluralize(int val, String sng, String plu) {
    return (val+" "+(val==1 ? sng : plu)); 
    }

像这样调用

System.out.println("There were "+pluralize(count,"something"));
System.out.println("You have broken "+pluralize(count,"knife","knives"));

10
投票

我在 .net (C#) 中为此创建了一个小型库,称为 Pluralizer(毫不奇怪)。

它的目的是处理完整的句子,就像 String.Format 一样。

它的工作原理基本上是这样的:

var target = new Pluralizer();
var str = "There {is} {_} {person}.";

var single = target.Pluralize(str, 1);
Assert.AreEqual("There is 1 person.", single);

// Or use the singleton if you're feeling dirty:
var several = Pluralizer.Instance.Pluralize(str, 47);
Assert.AreEqual("There are 47 people.", several);

它还可以做更多的事情。阅读更多相关信息在我的博客上。它也可以在 NuGet 中使用。


8
投票

我根据 Rails 复数器将一个组合在一起。 您可以在这里查看我的博客文章,或者在github上

output = Formatting.Pluralization(100, "sausage"); 

5
投票

由于问题是针对 C# 的,因此这是 Software Monkey 解决方案的一个很好的变体(再次有点“作弊”,但对我来说确实是最实用且可重用的方法):

    public static string Pluralize(this string singularForm, int howMany)
    {
        return singularForm.Pluralize(howMany, singularForm + "s");
    }

    public static string Pluralize(this string singularForm, int howMany, string pluralForm)
    {
        return howMany == 1 ? singularForm : pluralForm;
    }

使用方法如下:

"Item".Pluralize(1) = "Item"
"Item".Pluralize(2) = "Items"

"Person".Pluralize(1, "People") = "Person"
"Person".Pluralize(2, "People") = "People"

4
投票

Subsonic 3 有一个

Inflector
类,通过将
Person
变成
People
给我留下了深刻的印象。我查看了源代码,发现它自然地用硬编码列表做了一点欺骗,但这实际上是英语中唯一的方法以及人类的做法 - 我们记住每个单词的单数和复数,而不仅仅是应用规则。由于没有男性/女性(/中性)可添加到混合中,所以要简单得多。

这是一个片段:

AddSingularRule("^(ox)en", "$1");
AddSingularRule("(vert|ind)ices$", "$1ex");
AddSingularRule("(matr)ices$", "$1ix");
AddSingularRule("(quiz)zes$", "$1");

AddIrregularRule("person", "people");
AddIrregularRule("man", "men");
AddIrregularRule("child", "children");
AddIrregularRule("sex", "sexes");
AddIrregularRule("tax", "taxes");
AddIrregularRule("move", "moves");

AddUnknownCountRule("equipment");

它解释了一些没有复数对应词的单词,例如设备示例。正如您可能知道的那样,它使用 $1 进行了简单的

Regex
替换。

更新:
看起来 Subsonic 的

Inflector
实际上是 Castle ActiveRecord
Inflector
类!


3
投票

MSDN 上关于 PluralizationService 类的具体用法的文档不多,因此这里有一个单元测试类(NUnit)来展示基本用法。请注意底部的奇怪测试用例,它表明在涉及非标准复数形式时服务并不完美。

[TestFixture]
public class PluralizationServiceTests
{
    [Test]
    public void Test01()
    {
        var service = PluralizationService.CreateService(CultureInfo.CurrentCulture);

        Assert.AreEqual("tigers", service.Pluralize("tiger"));
        Assert.AreEqual("processes", service.Pluralize("process"));
        Assert.AreEqual("fungi", service.Pluralize("fungus"));

        Assert.AreNotEqual("syllabi", service.Pluralize("syllabus")); // wrong pluralization
    }
}

2
投票

使用微软的Northwind示例数据库:

 System.Data.Entity.Design.PluralizationServices.PluralizationService.CreateService(new System.Globalization.CultureInfo("en-US"));

单一化不会单一化“Order_Details” 它返回“Order_Details”,末尾带有

s
。解决办法是什么?


2
投票

您可以使用

PluralizationService
(.NET Framework 4.0)的
System.Data.Entity
,如下页面所示: http://zquanghoangz.blogspot.it/2012/02/beginner-with-pluralizationservices.html


0
投票

在 .NET Standard 2.1 中,您可以添加此包:

dotnet add package PluralizeService.Core

示例:

Console.WriteLine(PluralizationProvider.Singularize("buses"));
// outputs: bus

Console.WriteLine(PluralizationProvider.Pluralize("Company"));
// outputs: Companies

来源:https://www.nuget.org/packages/PluralizeService.Core

© www.soinside.com 2019 - 2024. All rights reserved.