Есть ли какой - либо алгоритм в c# для сингуляризации-плюрализации слова?



существует ли какой - либо алгоритм в c# для сингуляризации-плюрализации слова (на английском языке) или существует библиотека .net для этого (может быть также на разных языках)?

687   11  

11 ответов:

У вас также есть

Я могу сделать это для эсперанто, без особых случаев!

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

для английского языка было бы полезно ознакомиться с правилами для регулярные множественное число существительных, а также неправильное множественное число существительных. Существует целая статья Википедии о английский язык множественное число, который может иметь некоторую полезную информацию тоже.

большинство Ормов имеют удар по нему, хотя они, как правило, не идеальны. Я знаю, что замок имеет Класс Инфлектора вы, вероятно,можете пошарить. Делать это "отлично" - непростая задача (английские" правила "на самом деле не являются правилами :)), поэтому это зависит от того, довольны ли вы подходом" разумного предположения".

Я обманул в 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"));

Я создал крошечную библиотеку для этого в .net (C#), называемую Pluralizer (неудивительно).

Он предназначен для работы с полными предложениями, что-то вроде строки.Формат.

это в основном работает так:

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.

Я сбил один вместе на основе рельсов плюрализатора. Вы можете увидеть мой пост в блоге здесь или на github здесь

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

как вопрос был для 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 имеет Inflector класс, который впечатлил меня, повернув Person на People. Я заглянул в источник и обнаружил, что он, естественно, немного обманывает с жестко закодированным списком, но это действительно единственный способ сделать это на английском языке и как люди это делают - мы помним единственное и множественное число каждого слова и не просто применяем правило. Поскольку нет мужского / женского (/нейтрального), чтобы добавить к смеси, это намного проще.

здесь фрагмент:

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

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

AddUnknownCountRule("equipment");

это объясняет некоторые слова, не имеющие множественных эквивалентов, как пример оборудования. Как вы, наверное, можете сказать, это делает простой Regex заменить с помощью $1.

обновление:
Это кажется дозвуковым Inflector это infact Замок ActiveRecord Inflector класс!

Не так много документации от 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
    }
}

эта страница показывает, как использовать PluralizationService на System.Data.Entity (.NET Framework 4.0)

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

использование базы данных Microsoft Northwind example:

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

выделить не выделить "элемент order_details" Он возвращает "Order_Details" с s в конце. Что такое работа вокруг?

Comments

    Ничего не найдено.