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라는 클래스가 표시됩니다.이 클래스에는 예외적 인 사례가 많이 정의되어 있고 흥미로운 읽기가 가능합니다. 나는 특히 'pneumonoultramicroscopicsilicovolcanoconiosis'를 좋아하는데, 그것은 내 엔티티 모델에서 항상 사용하고 있음을 발견합니다 ... 8o)
MrKWatkins

7
어떻게 추가되었는지 짐작할 수 있습니다. 테스터가 해당 단어에 대해 작동하지 않는다고 개발자에 버그를 제출했습니다. Dev가 수정했습니다. 둘 다 웃었다.
merlinbeard 2013 년

2
@MrKWatkins 사운드 더 같은 'supercalifragilisticexpialidocious'
Corstian Boerman

1
Humanizer는 훌륭한 권장 사항입니다. 물론 존재를 확인하기 전에 15 % 정도 직접 구현했습니다.
Casey

18

특별한 경우없이 에스페란토로 할 수 있습니다!

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

영어의 경우 정규 복수 명사불규칙 복수 명사 규칙에 익숙해지는 것이 유용 할 것 입니다. 영어 복수형 에 대한 전체 Wikipedia 기사가 있으며,이 기사 에는 유용한 정보도있을 수 있습니다.


5
동사 나 부사를 통과하면 던져야합니다!
Timwi

1
@Matt : 물론 이것은 명목상의 경우에 적합합니다. 나는이 방법을 고소 사건으로 확장하는 것이 기민한 독자에게 간단하다고 믿습니다.
그렉 Hewgill

14

대부분의 ORM은 일반적으로 완벽하지는 않지만 찌르는 경향이 있습니다. 캐슬에는 아마 당신이 찌를 수있는 인플 렉터 클래스 가 있다는 것을 알고 있습니다. "완벽하게"하는 것은 쉬운 일이 아닙니다 (영어 "규칙"은 실제로 규칙이 아닙니다 :)). 따라서 "합리적인 추측"접근 방식에 만족하는지 여부에 따라 다릅니다.


귀하의 제안에서 "Inflector"를 검색 한 결과이 andrewpeters.net/inflectornet 이 기본적으로 Castle 1과 동일 하다는 것을 발견했습니다
Ronnie

4
사실 그것은 기본적으로 동일하지 않고 동일합니다.
David Pfeffer

12

나는 자바에서 속임수를 썼다. "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"));

이것은 문법의 작은 부분 만 다루고 퀴즈, 파티, 반쪽, 마우스, 색인 등과 같은 단어는 설명하지 않습니다. 좋은 첫 번째 찌르기이지만 먼저 처리해야 할 다른 규칙이 많이 있습니다. .
Jeremy S

4
@Jeremy :?에 println ( "지금까지"+ singularPlural (수, "퀴즈", "퀴즈") + "당신은 통과")하지 왜
로렌스 한 Dol-

질문을 다르게 해석 할 수 있습니다. 나는 알고리즘이 개발자의 힌트없이 복수형을 결정해야한다고 생각하는 반면, 당신의 방법은 복수형이 개발자에게 무엇인지 아는 책임을 져야합니다.
Jeremy S

3
@Jeremy : 따라서 "I cheated ..."리드 인-반대 투표를 보증하지 않는 것 같습니다.
Lawrence Dol

1
동의합니다. 나는 또한 제공된 정보가 유용하다고 생각하기 때문에 어떤 반대표도 나로부터 온 것이 아닙니다. 나는 "한 사람의 쓰레기 ..."라는 문구에 따라 일반적으로 반대표를 던지지 않습니다.
Jeremy 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은 (5 ". {홈} {그녀는} {각각의 그녀}에가는 {된다}")
제이 Querido

Shaun Wilson-내 컴퓨터는 현재 부품이 있습니다. 백업을 서두르고 있으며 하루나 이틀 이내에 업데이트됩니다. 그 동안, nuget.org/packages?q=pluralizer
제이 Querido

8

Rails pluralizer를 기반으로 하나를 채찍질했습니다. 여기 에서 내 블로그 게시물을 보거나 여기 github에서 볼 수 있습니다.

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

3
공유해 주셔서 감사합니다. 다른 어셈블리를 참조 할 필요가 없어서 다행입니다.
hofnarwillie 2014 년

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

음속 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을 사용하여 간단한 교체를 수행합니다.

업데이트 :
그것은 음속의 표시는 Inflector가리키고있다 성 액티브의Inflector 클래스!


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"를 Singularize하지 않습니다 s. 끝에 있는 "Order_Details"를 반환합니다 . 해결 방법은 무엇입니까?


1
이것은 질문에 대한 답이 아니라 질문입니다.하지만 Pluralize ()와 Singularize ()는 사전 단어에서만 작동합니다. ICustomPluralizationMapping.AddWord를 사용하여 단어를 추가하는 방법이 있지만 적어도 코드 이름과 같은 실제가 아닌 단어가 많을 때 그다지 좋은 솔루션이 아니 었습니다.
tordal

@tordal 감사합니다. 이것이 바로 제가이 질문에 온 것입니다
Chad
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.