web-dev-qa-db-ja.com

c#に特異化するアルゴリズムがありますか?単語を複数形にしますか?

C#には、Wordを単数化する(英語で)複数形にするアルゴリズムがありますか?これを行うための.netライブラリが存在しますか(異なる言語でも可能です)?

102
Ronnie

System.Data.Entity.Design.PluralizationServices.PluralizationService もあります。

[〜#〜] update [〜#〜]:古い答えは更新に値する。ヒューマナイザーもあります: https://github.com/MehdiK/Humanizer

178
Daniel

特別なケースなしで、エスペラントのためにそれをすることができます!

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

英語の場合は、 名詞の規則的な複数形 、および 名詞の不規則な複数形 の規則を理解しておくと便利です。 英語の複数形 に関するWikipediaの記事全体があります。これには役立つ情報も含まれている場合があります。

18
Greg Hewgill

ほとんどのORMには突き刺しがありますが、通常は完璧ではありません。 Castleには Inflector Class があることは知っています。ただし、「完全に」実行するのは簡単な作業ではありません(英語の「ルール」は実際にはルールではありません:))。

14
Steven Robbins

Java-「n個がありました」」の正しい文字列を生成できるようにしたかったので、次のように書きました。

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"));
12
Lawrence Dol

Rails pluralizer。私のブログ投稿を見ることができます here 、または githubで)

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

このために、Pluralizer(当然のことながら)という小さなライブラリを.net(C#)で作成しました。

これは、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でも利用できます。

9
Jay Querido

質問は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
Zaid Masud

Subsonic 3には Inflector クラスがあり、PersonPeopleに変換することで感銘を受けました。ソースを覗いてみると、ハードコードされたリストで自然に少しだまされていることがわかりましたが、それが実際に英語でそれを行う唯一の方法であり、人間がそれを行う方法です-各単語の単数形と複数形を覚えており、ルールを適用するだけではありません。ミックスに追加する男性/女性(/ニュートラル)がないため、はるかに簡単です。

これがスニペットです。

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
Chris S

PluralizationServiceクラスの特定の使用法に関するMSDNのドキュメントはあまりないので、基本的な使用法を示す単体テストクラス(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
Ryan Rodemoyer

このページは、PluralizationService of System.Data.Entity(.NET Framework 4.0)

http://zquanghoangz.blogspot.it/2012/02/beginner-with-pluralizationservices.html

1
riofly

MicrosoftのNorthwindサンプルデータベースの使用:

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

Singularizeは「Order_Details」をSingularizeしません。末尾にsを付けて「Order_Details」を返します。回避策は何ですか?

1
RandallTo