24 Stimmen

Wie macht man Wörter im Plural zum Singular?

Ich bereite einige Tabellennamen für einen ORM vor, und ich möchte mehrere Tabellennamen in einzelne Entitätsnamen umwandeln. Mein einziges Problem ist, einen Algorithmus zu finden, der dies zuverlässig tut. Hier ist, was ich im Moment tue:

  1. Endet ein Wort mit -ies ersetze ich die Endung durch -y
  2. Endet ein Wort mit -es streiche ich dieses Ende. Das klappt aber nicht immer - zum Beispiel ersetzt es Typen avec Typ
  3. Andernfalls entferne ich einfach das nachgestellte -s

Kennt jemand einen besseren Algorithmus?

6 Stimmen

Ich habe den Plural der Tabellennamen schon vor langer Zeit aufgegeben und verwende nur noch Singularnamen für die Tabellen, das spart mir Tipparbeit!

7 Stimmen

Alle Ihre Regeln haben triviale Fälle, in denen sie versagen: "Torten", "Bäume", "Bus". Es gibt natürlich noch zig andere. Die einzige Antwort ist (wie Tal Pressman sagt), dass Sie es mit natürlicher Sprache zu tun haben, wo Ausnahmen die Regel sind.

0 Stimmen

.NET Inflector ist großartig, Sie können Regeln, Ausnahmen, ungewöhnliche Pluralisierungen, Nicht-Zählbares wie Fisch und Schaf usw. usw. definieren. Großartige Bibliothek

25voto

paxdiablo Punkte 809679

Das sind alles allgemeine (und gute) Regeln, aber Englisch ist keine Sprache für schwache Nerven :-).

Ich selbst würde eine Transformations-Engine zusammen mit einer Reihe von Transformationen (überraschenderweise) bevorzugen, um die eigentliche Arbeit zu erledigen. Man würde die Transformationen (von spezifisch bis allgemein) durchlaufen und, wenn eine Übereinstimmung gefunden wurde, die Transformation auf das Wort anwenden und anhalten.

Reguläre Ausdrücke wären aufgrund ihrer Ausdruckskraft ein idealer Ansatz hierfür. Ein Beispiel für einen Regelsatz:

 1. If the word is fish, return fish.
 2. If the word is sheep, return sheep.
 3. If the word is "radii", return "radius".
 4. If the word ends in "ii", replace that "ii" with "us" (octopii,virii).
 5. If a word ends with -ies, replace the ending with -y
 6. If a word ends with -es, remove it.
 7. Otherwise, just remove any trailing -s.

Beachten Sie, dass diese Transformation auf dem neuesten Stand gehalten werden muss. Nehmen wir zum Beispiel an, jemand fügt den Tabellennamen types . Dies würde derzeit durch die Regel #6 und Sie würden den Singularwert erhalten typ was offensichtlich falsch ist.

Die Lösung besteht darin, irgendwo eine neue Regel einzufügen vor #6 etwa so:

 3.5: If the word is "types", return "type".

für eine ganz bestimmte Umwandlung, oder vielleicht später, wenn sie allgemeiner gestaltet werden kann.

Mit anderen Worten: Sie müssen diese Transformationstabelle ständig aktualisieren, wenn Sie all die wundersamen Ausnahmen finden, die das Englische im Laufe der Jahrhunderte hervorgebracht hat.


En andere Möglichkeit ist, seine Zeit nicht mit allgemeinen Regeln zu verschwenden.

Da der Anwendungsfall dieser Anforderung derzeit nur darin besteht, die Tabellennamen zu singularisieren, und die Menge der Tabellennamen relativ klein sein wird (zumindest im Vergleich zu der Menge der englischen Pluralwörter), erstellen Sie einfach eine andere Tabelle (oder eine Art Datenstruktur) namens singulars die alle aktuellen Plural-Tabellennamen abbildet ( employees , customers ) zu singulären Objektnamen ( employee , customer ).

Jedes Mal, wenn eine Tabelle zu Ihrem Schema hinzugefügt wird, stellen Sie sicher, dass Sie einen Eintrag in der Einzahl "table" hinzufügen, damit Sie sie einteilen können.

9voto

Tal Pressman Punkte 7113

Das Problem ist, dass dies auf den allgemeinen Regeln beruht, aber im Englischen gibt es (bildlich gesprochen) eine Milliarde Ausnahmen... Was macht man mit Wörtern wie "Fisch" oder "Gänse"?

Außerdem gibt es Regeln für die Umwandlung von Singularnomen in Pluralformen. Die umgekehrte Zuordnung ist nicht unbedingt möglich (man denke an "freebies").

6voto

itowlson Punkte 72130

Andrew Peters hat eine Klasse namens Inflector.NET die Plural-zu-Singular- und Singular-zu-Plural-Methoden bietet. Wie Tal schon sagte, ist kein Algorithmus unfehlbar, aber er deckt eine annehmbare Anzahl von unregelmäßigen englischen Substantiven ab.

3voto

rkj Punkte 8089

Werfen Sie vielleicht einen Blick auf den Quellcode von etwas wie Rails Inflektor

3voto

Kaarel Punkte 10334

Siehe auch diese Antwort in der die Verwendung von Morpha (oder das Studium des dahinter stehenden Algorithmus) empfohlen wird.

Wenn Sie wissen, dass die Wörter, die Sie lemmatisieren wollen, Pluralnomen sind, können Sie sie mit NNS um ein genaueres Ergebnis zu erhalten.

Eingabebeispiel:

$ cat test.txt 
Types_NNS
Pies_NNS
Trees_NNS
Buses_NNS
Radii_NNS
Communities_NNS
Sheep_NNS
Fish_NNS

Beispiel für die Ausgabe:

$ cat test.txt | ./morpha -c
Type
Pie
Tree
Bus
Radius
Community
Sheep
Fish

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X