web-dev-qa-db-fra.com

Existe-t-il un algorithme en c # pour singulariser - pluraliser un mot?

Existe-t-il un algorithme en c # pour singulariser - pluraliser un mot (en anglais) ou existe-t-il une bibliothèque .net pour ce faire (peut également être dans différentes langues)?

102
Ronnie

Vous avez également System.Data.Entity.Design.PluralizationServices.PluralizationService .

[~ # ~] mise à jour [~ # ~] : l'ancienne réponse mérite d'être mise à jour. Il y a maintenant aussi Humanizer: https://github.com/MehdiK/Humanizer

178
Daniel

Je peux le faire pour l'espéranto, sans cas particulier!

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

Pour l'anglais, il serait utile de se familiariser avec les règles pour pluriels réguliers de noms , ainsi que pluriels irréguliers de noms . Il y a tout un article Wikipedia sur le pluriel anglais , qui peut aussi contenir des informations utiles.

18
Greg Hewgill

La plupart des ORM ont un coup de poignard, bien qu'ils ne soient généralement pas parfaits. Je sais que Castle a son Classe Inflector vous pouvez probablement fouiner. Le faire "parfaitement" n'est pas une tâche facile (les "règles" anglaises ne sont pas vraiment des règles :)), donc cela dépend si vous êtes satisfait d'une approche "conjecture raisonnable".

14
Steven Robbins

J'ai triché en Java - Je voulais être en mesure de produire une chaîne correcte pour "Il n'y avait pas quelque chose (s)", alors j'ai écrit la méthode utilitaire surchargée suivante:

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

invoqué comme tel

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

J'ai fouetté un ensemble basé sur le pluraliseur Rails. Vous pouvez voir mon article de blog ici , ou sur github ici

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

J'ai créé une petite bibliothèque pour cela en .net (C #), appelée Pluralizer (sans surprise).

Il est censé fonctionner avec des phrases complètes, quelque chose comme String.Format.

Cela fonctionne essentiellement comme ceci:

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

Il peut également faire bien plus que cela. En savoir plus sur mon blog . Il est également disponible dans NuGet.

9
Jay Querido

Comme la question était pour C #, voici une belle variation sur la solution de Software Monkey (encore une fois un peu "triche", mais pour moi vraiment la façon la plus pratique et réutilisable de le faire):

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

L'utilisation est la suivante:

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

"Person".Pluralize(1, "People") = "Person"
"Person".Pluralize(2, "People") = "People"
4
Zaid Masud

Subsonic 3 a une classe Inflector qui m'a impressionné en transformant Person en People. J'ai jeté un coup d'œil à la source et l'ai trouvé naturellement triche un peu avec une liste codée en dur, mais c'est vraiment la seule façon de le faire en anglais et comment les humains le font - nous nous souvenons du singulier et du pluriel de chaque mot et n'appliquons pas simplement une règle . Comme il n'y a pas de masculin/féminin (/ neutre) à ajouter au mélange, c'est beaucoup plus simple.

Voici un extrait:

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

Il tient compte de certains mots n'ayant pas d'équivalents pluriels, comme l'exemple d'équipement. Comme vous pouvez probablement le voir, il suffit de remplacer un Regex à l'aide de $ 1.

Mise à jour:
Il semble que Subsonic Inflector est en fait la classe Castle ActiveRecord Inflector !

3
Chris S

Pas beaucoup de documentation de MSDN sur l'utilisation spécifique de la classe PluralizationService alors voici une classe de test unitaire (NUnit) pour montrer l'utilisation de base. Remarquez le cas de test étrange en bas qui montre que le service n'est pas parfait en ce qui concerne les formes plurielles non standard.

[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

Cette page montre comment utiliser PluralizationService de System.Data.Entity (.NET Framework 4.0)

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

1
riofly

Utilisation de la base de données d'exemple de Northwind de Microsoft:

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

Singularize ne singularise pas "Order_Details" Il renvoie "Order_Details" avec le s à la fin. Quel est le travail autour?

1
RandallTo