Ich suche nach einer Funktion, die bei einer gegebenen Zeichenfolge die Zeichenfolge in Singular/Plural umschaltet. Ich brauche es, um für andere europäische Sprachen als Englisch zu arbeiten.
Gibt es Funktionen, die das können? (Angegeben eine zu konvertierende Zeichenfolge und die Sprache?)
Der Trick bei vielen Sprachen ist, dass ein Plural nicht nur aus dem Substantiv gebildet wird, so wie Englisch ein ‘s’ hinzufügt, sondern auch der Artikel und die Adjektive pluralisiert werden. Angesichts der Schwierigkeiten beim Analysieren natürlicher Sprache, um Substantive mit den richtigen Modifikatoren zu verknüpfen, speichert die meiste Software, die ich kenne, nur manuelle Übersetzungen sowohl von Plural- als auch von Nicht-Plural-Versionen.
– Karl Bielefeldt
18. Januar 2011 um 21:18 Uhr
@Alix Axel: … scheitert an Dingen wie box, loss und viele mehr 😉
Das ist wirklich schön. Kompaktere Version: function plural( $amount, $singular = '', $plural = 's' ) { return ( $amount == 1 ) ? $singular : $plural; }
– Bryceadams
22. März 2015 um 4:49 Uhr
Dies funktioniert nicht mit dynamischen Werten. Was passiert, wenn das Singular/Plural-Wort nicht bekannt ist?
– Karns
8. Dezember 2015 um 19:33 Uhr
Für diese Art von Operation ist keine Funktion in PHP eingebaut. Es gibt jedoch einige Tools, die Sie verwenden können, um Ihr Ziel zu erreichen.
Es gibt eine inoffizielle Google-Wörterbuch-API, die Informationen zu Pluralformen enthält. Sie können mehr darüber lesen diese Methode hier. Sie müssen ein JSON-Objekt analysieren, um die entsprechenden Elemente zu finden, und diese Methode ist in der Regel etwas langsam.
Die andere Methode, die mir in den Sinn kommt, ist die Verwendung von aspell oder einem seiner Verwandten. Ich bin mir nicht sicher, wie genau die Wörterbücher für andere Sprachen als Englisch sind, aber ich habe aspell verwendet, um Wörter in ihre verschiedenen Formen zu erweitern.
Ich weiß, dass dies nicht die hilfreichste Antwort ist, aber hoffentlich gibt es Ihnen eine allgemeine Richtung, in der Sie suchen können.
Die Google API scheint nicht mehr aktiv zu sein.
– arvidj
24. Februar 2015 um 19:15 Uhr
Das ist nicht einfach: Jede Sprache hat ihre eigenen Regeln für die Pluralbildung von Substantiven. Im Englischen ist es so, dass Sie “-s” an das Ende eines Wortes setzen, es sei denn, es endet auf “-x”, “-s”, “-z”, “-sh”, “-ch”. falls Sie “-es” hinzufügen. Aber dann gibt es “Maus” => “Mäuse”, “Schafe” => “Schafe” usw.
Das erste, was Sie tun müssen, ist herauszufinden, welche Regel(en) gelten, um den Plural aus dem Substantiv im Singular in der/den Sprache(n) zu bilden, mit der/denen Sie arbeiten möchten. Aber das ist nicht die ganze Lösung. Ein weiteres Problem ist das Erkennen von Substantiven. Wenn Sie ein Substantiv erhalten und es vom Singular in den Plural umwandeln müssen, ist das nicht allzu schwierig, aber wenn Sie ein Stück freien Text erhalten und die Substantive im Singular finden und in den Plural umwandeln müssen, ist das viel schwieriger. Sie können Listen von Substantiven erhalten, aber natürlich können einige Wörter Substantive und Verben sein (“jagen”, “fischen”, “brechen” usw.), also müssen Sie den Text analysieren, um die Substantive zu identifizieren.
Es ist ein großes Problem. Es gibt wahrscheinlich ein KI-System, das das tun würde, was Sie brauchen, aber ich kann mir nicht vorstellen, dass es etwas Kostenloses geben wird, das alles kann.
Ein weiteres Problem besteht darin, dass Substantive in einigen europäischen Sprachen männlich und weiblich sein können und die Regeln für ihre Pluralbildung sich je nach Geschlecht ändern. Um die Sache noch komplizierter zu machen, gibt es keine Regel, um festzustellen, ob ein Wort männlich oder weiblich ist, Sie müssen es in einem Wörterbuch nachschlagen.
– Niko
18. Januar 2011 um 21:42 Uhr
Nun, wenn Sie es googeln, gibt es eine Reihe von Funktionen, die den Trick in PHP ausführen. Das Problem ist, dass sie nur für Englisch funktionieren. Ich brauche es für andere europäische Sprachen.
– dynamisch
18. Januar 2011 um 22:27 Uhr
@ yes123: Ich habe eine für Portugiesisch codiert, sie behandelt korrekt weibliche / männliche Inflationen.
– Alix Axel
18. Januar 2011 um 23:10 Uhr
@Alix Axel: Ich kann kein Portugiesisch, gibt es eine klare Regel, um festzustellen, ob ein Wort männlich oder weiblich ist?
– Niko
18. Januar 2011 um 23:12 Uhr
@nico: Eine klare Regel? Das würde ich nicht sagen, nein. Ich musste mir ein “prontuário” (übersetzt “Diagramm” – mehr oder weniger ein Wörterbuch für Grammatikregeln) kaufen, um zu entdecken, dass einige Pluralisierungen von der Art der schließenden Diphthonge abhängen. Meine Implementierung ist nicht perfekt – ich habe es nur geschafft, die meisten Wörter aufzublasen, nicht alle Worte – das wäre eine extrem schwierige Aufgabe.
Dies ist eine kleine Klasse und könnte einfach und schnell in andere Sprachen umgewandelt werden.
Für alle, die 2021 immer noch darüber stolpern, empfehle ich die Verwendung des Inflektorpaket aus Lehre.
Doctrine Inflector ist eine kleine Bibliothek, die String-Manipulationen in Bezug auf Groß-/Kleinbuchstaben und Singular/Plural-Formen von Wörtern durchführen kann.
Zum Zeitpunkt der Erstellung dieses Artikels werden Englisch, Französisch, Norwegisch (Bokmal), Portugiesisch, Spanisch und Türkisch unterstützt.
Installieren Sie es einfach mit Composer: composer require doctrine/inflector und benutze es so:
<?php
// Composer autoloading (your project probably already does this)
require __DIR__ . '/vendor/autoload.php';
// Build the inflector:
$inflector = \Doctrine\Inflector\InflectorFactory::create()->build();
// Singularize a word:
$inflector->singularize('houses'); // house
$inflector->singularize('vertices'); // vertex
Benutzer28864
Hier ist eine schnelle Funktion, die ich normalerweise für weniger komplexe Szenarien verwende:
Für eine komplexere Lösung können Sie jedoch @T verwenden. Die Lösung von Brian Jones
Madmarsu
Ich mag die Antwort von James Constantino. Einfach und effizient, und Sie meistern sicher jeden Fall, in jeder Sprache. Obwohl man mehr Code schreiben muss (nämlich doppelt so viel wie der gemeinsame Teil des Wortes).
Ich mag natürlich auch die TBrianJones-Lösung, aber sie funktioniert nur mit Englisch (so wie sie ist. Ich kann sie leicht für meine üblichen europäischen Sprachen Deutsch, Französisch, Spanisch, Italienisch und Portugiesisch erweitern). Danke dafür. Wenn Sie die Häufigkeit der verwendeten Wörter kennen, können Sie sie optimieren, indem Sie die Zeilen neu organisieren.
Auch Felipe’s Vorschlag ist gut, und übrigens plebiszitiert.
Aber in jeder Lösung fand ich, was ich als Fehler betrachte: Jeder von Ihnen verwendet die Singularform nur für den Wert 1 und die Pluralform für jeden anderen Fall. Was für negative Werte offensichtlich falsch ist, aber auch – zumindest auf Französisch – für Werte, die streng kleiner als 2 sind.
Hier ist also mein Vorschlag, der James’ Code als Basis nimmt, optimiert:
echo "We bought ".singleOrPlural(1.5, "pound", "pounds")
." of apples and ".singleOrPlural(2, "pound", "pounds")." of bread.";
wird geben
We bought 1.5 pound of apples and 2 pounds of bread.
welches ist richtig.
Für den Nullwert kann ich den Grund für einen Plural nicht verstehen, da es kein Objekt gibt, aber vielleicht werden angelsächsische Ureinwohner damit verwendet.
HTH, M.
10496800cookie-checkFunktionswechsel zwischen Singular und Plural?yes
Welche andere europäische Sprache?
– Gumbo
18. Januar 2011 um 21:00 Uhr
Los geht’s:
$result = (preg_match('~s$~i', $string) > 0) ? rtrim($string, 's') : sprintf('%ss', $string);
. 😛– Alix Axel
18. Januar 2011 um 21:11 Uhr
Der Trick bei vielen Sprachen ist, dass ein Plural nicht nur aus dem Substantiv gebildet wird, so wie Englisch ein ‘s’ hinzufügt, sondern auch der Artikel und die Adjektive pluralisiert werden. Angesichts der Schwierigkeiten beim Analysieren natürlicher Sprache, um Substantive mit den richtigen Modifikatoren zu verknüpfen, speichert die meiste Software, die ich kenne, nur manuelle Übersetzungen sowohl von Plural- als auch von Nicht-Plural-Versionen.
– Karl Bielefeldt
18. Januar 2011 um 21:18 Uhr
@Alix Axel: … scheitert an Dingen wie
box
,loss
und viele mehr 😉– Niko
18. Januar 2011 um 21:36 Uhr
Dieses ist für die englische Sprache, aber es könnte Ihnen etwas Inspiration geben: github.com/flourishlib/flourish-classes/blob/master/…
– Lützen
7. März 2014 um 11:55 Uhr