単語を複数形に-単語を複数形にするc#のアルゴリズムはありますか?


106

単数形にするためのc#のアルゴリズムはありますか-単語を複数形に(英語で)、またはこれを行うための.netライブラリが存在しますか(別の言語でもかまいません)?

回答:


182

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

更新:古い答えは更新に値します。Humanizerもありますhttps : //github.com/MehdiK/Humanizer


2
うーん、デザインDLLを再配布したり、そのまま使用したりできますか?DevExpressのライセンスが.design DLLの再配布を禁止していることを知っているので、これをお願いします。
Pierre-Alain Vigeant 2011年

58
ILSpyでコードを開くと、EnglishPluralizationServiceと呼ばれるクラスが表示されます。このクラスには多くの例外的なケースが定義されており、興味深い読み物になります。私は特に、「
空気圧顕微鏡法によるシリコ火山カノコニー症」が好き

7
それがどうやって追加されたのか推測できます。テスターが開発者にバグを報告し、その単語では機能しないと報告しました。Devが修正しました。両方とも笑いを共有しました。
merlinbeard 2013年


1
ヒューマナイザーは素晴らしい推薦です。もちろん、それが存在することを知る前に、自分で15%程度実装しました。
ケーシー

18

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

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

英語の場合、ためのルールに慣れるために有用であろう正規名詞の複数形だけでなく、名詞の不規則複数形英語の複数形に関するWikipediaの記事全体があり、役立つ情報も含まれている場合があります。


5
動詞または副詞を渡す場合は、スローする必要があります。
ティムウィ

1
@マット:もちろん、これは主格の場合に適しています。この方法を非難的なケースに拡張することは、賢い読者にとっては簡単なことだと私は信じています。
グレッグヒューギル2012

14

彼らは一般的に完璧ではありませんが、ほとんどのORMはそれに刺し傷があります。キャッスルにはインフレクタークラスがあり、おそらくあなたはそれを思いつくことができます。それを「完全に」行うことは簡単な作業ではありませんが(英語の「ルール」は実際にはルールではありません))、「合理的な推測」アプローチに満足しているかどうかによって異なります。


あなたの提案から私は「インフレクター」を検索し、これと基本的にキャッスルのものと同じになるはずのand​​rewpeters.net/inflectornetを見つけました
ロニー

4
実際には基本的に同じではなく、同じです。
David Pfeffer、

12

私はJavaで不正行為をした-「何かがありました」の正しい文字列を生成できるようにしたかったので、次のように書きました。少しオーバーロードされたユーティリティメソッド:

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"));

ただし、これは文法の小さなセクションのみをカバーしています。クイズ、パーティー、半分、マウス、インデックスなどの単語は考慮されていません。これは良い最初のスタブですが、おそらく最初に処理する必要のある他の多くのルールがあります。 。
ジェレミーS

4
@ジェレミー:なぜそうしないのですか?:println( "あなたは" + singularPlural(count、 "quiz"、 "quizzes")+ "これまでに合格しました")
Lawrence Dol

質問の解釈が違うかもしれません。私はアルゴリズムが複数形を開発者からのヒントなしに決定する必要があると思いますが、あなたの方法は複数形が開発者に何であるかを知る責任を負います。
ジェレミーS

3
@ジェレミー:したがって、「私はだまされました...」がリードインします-反対票を正当化するようには見えません。
ローレンスドル

1
同意した。また、提供された情報は有用だったと思います。そのため、私からの反対投票はありませんでした。「一人の男のがらくた...」という言葉に沿って、私は一般的に反対票を投じません。
ジェレミーS

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



4
うん、そのライブラリは単一の単語と名詞のみを処理します(Pluralizerは内部的にそのクラスを使用しています)。このライブラリは、文章全体を書きやすくします。その他の例については、私のブログをご覧ください。Pluralizer.Instance.Pluralize( "{She} {is}が{her | theirそれぞれ} {home}に移動します。"、5)
Jay Querido

ショーン・ウィルソン-私のコンピューターは現在部分的になっています。私はそれを元に戻すことを急いでおり、1〜2日以内に更新されます。それまでの間、nuget.org / packages?q
Jay Querido

8

Railsの複数形化プログラムに基づいて1つにまとめました。私のブログ投稿はこちら、またはgithubのこちらでご覧いただけます

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

3
共有いただきありがとうございます。嬉しいことに、別のアセンブリを参照する必要がありませんでした。
hofnarwillie 14

1
シンプルで美しいですが、Singularize機能がありません
amd

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"

3

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");

これは、設備の例のように、複数の同等語がないいくつかの単語を説明します。おそらくおわかりのように、Regex$ 1を使用して簡単に置き換えます。

更新:
サブソニックのが表示されますInflectorInfactはある城のActiveRecordInflectorクラス!


2

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
    }
}


1

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

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

Singularizeは、「Order_Details」を単数化しません。末尾に「Order_Details」を返しますs。回避策は何ですか?


1
これは質問であり、質問に対する回答ではありません...しかし、Pluralize()とSingularize()は辞書の単語でのみ機能します。ICustomPluralizationMapping.AddWordを使用して単語を追加する方法はありますが、少なくとも私にとっては、コード名のような実際にはない単語がたくさんある場合、それはあまり良い解決策ではありませんでした。
トーダル

@tordalありがとう、これは私がこの質問に来たまさにです
チャド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.