Apakah ada algoritma dalam c # untuk menyingularisasi - membuat jamak kata?

106

Apakah ada algoritma dalam c # untuk singularisasi - membuat jamak sebuah kata (dalam bahasa Inggris) atau apakah ada pustaka .net untuk melakukan ini (mungkin juga dalam bahasa yang berbeda)?

Ronnie
sumber

Jawaban:

182

Anda juga memiliki System.Data.Entity.Design.PluralizationServices.PluralizationService .

PEMBARUAN : Jawaban lama perlu diperbarui. Sekarang ada juga Humanizer: https://github.com/MehdiK/Humanizer

Daniel
sumber
2
Hmmm, apakah Anda mengizinkan untuk mendistribusikan ulang, atau hanya menggunakan, DLL Desain? Saya menanyakannya karena saya tahu bahwa lisensi untuk DevExpress melarang pendistribusian ulang DLL .design apa pun.
Pierre-Alain Vigeant
58
Membuka kode dengan ILSpy menunjukkan kelas yang disebut EnglishPluralizationService, yang memiliki banyak kasus luar biasa yang ditentukan dan membuatnya menarik untuk dibaca. Saya sangat suka 'pneumonoultramicroscopicsilicovolcanoconiosis', yang saya gunakan sepanjang waktu dalam model entitas saya ... 8o)
MrKWatkins
7
Saya bisa menebak bagaimana itu bisa ditambahkan. Seorang penguji mengajukan bug pada dev dengan mengatakan itu tidak berfungsi untuk kata tersebut. Dev memperbaikinya. Keduanya berbagi tawa.
merlinbeard
2
@MrKWatkins Kedengarannya lebih seperti 'supercalifragilisticexpialidocious'
Corstian Boerman
1
Humanizer adalah rekomendasi yang bagus. Saya tentu saja menerapkan 15% darinya sendiri sebelum menemukan itu ada.
Casey
18

Saya bisa melakukannya untuk orang Esperanto, tanpa kasus khusus!

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

Untuk bahasa Inggris, akan berguna jika Anda terbiasa dengan aturan untuk Kata Benda Jamak Beraturan , serta Bentuk Jamak Tidak Beraturan dari Kata Benda . Ada seluruh artikel Wikipedia dalam bahasa Inggris jamak , yang mungkin memiliki beberapa informasi berguna juga.

Greg Hewgill
sumber
5
Anda harus membuatnya melempar jika Anda memasukkan kata kerja atau kata keterangan!
Timwi
1
@Matt: Tentu saja ini sesuai untuk kasus nominatif; Saya percaya bahwa memperluas metode ini ke kasus akusatif sangat mudah bagi pembaca yang cerdik.
Greg Hewgill
14

Kebanyakan ORM mencoba melakukannya, meskipun umumnya tidak sempurna. Saya tahu Castle memiliki Kelas Inflektor yang mungkin bisa Anda lihat-lihat. Melakukannya "dengan sempurna" bukanlah tugas yang mudah ("rules" dalam bahasa Inggris sebenarnya bukan aturan :)), jadi itu tergantung apakah Anda senang dengan pendekatan "tebakan masuk akal".

Steven Robbins
sumber
Dari saran Anda, saya mencari "Inflector" dan menemukan andrewpeters.net/inflectornet ini yang pada dasarnya sama dengan Castle
Ronnie
4
Sebenarnya pada dasarnya tidak sama, itu identik.
David Pfeffer
12

Saya menyontek di Java - saya ingin dapat menghasilkan string yang benar untuk "Ada n sesuatu", jadi saya menulis foll. sedikit metode utilitas yang kelebihan beban:

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

dipanggil seperti itu

System.out.println("There were "+pluralize(count,"something"));
System.out.println("You have broken "+pluralize(count,"knife","knives"));
Lawrence Dol
sumber
Ini hanya mencakup sebagian kecil dari tata bahasa, itu tidak memperhitungkan kata-kata seperti kuis, pesta, separuh, mouse, indeks, dll. Ini adalah tusukan pertama yang baik, tetapi ada banyak aturan lain yang mungkin harus diproses terlebih dahulu .
Jeremy S
4
@Jeremy: Mengapa tidak ?: println ("Anda telah lulus" + singularPlural (hitung, "kuis", "kuis") + "sejauh ini")
Lawrence Dol
Saya mungkin menafsirkan pertanyaan secara berbeda. Saya berpikir algoritme harus menentukan bentuk jamak tanpa petunjuk apa pun dari pengembang, sementara metode Anda memberikan tanggung jawab untuk mengetahui apa bentuk jamak itu pada pengembang.
Jeremy S
3
@ Jeremy: Oleh karena itu, petunjuk "Saya menipu ..." - tampaknya tidak menjamin suara negatif.
Lawrence Dol
1
Sepakat. Saya juga berpendapat bahwa informasi yang diberikan bermanfaat, itulah sebabnya saya tidak memberikan suara negatif apa pun. Saya tidak memberi suara negatif secara umum, seperti "sampah satu orang ...".
Jeremy S
10

Saya telah membuat perpustakaan kecil untuk ini di .net (C #), yang disebut Pluralizer (tidak mengejutkan).

Ini dimaksudkan untuk bekerja dengan kalimat penuh, seperti halnya String.Format.

Ini pada dasarnya bekerja seperti ini:

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

Itu juga bisa melakukan lebih dari itu. Baca lebih lanjut tentang itu di blog saya . Ini juga tersedia di NuGet.

Jay Querido
sumber
4
Yup, library itu hanya mengerjakan satu kata, dan hanya kata benda (meskipun Pluralizer menggunakan kelas itu secara internal). Pustaka ini membuat seluruh kalimat lebih mudah ditulis. Lihat blog saya untuk contoh lainnya. Pluralizer.Instance.Pluralize ("{She} {is} pergi ke {her | masing-masing} {rumah}.", 5)
Jay Querido
Shaun Wilson - Komputer saya saat ini dalam beberapa bagian. Saya terburu-buru untuk mendapatkannya kembali dan akan memperbaruinya dalam satu atau dua hari. Sementara itu, nuget.org/packages?q=pluralizer
Jay Querido
8

Saya menggabungkannya berdasarkan Rails pluralizer. Anda dapat melihat posting blog saya di sini , atau di github di sini

output = Formatting.Pluralization(100, "sausage"); 
Matt Grande
sumber
3
Terima kasih telah berbagi. Senang saya tidak perlu merujuk perakitan lain.
hofnarwillie
1
Sederhana dan indah !, tetapi merindukan fungsionalitas Singularize
amd
5

Karena pertanyaannya adalah untuk C #, berikut adalah variasi yang bagus pada solusi Software Monkey (lagi-lagi sedikit "curang", tetapi bagi saya cara yang paling praktis dan dapat digunakan kembali untuk melakukan ini):

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

Penggunaannya sebagai berikut:

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

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

Subsonik 3 memiliki Inflectorkelas yang membuat saya terkesan dengan memutar Personke People. Saya mengintip sumbernya dan menemukan itu secara alami curang sedikit dengan daftar hardcode tetapi itu benar-benar satu-satunya cara melakukannya dalam bahasa Inggris dan bagaimana manusia melakukannya - kami mengingat bentuk tunggal dan jamak dari setiap kata dan tidak hanya menerapkan aturan . Karena tidak ada maskulin / feminin (/ netral) untuk ditambahkan ke dalam campuran, itu jauh lebih sederhana.

Berikut cuplikannya:

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

Ini menjelaskan beberapa kata yang tidak memiliki padanan jamak, seperti contoh perlengkapan. Seperti yang mungkin bisa Anda katakan, itu adalah Regexpenggantian sederhana menggunakan $ 1.

Pembaruan:
Tampaknya Subsonik sebenarnya Inflectoradalah kelas Castle ActiveRecordInflector !

Chris S
sumber
2

Tidak banyak dokumentasi dari MSDN tentang penggunaan khusus kelas PluralizationService jadi di sini ada kelas uji unit (NUnit) untuk menunjukkan penggunaan dasar. Perhatikan kasus uji ganjil di bagian bawah yang menunjukkan bahwa layanan tersebut tidak sempurna dalam hal bentuk jamak non-standar.

[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
    }
}
Ryan Rodemoyer
sumber
1

Menggunakan database contoh Northwind Microsoft:

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

Singularize tidak Singularize "Order_Details" Ini mengembalikan "Order_Details" dengan sdi akhir. Apa pekerjaannya?

RandallTo
sumber
1
Ini adalah pertanyaan, bukan jawaban untuk pertanyaan ... tetapi Pluralize () dan Singularize () hanya bekerja dengan kata-kata kamus. Ada cara untuk menambahkan kata menggunakan ICustomPluralizationMapping.AddWord, tetapi setidaknya bagi saya itu bukan solusi yang sangat baik ketika Anda mungkin memiliki banyak kata yang tidak nyata seperti nama kode.
tordal
@tordal Terima kasih, untuk itulah saya datang ke pertanyaan ini
Chad