Wie das Lesen von Werten aus zahlen, die als geschrieben Worte?
Wie wir alle wissen zahlen geschrieben werden können, entweder in Ziffern oder mit Namen. Zwar gibt es eine Menge Beispiele gefunden werden, konvertieren 123 in hundert zwanzig drei, konnte ich nicht finden gute Beispiele, wie es zu konvertieren als Umgekehrt.
Einige Vorsichtsmaßnahmen:
- Kardinal/nominal-oder ordinal -: "eins" und "der erste"
- gemeinsame Rechtschreibfehler: "vierzig"/"vierzig"
- Hunderte/Tausende: 2100 -> "zwanzig von hundert" und auch "zwei tausend und hundert"
- Trennzeichen: "eleven hundred fifty two", aber auch "elevenhundred fiftytwo" oder "elf-hundert-fünfzig-zwei" und so weiter
- Redensarten: "thirty-something" -
- Fraktionen: 'ein Drittel', 'zwei Fünftel'
- gemeinsamen Namen: 'ein Dutzend', 'halbe'
Und wahrscheinlich gibt es noch weitere Einschränkungen möglich, die sind noch nicht eingetragen.
Angenommen, der Algorithmus muss sehr robust sein, und zu verstehen, auch Rechtschreibfehler.
Welche Felder/papers/Studien/algorithmen sollte ich Lesen, um zu lernen, wie zu schreiben das alles?
Wo ist die information?
PS: Meine Letzte parser sollte eigentlich verstehen 3 verschiedenen Sprachen, Deutsch, Englisch, Russisch und Hebräisch. Und vielleicht zu einem späteren Zeitpunkt weitere Sprachen werden Hinzugefügt werden. Hebräisch hat auch Männlich/weiblich-Nummern, wie "ein Mann" und "eine Frau" haben einen unterschiedlichen "ein" — "ehad" und "ahat". Russisch hat auch einige seiner eigenen Komplexität.
Google macht einen guten job bei dieser. Zum Beispiel:
(die Umkehrung ist auch möglich http://www.google.com/search?q=999999999999+in+english)
- Dies kann nicht für Rezepte so viel, aber vergessen Sie nicht über Wörter wie score, Jahrzehnts, Jahrhunderts, etc. Ähnlich Dutzend, grob, halb, wie Sie schon festgestellt haben.
- "vierzig" ist nicht ein Wort in jeder Variante der englischen Sprache! Der OED hat ein paar Erwähnungen der Schreibweise "vierzig", aber Sie sind von 1707 oder früher.
- Obwohl die "vierzig" ist nicht ein Wort, Menschen Häufig Fehler ein. Und ich muss analysieren, was die Leute schreiben, nicht "richtigen" Worte.
- Es würde scheinen, dass der einzige Weg, zu sagen, dass eine Anzahl (wie bei "one" in Englisch) ist eher die Ausnahme, als die Regel. Französisch "un" und "une"; und das Deutsche hat mindestens 3 verschiedene Möglichkeiten zu sagen: 1 ("eins", "eine" und "einen", wenn der Speicher dient mir korrekt).
- Pedanterie Warnung!!! "Eine" und "Einen" sind unbestimmte Artikel (glaube, "eine" oder "ein") und nicht die ganze Zahl ("eins"). 🙂
- Was soll "thirty-something" zu bewerten?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich war Herumspielen mit einer PEG-parser zu tun, was Sie wollten (und posten kann, die als separate Antwort später), als ich bemerkte, dass es einen sehr einfachen Algorithmus, der einen erstaunlich guten job mit gemeinsamen Formen der zahlen in Englisch, Spanisch und Deutsch, zumindest.
Arbeiten mit Englisch zum Beispiel, benötigen Sie ein Wörterbuch, die Karten suchten, um Werte in der offensichtlichen Weise:
...und so weiter
Der Algorithmus ist einfach:
Zum Beispiel, dieser Verlauf wie folgt:
Und so weiter. Ich sage nicht, dass es perfekt ist, aber für eine quick-and-dirty es macht sich ganz gut.
Bewältigung Ihrer spezifischen Liste auf Bearbeiten:
2100 -> "zwanzig von hundert" und auch "zwei tausend und hundert" -- funktioniert wie
Nummer 6 ist die einzige, die ich habe nicht eine Antwort bereit, und das ist aufgrund der Mehrdeutigkeit zwischen ordinal-und Bruchzahlen (in Englisch zumindest) Hinzugefügt, um die Tatsache, dass meine Letzte Tasse Kaffee war viele Stunden.
where prior > v:
.Es ist keine einfache Frage, und ich kenne keine Bibliothek, es zu tun. Ich könnte hinsetzen und versuchen, etwas zu schreiben, wie dieses irgendwann. Ich würde es tun, entweder in Prolog, Java oder Haskell, aber. Soweit ich sehen kann, gibt es mehrere Probleme:
Wenn du daran interessiert bist, könnte ich give it a shot an diesem Wochenende. Meine Idee ist wahrscheinlich mit UIMA und tokenisierung mit ihm, dann gehen Sie weiter und tokenisierung/keine Verwechslungen und schließlich zu übersetzen. Möglicherweise gibt es mehr Probleme, mal sehen, ob ich kommen kann, mit ein paar mehr interessante Dinge.
Sorry, dies ist nicht eine Reale Antwort, die doch nur eine Erweiterung zu Ihrer Frage. Ich werde Sie wissen lassen, wenn ich suchen/etwas schreiben.
Durch die Art und Weise, wenn Sie daran interessiert sind, die Semantik von Ziffern, ich habe gerade ein interessante Papier von Friederike Moltmann, diskutieren, einige Fragen bezüglich der Logik der interpretation der zahlen.
Habe ich einige code, den ich schrieb vor einer Weile: text2num. Dies hat einige, was Sie wollen, es sei denn es behandelt nicht die Ordnungszahlen. Ich habe nicht wirklich verwendet diesen code, für nichts, so ist es weitgehend ungetestet!
word_to_num()
Funktion aus diesem Modul. Danke!Verwenden Sie die Python - Muster-de Bibliothek:
Sollten Sie im Hinterkopf behalten, dass Europa und Amerika zählen anders.
Europäischen standard:
Hier ist ein kleiner Hinweis darauf.
Einen einfachen Weg, um zu sehen, der Unterschied ist der folgende:
Ordnungszahlen sind nicht anwendbar, weil Sie nicht verbunden werden, auf sinnvolle Weise mit anderen zahlen in der Sprache (...zumindest in Englisch)
z.B. hundert und erste, elf zweite, usw...
Jedoch, es ist ein Englisches/amerikanisches VORBEHALT mit dem Wort 'und'
d.h.
hundert und eins (Englisch)
hundert eine (amerikanische)
Auch die Verwendung von 'a' zu bedeuten in Englisch
tausend = tausend
...Auf einer seitlichen Anmerkung die Google-Rechner macht einen fantastischen job mit diesem.
ein hundert und drei tausend mal der Lichtgeschwindigkeit
Und sogar...
zwei tausend und hundert plus ein Dutzend
...wtf?!? einem Ergebnis plus ein Dutzend, die in römischen Ziffern
Hier ist eine extrem robuste Lösung in Clojure.
AFAIK ist es eine einzigartige Umsetzung.
Hier sind einige Beispiele
Meine LPC-Umsetzung einige Ihrer Anforderungen (American English only):
Gut, ich war zu spät auf die Antwort für diese Frage, aber ich war arbeiten ein kleines test-Szenario, das scheint geklappt zu haben bei mir sehr gut. Ich verwendet einen einfachen, aber hässlich und groß) reguläre Ausdrücke, suchen Sie alle die Worte für mich. Der Ausdruck ist wie folgt:
Hier mit Zeilenumbrüche für die Formatierung..
Sowieso, meine Methode war zum ausführen dieser RegEx mit einer Bibliothek wie PCRE, und Lesen Sie dann wieder die mit Namen entspricht. Und es funktionierte auf allen von den verschiedenen aufgeführten Beispiele in dieser Frage, minus die "Eine Hälfte", die Typen, die wie ich nicht hinzufügen, aber wie Sie sehen können, es wäre nicht schwer, dies zu tun. Dies behebt eine Reihe von Problemen. Zum Beispiel, es behebt die folgenden Elemente in der ursprünglichen Frage und den anderen Antworten:
Nun, anstatt zu speichern, dieses monster von einem regulären Ausdruck, in Ihrer Quelle, ich erwäge den Bau dieser RegEx zur Laufzeit, mit so etwas wie die folgenden:
Ist der einfache Teil hier ist, wir sind nur die Speicherung der Wörter, die wichtig sind. Im Falle der SECHSTEN, werden Sie feststellen, dass es nicht einen Eintrag machen, weil es einfach die normale Nummer mit TH geheftet... Aber wie ZWÖLF unterschiedliche Aufmerksamkeit.
Ok, so jetzt haben wir den code zu bauen (hässlich) RegEx, jetzt wir führen es auf unsere Anzahl Saiten.
Eine Sache, die ich empfehlen würde, ist es zu filtern, oder zu Essen, das Wort "UND". Es ist nicht notwendig und führt nur zu anderen Problemen.
Also, was sind Sie gehen zu wollen, zu tun ist setup eine Funktion, übergibt die benannte Treffer für "Magnitude" in eine Funktion, der schaut auf alle möglichen Größenordnung der Werte und multipliziert Ihre aktuelle Ergebnis durch den Wert der Größe. Dann erstellen Sie eine Funktion, die schaut auf den "Wert" namens entspricht, und gibt ein int (oder was auch immer Sie verwenden), basierend auf dem Wert, der dort entdeckt.
WERT alle Spiele sind HINZUGEFÜGT, um Ihr Ergebnis, während magnitutde entspricht, multiplizieren Sie das Ergebnis mit dem mag-Wert. So, Zwei Hundert Fünfzig Tausend wird zu "2", dann "2 * 100", dann "200 + 50", dann "250 * 1000", der am Ende mit 250000...
Nur zum Spaß, schrieb ich eine vbScript-version und es funktionierte großartig mit allen Beispielen zur Verfügung gestellt. Nun, es unterstützt keine benannten Spiele, so hatte ich ein wenig härter zu arbeiten immer das korrekte Ergebnis, aber ich bekam es. Quintessenz ist, wenn es ein "WERT" passen, fügen Sie es Ihrem Akku. Wenn es zu einer Größenordnung entsprechen, multiplizieren Sie Ihre Akku von 100, 1000, 1000000, 1000000000, etc... Dies wird Ihnen einige ziemlich erstaunliche Ergebnisse, und alles, was Sie tun müssen, um die Anpassung an Dinge wie "die Hälfte" ist, fügen Sie Sie zu Ihrem RegEx, setzen Sie in eine code-Markierung, die für Sie-und mit Ihnen umgehen.
Gut, ich hoffe, dieser Beitrag hilft JEMAND da draußen. Wenn jemand will, kann ich dem Beitrag von vbScript-pseudo-code, die ich verwendet, um dies zu testen, aber es ist nicht schön-code, und NICHT für die Produktion von code.
Wenn ich kann.. Was ist die Letzte Sprache werden diese geschrieben? C++, oder so etwas wie eine Programmiersprache? Greg Hewgill Quelle wird ein langer Weg zu helfen, zu verstehen, wie all dies kommt zusammen.
Lassen Sie mich wissen, wenn ich kann anderen helfen. Sorry, ich kenne nur die englischen/amerikanischen, so kann ich dir nicht helfen, mit den anderen Sprachen.
War ich konvertieren ordinal edition-Anweisungen aus der frühen Neuzeit, Bücher (z.B. "2. Auflage", "Editio quarta") zu ganzen zahlen und benötigte Unterstützung für Ordnungszahlen 1-100 auf Englisch und Ordnungszahlen 1-10 in wenigen Romanischen Sprachen. Hier ist, was ich kam mit Python:
Versuchen
Öffnen Sie eine HTTP-Anfrage an "http://www.google.com/search?q=" + Anzahl + "+in+decimal".
Analysieren das Ergebnis für Ihre Nummer.
Cache die Zahl /Ergebnis-Paare Lektion die Anforderungen im Laufe der Zeit.
Einem Ort zu beginnen, ist die gnu lib get_date, die analysieren können nur etwa jeder englischer Textform ein Datum in ein timestamp. Zwar nicht genau, was Sie suchen, Ihre Lösung zu einem ähnlichen problem könnte eine Menge nützliche Hinweise.