110 votes

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 faire cela (peut-être aussi dans d'autres langues) ?

188voto

Daniel Points 2657

Vous disposez également de la System.Data.Entity.Design.PluralizationServices.PluralizationService .

UPDATE : L'ancienne réponse mérite une mise à jour. Il y a maintenant aussi Humanizer : https://github.com/MehdiK/Humanizer

2 votes

Hmmm êtes-vous autorisé à redistribuer, ou simplement à utiliser, une DLL de conception ? Je pose cette question car je sais que la licence de DevExpress interdit la redistribution de toute DLL de conception.

59 votes

L'ouverture du code avec ILSpy fait apparaître une classe appelée EnglishPluralizationService, dans laquelle de nombreux cas exceptionnels sont définis et qui constitue une lecture intéressante. J'aime particulièrement 'pneumonoultramicroscopicsilicovolcanoconiosis', que j'utilise tout le temps dans mes modèles d'entités... 8o)

7 votes

Je peux deviner comment cela a été ajouté. Un testeur a signalé un bug au développeur en disant que cela ne fonctionnait pas pour le mot en question. Le développeur l'a corrigé. Les deux ont partagé un rire.

18voto

Greg Hewgill Points 356191

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 de Pluriel régulier des noms ainsi que Pluriel irrégulier des noms . Il existe un article entier de Wikipedia sur le Anglais au pluriel qui peut aussi contenir des informations utiles.

5 votes

Vous devriez le faire lancer si vous passez dans un verbe ou un adverbe !

1 votes

@Matt : Bien sûr, cette méthode est appropriée pour le cas nominatif ; je pense que l'extension de cette méthode au cas accusatif est simple pour un lecteur avisé.

14voto

Steven Robbins Points 18791

La plupart des ORM s'y essaient, même s'ils ne sont généralement pas parfaits. Je sais que Castle a ses Classe Inflector vous pouvez probablement y jeter un coup d'œil. 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 vous contentez d'une approche de "supposition raisonnable".

0 votes

A partir de votre suggestion, j'ai cherché "Inflector" et j'ai trouvé ceci andrewpeters.net/inflectornet qui devrait être le même que celui de Castle.

4 votes

En fait, ce n'est pas fondamentalement la même chose, c'est identique.

12voto

Lawrence Dol Points 27976

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

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 suit

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

0 votes

Cela ne couvre cependant qu'une petite partie de la grammaire, sans tenir compte de mots comme quizz, parties, moitiés, souris, indices, etc. C'est un bon premier essai, mais il y a beaucoup d'autres règles qui devraient probablement être traitées en premier.

4 votes

@Jeremy : Pourquoi pas : println("Vous avez réussi " + singularPlural(count, "quiz", "quizzes") + " jusqu'à présent")

0 votes

J'interprète peut-être la question différemment. Je pense que l'algorithme devrait déterminer la forme plurielle sans aucune indication du développeur, alors que votre méthode impose au développeur la charge de savoir quelle est la forme plurielle.

10voto

Jay Querido Points 589

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

Il est destiné à fonctionner avec des phrases complètes, comme le fait String.Format.

En gros, ça fonctionne comme ça :

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 aussi faire bien plus que cela. En savoir plus sur mon blog . Il est également disponible dans NuGet.

0 votes

4 votes

Oui, cette bibliothèque ne fait que des mots simples, et seulement des noms (bien que Pluralizer utilise cette classe en interne). Cette bibliothèque a pour but de rendre les phrases entières plus faciles à écrire. Jetez un coup d'oeil à mon blog pour plus d'exemples. Pluralizer.Instance.Pluralize("{Elle} {est} allée à {sa|leur} {maison} respective.", 5)

0 votes

Shaun Wilson - Mon ordinateur est actuellement en pièces détachées. Je m'empresse de le remettre en marche et je le mettrai à jour d'ici un jour ou deux. En attendant, nuget.org/packages?q=pluraliseur

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X