Zählt die Anzahl der Wörter in NSString

9

Ich versuche, eine Wortzählfunktion für meine App zu implementieren, die UITextView verwendet.

Es gibt einen Zwischenraum zwischen zwei Wörtern auf Englisch, so dass es sehr einfach ist, die Anzahl der Wörter in einem englischen Satz zu zählen. Das Problem tritt beim chinesischen und japanischen Wörterzählen auf, weil in der Regel kein Leerzeichen im gesamten Satz vorhanden ist.

Ich habe mit drei verschiedenen Texteditoren auf dem iPad nachgesehen, die eine Wortzählfunktion haben und sie mit MS Words vergleichen.

Hier ist zum Beispiel eine Reihe von japanischen Schriftzeichen, die die Idee der Welt bedeuten: 世界 (die Welt) の ('s) ア イ デ ア (Idee)

世界 の ア イ デ ア

1) Seiten für iPad und MS Wörter zählen jedes Zeichen als ein Wort, also enthält es 7 Wörter.

2) iPad Texteditor P *** zählt das Ganze als ein Wort - & gt; Sie verwendeten einfach Raum, um Wörter zu trennen.

3) iPad Texteditor i *** zählt sie als drei Wörter - & gt; Ich glaube, sie verwendeten CFStringTokenizer mit kCFStringTokenizerUnitWord, weil ich das gleiche Ergebnis erhalten konnte)

Ich habe im Internet recherchiert, und die Wörterzählung von Pages und MS Words scheint korrekt zu sein, weil jedes chinesische Schriftzeichen eine Bedeutung hat.

Ich konnte keine Klasse finden, die Wörter wie Pages oder MS Words zählt, und es wäre sehr schwierig, sie von Grund auf neu zu implementieren, denn neben Japanisch und Chinesisch unterstützt das iPad viele verschiedene Fremdsprachen / strong>

Ich denke, dass CFStringTokenizer mit kCFStringTokenizerUnitWord die beste Option ist.

Gibt es eine Möglichkeit, Wörter in NSString wie Pages und MSWords zu zählen?

Danke

    
pnmn 03.03.2011, 06:41
quelle

7 Antworten

3

Ich empfehle, weiterhin CFStringTokenizer zu verwenden. Da es sich um eine Plattformfunktion handelt, wird es durch ein Plattformupgrade aufgerüstet. Und viele Leute in Apple arbeiten kaum daran, wirkliche kulturelle Unterschiede zu reflektieren. Was für normale Entwickler schwer zu wissen ist.

Das ist schwierig, weil das im Grunde kein Programmierproblem ist. Dies ist ein kulturellsprachliches Problem des Menschen. Sie brauchen einen Experten für die menschliche Sprache für jede Kultur. Für Japanisch braucht man einen japanischen Kulturspezialisten. Ich glaube jedoch nicht, dass Japaner die Wortzählung ernsthaft brauchen, denn wie ich gehört habe, ist das Konzept des Wortes selbst in der japanischen Kultur nicht so wichtig. Sie sollten das Konzept des Wortes zuerst definieren.

Und ich kann nicht verstehen, warum Sie das Konzept von Wortzählung in Zeichenanzahl zwingen möchten. Das Kanji-Wort, das du instanziert hast. Dies ist gleichbedeutend mit dem Zählen von universe als 2 Wörter durch Aufteilen in uni + verse nach Bedeutung. Nicht einmal eine Logik. Wörter durch ihre Bedeutung zu trennen, ist manchmal völlig falsch und nutzlos bei der Definition von Wörtern. Weil die Definition des Wortes selbst in den Kulturen unterschiedlich ist. In meiner Sprache ist Koreanisch Wort nur eine formale Einheit, keine Bedeutungseinheit . Die Idee, dass jedes Wort zu jeder Bedeutung passt, ist nur in römischen Charakterkulturen richtig.

Geben Sie einfach ein weiteres Feature wie Zeichen zählen für die Benutzer in Ostasien, wenn Sie es für notwendig halten. Und das Zählen von Zeichen in Unicode-Strings ist mit -[NSString length] method so einfach.

Ich bin ein koreanischer Sprecher (also vielleicht nicht in Ihrem Fall :) und in vielen Fällen zählen wir Zeichen statt Worte. Tatsächlich habe ich nie gesehen, wie Leute in meinem ganzen Leben Wörter gezählt haben. Ich habe bei Word Counting -Funktion auf MS-Word gelacht, weil ich dachte, dass niemand es benutzen würde. (Allerdings weiß ich jetzt, dass es in romanischen Charakterkulturen wichtig ist.) Ich habe die Funktion der Wortzählung nur einmal benutzt, um zu wissen, dass es wirklich funktioniert :) Ich glaube, das ist ähnlich in Chinesisch oder Japanisch. Vielleicht benutzen japanische Benutzer das Wort Zählen, weil ihr grundlegendes Alphabet mit römischen Zeichen ähnlich ist, die kein Konzept der Zusammensetzung haben. Sie verwenden jedoch stark kanji, die sich vollständig auf das Charakter-zentrierte System konzentrieren.

Wenn Sie die Funktion zum Zählen von Wörtern stark auf diese Sprachen anwenden (die von Menschen benutzt werden, haben sie keine Notwendigkeit, Sätze in kleinere formale Einheiten zu teilen!), ist es schwer vorstellbar, dass jemand sie benutzt. Und ohne linguistische Spezialisten sollte das Feature nicht korrigieren.

    
Eonil 09.03.2011 16:00
quelle
2

Das ist ein wirklich schwieriges Problem, wenn Ihre Zeichenfolge keine Token enthält, die Wortumbrüche (wie Leerzeichen) identifizieren. Eine Art, die ich aus dem Versuch, Anagramme zu lösen, abgeleitet habe, ist dies:

Am Anfang der Zeichenfolge beginnen Sie mit einem Zeichen. Ist es ein Wort? Es könnte ein Wort wie "A" sein, aber es könnte auch ein Teil eines Wortes wie "AN" oder "ANALOG" sein. Also muss die Entscheidung darüber, was ein Wort ist, unter Berücksichtigung der gesamten Zeichenfolge getroffen werden. Du würdest die nächsten Zeichen betrachten, um zu sehen, ob du ein weiteres Wort schreiben kannst, beginnend mit dem ersten Zeichen, das dem ersten Wort folgt, von dem du glaubst, dass du es gefunden hast. Wenn Sie sich entscheiden, das Wort ist "A" und Sie bleiben mit "NALOG", dann werden Sie bald feststellen, dass es keine Wörter mehr zu finden gibt. Wenn Sie anfangen Wörter im Wörterbuch zu finden (siehe unten), dann wissen Sie, dass Sie die richtigen Entscheidungen treffen, wo Sie die Wörter brechen sollen. Wenn du aufhört, Wörter zu finden, weißt du, dass du eine falsche Wahl getroffen hast und du zurückgehen musst.

Ein großer Teil davon ist, Wörterbücher zu haben, die ausreichen, um jedes Wort zu enthalten, auf das Sie stoßen könnten. Die englische Ressource wäre TWL06 oder SOWPODS oder andere Scrabble-Wörterbücher, die viele obskure Wörter enthalten. Sie brauchen viel Speicher, um dies zu tun, denn wenn Sie die Wörter mit einem einfachen Array vergleichen, das alle möglichen Wörter enthält, wird Ihr Programm unglaublich langsam laufen. Wenn Sie Ihr Wörterbuch analysieren, persistieren und neu erstellen, wird Ihre Suche schnell genug sein, aber es wird viel Speicherplatz auf der Festplatte und mehr Speicherplatz benötigt. Eines dieser großen Scrabble-Wörterbücher kann auf etwa 10 MB mit den eigentlichen Wörtern als Schlüssel und einer einfachen NSNummer als Platzhalter für Wert erweitert werden - es ist Ihnen egal, was der Wert ist, nur dass der Schlüssel im Wörterbuch vorhanden ist, was Ihnen das sagt das Wort wird als gültig erkannt.

Wenn Sie ein Array so verwalten, wie Sie zählen, können Sie [array count] triumphal ausführen, indem Sie das letzte Wort mit den letzten Zeichen hinzufügen, aber Sie haben auch eine einfache Methode zum Zurückverfolgen. Wenn Sie irgendwann keine gültigen Wörter mehr finden, können Sie das lastObject vom Array entfernen und es am Anfang der Zeichenfolge ersetzen. Suchen Sie dann nach alternativen Wörtern. Wenn Sie nicht auf den richtigen Weg zurückkommen, drücken Sie ein anderes Wort.

Ich würde experimentieren, indem ich beim Analysieren des Strings nach möglichen drei Wörtern suche - wenn Sie drei mögliche Wörter identifiziert haben, nehmen Sie das erste weg, speichern Sie es im Array und suchen Sie nach einem anderen Wort. Wenn Sie feststellen, dass es zu langsam ist, um es auf diese Weise zu tun, und Sie OK-Ergebnisse erhalten, wenn Sie nur zwei Wörter voraussehen, lassen Sie es auf zwei fallen. Wenn Sie feststellen, dass Sie mit Ihrer Wortteilungsstrategie zu viele Sackgassen haben, erhöhen Sie die Anzahl der Wörter, die Sie berücksichtigen.

Ein anderer Weg wäre, natürliche Sprachregeln zu verwenden - zum Beispiel könnten "A" und "NALOG" OK sein, weil ein Konsonant "A" folgt, aber "A" und "ARDVARK" wären ausgeschlossen, weil es korrekt wäre für ein Wort, das in einem Vokal beginnt und "AN" folgt, nicht "A". Dies kann so kompliziert werden, wie Sie es gerne machen - ich weiß nicht, ob das auf Japanisch einfacher wird oder nicht, aber es gibt sicherlich gebräuchliche Verbendungen wie "ma su".

(Bearbeiten: Ich habe ein Kopfgeld begonnen, ich würde gerne den besten Weg wissen, dies zu tun, wenn es nicht mein Weg ist.)

    
Adam Eberbach 03.03.2011 07:04
quelle
1

Wenn Sie iOS 4 verwenden, können Sie etwas wie

tun %Vor%

Weitere Informationen finden Sie in der NSString-Klassenreferenz .

Es gibt auch eine WWDC 2010-Sitzung , Nummer 110, über fortgeschrittene Textverarbeitung, die das erklärt, herum Minute 10 oder so.

    
Marcos Crispino 11.03.2011 11:39
quelle
0
  

Ich denke, dass CFStringTokenizer mit kCFStringTokenizerUnitWord die beste Option ist.

Das ist richtig, Sie müssen durch den Text iterieren und einfach die Anzahl der Wort-Token zählen, die auf dem Weg enthalten sind.

    
Valerii Hiora 09.03.2011 14:46
quelle
0

Nicht ein gebürtiger Chinese / Japaner, aber hier sind meine 2cents.

Jedes chinesische Zeichen hat eine Bedeutung, aber das Konzept eines Wortes ist eine Kombination von Buchstaben / Zeichen, um eine Idee zu repräsentieren, oder?

In diesem Sinne gibt es wahrscheinlich 3 Wörter in "sekai no aidia" (oder 2, wenn Sie keine Partikel wie NO / GA / DE / WA usw. zählen). Genau wie Englisch - "world's idea" ist zwei Worte, während "idee of world" 3 ist, und vergessen wir das erforderliche 'the' hehe.

Das gegebene, zählende Wort ist meiner Meinung nach in nicht-romanischer Sprache nicht so nützlich, ähnlich wie Eonil es erwähnt hat. Es ist wahrscheinlich besser, die Anzahl der Zeichen für diese Sprachen zu zählen. Erkundigen Sie sich bei Chinesisch / Japanisch Muttersprachlern und sehen Sie, was sie denken.

Wenn ich es tun würde, würde ich die Zeichenfolge mit Leerzeichen und Partikeln (zumindest für Japanisch, Koreanisch) und Tokens zählen. Ich bin mir nicht sicher über Chinesisch ..

    
Sean S Lee 11.03.2011 06:33
quelle
0

Mit Japanisch können Sie einen Grammatik-Parser erstellen und ich denke, es ist dasselbe mit Chinesisch. Das ist jedoch leichter gesagt als getan, weil natürliche Sprache dazu neigt, viele Ausnahmen zu haben, aber es ist nicht unmöglich.

Bitte beachten Sie, dass es nicht wirklich effizient ist, da Sie jeden Satz analysieren müssen, bevor Sie die Wörter zählen können.

Ich würde die Verwendung eines Parser-Compilers empfehlen, anstatt selbst einen zu bauen, um zumindest zu beginnen, dass Sie sich auf die Grammatik konzentrieren können, anstatt den Parser selbst zu erstellen. Es ist nicht effizient, aber es sollte die Arbeit erledigen.

Haben Sie auch einen Ausweichalgorithmus für den Fall, dass Ihre Grammatik die Eingabe nicht korrekt analysiert hat (vielleicht war die Eingabe wirklich nicht sinnvoll), können Sie die Länge der Zeichenfolge verwenden, um es für Sie einfacher zu machen.

Wenn Sie es erstellen, könnte es eine Marktmöglichkeit für Sie geben, es als eine sprachspezifische Domain-Sprache für japanische / chinesische Geschäftsregeln zu verwenden.

    
Archimedes Trajano 13.03.2011 22:26
quelle
-1

Verwenden Sie einfach die Längenmethode:

%Vor%

Als Japanischer Redner glaube ich, dass 3 die richtige Antwort ist.

    
amattn 08.03.2011 19:12
quelle