C ++ - Wie liest man Unicode-Zeichen (zB Hindi Script) mit C ++ oder gibt es einen besseren Weg durch eine andere Programmiersprache?

7

Ich habe eine Hindi-Skriptdatei wie folgt:

%Vor%

Ich muss ein Programm schreiben, das jedem Wort in jedem Satz eine Position hinzufügt. Daher sollte die Nummerierung für jede Zeile für eine bestimmte Wortposition mit 1 in Klammern beginnen. Die Ausgabe sollte in etwa so sein.

%Vor%

Die Bedeutung des obigen Satzes ist:

%Vor%

Wenn Sie das '.' (das ist ein Punkt auf Hindi, der einem '.' auf Englisch entspricht) beobachten, haben Sie auch eine Wortposition und ähnliche andere spezielle Symbole würden auch haben, während ich versuche, Englisch-Hindi zu gehen Word-Alignment (ein Teil von Natural Language Processing (NLP)), also der Punkt auf englisch '.' sollte auf "." in Hindi. Seriennummern bleiben unverändert. Ich dachte, Zeichen für Zeichen zu lesen, könnte eine Lösung sein. Könntest du mir bitte dabei helfen, wie ich in C ++ vorgehen soll, wenn es einfach oder einfacher ist, könntest du einen anderen Weg durch eine andere Programmiersprache wie Python / Perl vorschlagen??

Die Sache ist, ich bin in der Lage, Wortpositionen für meinen englischen Text mit C ++ zu bekommen, da ich in der Lage war, Zeichen für Zeichen mit ASCII-Werten in C ++ zu lesen, aber ich habe keine Ahnung, wie man das gleiche für die Hindi Text.

Das letzte Ziel von all dem ist, zu sehen, welche Wortposition des englischen Texts auf welche Position in Hindi verweist. Auf diese Weise kann ich eine bidirektionale Ausrichtung erreichen.

Danke für Ihre Zeit ...:)

    
boddhisattva 18.02.2010, 10:51
quelle

7 Antworten

3

Ich würde ernsthaft vorschlagen, dass Sie Python für eine solche Anwendung verwenden würden. Es wird die Last der Entschlüsselung der Streitigkeiten aufheben (ganz zu schweigen von der Zuweisung von Speicher für sie und dergleichen). Sie können sich auf Ihr Problem konzentrieren, anstatt auf Probleme der Sprache.

Zum Beispiel, wenn der obige Satz in einer utf-8-Datei enthalten ist und Sie python2.x verwenden. Wenn Sie Python 3.x verwenden, ist es noch lesbarer, da Sie die Unicode-Strings nicht wie in diesem Beispiel mit "u" voranstellen müssen (aber Sie werden eine Menge Bibliotheken von Drittanbietern vermissen:

> %Vor%

Dies ist ein "ungefaltetes" Beispiel. Wenn Sie sich mehr an Python gewöhnt haben, gibt es Möglichkeiten, dies auszudrücken. Sie können die Grundlagen der Sprache in nur ein paar Stunden lernen, nach einem Tutorial. (zum Beispiel dasjenige bei Ссылка selbst)

    
jsbueno 18.02.2010, 13:33
quelle
7

Wow, schon 6 Antworten und nicht ein einziger tut tatsächlich was mgj wollte. jkp kommt näher, aber dann lässt er den Ball fallen, indem er die daṇḍa löscht.

Perl zur Rettung. Weniger Code, weniger Fehler.

%Vor%

edit: geändert, um von STDIN laut Kommentar zu lesen, wurden Best Practices Pragmas hinzugefügt

    
daxim 18.02.2010 15:49
quelle
6

Wenn Sie in C ++ arbeiten und entscheiden, dass UTF-8 eine brauchbare Kodierung für Ihre Anwendung ist, können Sie sich utfcpp ansehen eine Bibliothek, die viele Entsprechungen für Typen bietet, die in der stdlib gefunden werden (wie Streams und String-Verarbeitungsfunktionen), aber die Schwierigkeiten des Umgangs mit einer Codierung mit variabler Länge wie UTF8 abstrahiert.

Wenn Sie andererseits frei sind, eine beliebige Sprache zu verwenden, würde ich sagen, dass etwas in Python zu machen, viel einfacher wäre: es ist Unicode-Unterstützung sehr gut, ebenso wie die mitgelieferten String-Verarbeitungsroutinen.

> %Vor%

Ausgaben:

%Vor%

Da Sie auch in natürlicher Sprache arbeiten, sollten Sie sich die NLTK Bibliothek für Python anschauen, die eine Fülle von Werkzeugen für genau diese Art von Job.

    
jkp 18.02.2010 10:59
quelle
4

ICU - Internationale Komponenten für Unicode ist eine von IBM unterstützte C ++ - Bibliothek, die zu einem Standard für die Handhabung von Zeichen aller wird Sprachen. Ich sehe mehr und mehr Projekte, die es benutzen. Es macht den Job wirklich gut. Hier sind die Funktionen (Kopieren / Einfügen von der Website):

  • Code Page Conversion : Konvertieren von Textdaten in oder aus Unicode und fast jedem anderen Zeichensatz oder einer anderen Codierung. Die Umrechnungstabellen von ICU basieren auf Charset-Daten, die von IBM im Laufe vieler Jahrzehnte gesammelt wurden, und sind die vollständigsten, die überall verfügbar sind.

  • Sortierung : Vergleichen Sie Strings gemäß den Konventionen und Standards einer bestimmten Sprache, Region oder eines bestimmten Landes. Die Sortierung der ICU basiert auf dem Unicode-Sortieralgorithmus und länderspezifischen Vergleichsregeln aus dem Common Locale Data Repository, einer umfassenden Quelle für diese Art von Daten.

  • Formatierung : Formatieren Sie Zahlen, Datumsangaben, Uhrzeiten und Währungsbeträge gemäß den Konventionen eines ausgewählten Gebietsschemas. Dazu gehören die Übersetzung von Monats- und Tagesnamen in die ausgewählte Sprache, die Auswahl geeigneter Abkürzungen, die korrekte Anordnung von Feldern usw. Diese Daten stammen ebenfalls aus dem Common Locale Data Repository.

  • Zeitberechnungen : Neben dem traditionellen Gregorianischen Kalender werden verschiedene Arten von Kalendern bereitgestellt. Ein umfassendes Set von Zeitzonenberechnungs-APIs wird bereitgestellt.

  • Unicode-Unterstützung : Die ICU verfolgt genau den Unicode-Standard und bietet einfachen Zugriff auf alle Unicode-Zeicheneigenschaften, Unicode-Normalisierung, Fallfaltung und andere grundlegende Operationen gemäß Unicode-Standard .

  • Regulärer Ausdruck : Die regulären Ausdrücke der ICU unterstützen Unicode vollständig und bieten gleichzeitig eine sehr wettbewerbsfähige Leistung.

  • Bidi : Unterstützung für den Umgang mit Text, der eine Mischung aus links nach rechts (Englisch) und rechts nach links (Arabisch oder Hebräisch) enthält.

  • Textgrenzen : Suchen Sie nach den Positionen von Wörtern, Sätzen, Absätzen innerhalb eines Textbereichs oder nach Positionen, die für die Zeilenumbruch beim Anzeigen des Texts geeignet wären.

Milan Babuškov 18.02.2010 13:43
quelle
3

Sehen Sie sich Ссылка an, eine C ++ - Bibliothek zum Verarbeiten von Unicode-Zeichenfolgen.

    
cc. 18.02.2010 10:55
quelle
1

Der einfachste Weg, die Verarbeitung durchzuführen, besteht darin, Ihre Eingabe in ein std::wstring zu bringen (was logisch ein Array von wchar_t ist). Nun haben Sie immer noch keine "Zeichen", weil dieses Konzept etwas komplexer ist in Hindi. Sie werden jedoch Teilstrings haben, die durch L' ' und das L 'getrennt sind. wird auch getrennt sein. Z.B. Sie können input.find_first_of(L" ।")

aufrufen     
MSalters 18.02.2010 12:27
quelle
1
___ answer2288897 ___

Ich würde ernsthaft vorschlagen, dass Sie Python für eine solche Anwendung verwenden würden. Es wird die Last der Entschlüsselung der Streitigkeiten aufheben (ganz zu schweigen von der Zuweisung von Speicher für sie und dergleichen). Sie können sich auf Ihr Problem konzentrieren, anstatt auf Probleme der Sprache.

Zum Beispiel, wenn der obige Satz in einer utf-8-Datei enthalten ist und Sie python2.x verwenden. Wenn Sie Python 3.x verwenden, ist es noch lesbarer, da Sie die Unicode-Strings nicht wie in diesem Beispiel mit "u" voranstellen müssen (aber Sie werden eine Menge Bibliotheken von Drittanbietern vermissen:

> %Vor%

Dies ist ein "ungefaltetes" Beispiel. Wenn Sie sich mehr an Python gewöhnt haben, gibt es Möglichkeiten, dies auszudrücken. Sie können die Grundlagen der Sprache in nur ein paar Stunden lernen, nach einem Tutorial. (zum Beispiel dasjenige bei Ссылка selbst)

    
___ answer2289918 ___

Wow, schon 6 Antworten und nicht ein einziger tut tatsächlich was mgj wollte. jkp kommt näher, aber dann lässt er den Ball fallen, indem er die daṇḍa löscht.

Perl zur Rettung. Weniger Code, weniger Fehler.

%Vor%

edit: geändert, um von %code% laut Kommentar zu lesen, wurden Best Practices Pragmas hinzugefügt

    
___ answer2288015 ___

Wenn Sie in C ++ arbeiten und entscheiden, dass UTF-8 eine brauchbare Kodierung für Ihre Anwendung ist, können Sie sich utfcpp ansehen eine Bibliothek, die viele Entsprechungen für Typen bietet, die in der stdlib gefunden werden (wie Streams und String-Verarbeitungsfunktionen), aber die Schwierigkeiten des Umgangs mit einer Codierung mit variabler Länge wie UTF8 abstrahiert.

Wenn Sie andererseits frei sind, eine beliebige Sprache zu verwenden, würde ich sagen, dass etwas in Python zu machen, viel einfacher wäre: es ist Unicode-Unterstützung sehr gut, ebenso wie die mitgelieferten String-Verarbeitungsroutinen.

> %Vor%

Ausgaben:

%Vor%

Da Sie auch in natürlicher Sprache arbeiten, sollten Sie sich die NLTK Bibliothek für Python anschauen, die eine Fülle von Werkzeugen für genau diese Art von Job.

    
___ qstntxt ___

Ich habe eine Hindi-Skriptdatei wie folgt:

%Vor%

Ich muss ein Programm schreiben, das jedem Wort in jedem Satz eine Position hinzufügt. Daher sollte die Nummerierung für jede Zeile für eine bestimmte Wortposition mit 1 in Klammern beginnen. Die Ausgabe sollte in etwa so sein.

%Vor%

Die Bedeutung des obigen Satzes ist:

%Vor%

Wenn Sie das '.' (das ist ein Punkt auf Hindi, der einem '.' auf Englisch entspricht) beobachten, haben Sie auch eine Wortposition und ähnliche andere spezielle Symbole würden auch haben, während ich versuche, Englisch-Hindi zu gehen Word-Alignment (ein Teil von Natural Language Processing (NLP)), also der Punkt auf englisch '.' sollte auf "." in Hindi. Seriennummern bleiben unverändert. Ich dachte, Zeichen für Zeichen zu lesen, könnte eine Lösung sein. Könntest du mir bitte dabei helfen, wie ich in C ++ vorgehen soll, wenn es einfach oder einfacher ist, könntest du einen anderen Weg durch eine andere Programmiersprache wie Python / Perl vorschlagen??

Die Sache ist, ich bin in der Lage, Wortpositionen für meinen englischen Text mit C ++ zu bekommen, da ich in der Lage war, Zeichen für Zeichen mit ASCII-Werten in C ++ zu lesen, aber ich habe keine Ahnung, wie man das gleiche für die Hindi Text.

Das letzte Ziel von all dem ist, zu sehen, welche Wortposition des englischen Texts auf welche Position in Hindi verweist. Auf diese Weise kann ich eine bidirektionale Ausrichtung erreichen.

Danke für Ihre Zeit ...:)

    
___ antwort2288734 ___

Als Erstes bestimmen Sie, ob Ihre Eingabe UNICODE ist oder nicht. Tun Sie dies, indem Sie versuchen, Ihre Eingabe als UNICODE zu lesen, und sehen Sie, ob die Ergebnisse verstümmelt sind.

%Vor%

Wenn die Ausgabe in Ordnung ist, haben Sie eine UNICODE-Datei, wenn sie verstümmelt ist, ist es UTF-8

Wenn Sie UTF-8 haben, müssen Sie in Unicode konvertieren, um die Verarbeitung zu vereinfachen.

%Vor%

Bei dem obigen Vorgang wird davon ausgegangen, dass Sie sich in Windows befinden. Unter Unix gilt die gleiche Idee und der Code ist sehr ähnlich. Ich finde es jedoch nicht so einfach, also werde ich einen UNIX-Experten die Details bereitstellen lassen.

    
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ tag123python ___ Python ist eine dynamische und stark typisierte Programmiersprache, die die Usability betont. Zwei ähnliche, aber größtenteils inkompatible Versionen von Python sind weit verbreitet (2 und 3). Wenn Sie eine versionsspezifische Python-Frage haben, sollten Sie die Tags [python-2.7] oder [python-3.x] zusätzlich zum Tag [python] verwenden. Wenn Sie eine Python-Variante wie jython, pypy, iron-python usw. verwenden, kennzeichnen Sie diese bitte entsprechend. ___ answer2288959 ___

ICU - Internationale Komponenten für Unicode ist eine von IBM unterstützte C ++ - Bibliothek, die zu einem Standard für die Handhabung von Zeichen aller wird Sprachen. Ich sehe mehr und mehr Projekte, die es benutzen. Es macht den Job wirklich gut. Hier sind die Funktionen (Kopieren / Einfügen von der Website):

  • Code Page Conversion : Konvertieren von Textdaten in oder aus Unicode und fast jedem anderen Zeichensatz oder einer anderen Codierung. Die Umrechnungstabellen von ICU basieren auf Charset-Daten, die von IBM im Laufe vieler Jahrzehnte gesammelt wurden, und sind die vollständigsten, die überall verfügbar sind.

  • Sortierung : Vergleichen Sie Strings gemäß den Konventionen und Standards einer bestimmten Sprache, Region oder eines bestimmten Landes. Die Sortierung der ICU basiert auf dem Unicode-Sortieralgorithmus und länderspezifischen Vergleichsregeln aus dem Common Locale Data Repository, einer umfassenden Quelle für diese Art von Daten.

  • Formatierung : Formatieren Sie Zahlen, Datumsangaben, Uhrzeiten und Währungsbeträge gemäß den Konventionen eines ausgewählten Gebietsschemas. Dazu gehören die Übersetzung von Monats- und Tagesnamen in die ausgewählte Sprache, die Auswahl geeigneter Abkürzungen, die korrekte Anordnung von Feldern usw. Diese Daten stammen ebenfalls aus dem Common Locale Data Repository.

  • Zeitberechnungen : Neben dem traditionellen Gregorianischen Kalender werden verschiedene Arten von Kalendern bereitgestellt. Ein umfassendes Set von Zeitzonenberechnungs-APIs wird bereitgestellt.

  • Unicode-Unterstützung : Die ICU verfolgt genau den Unicode-Standard und bietet einfachen Zugriff auf alle Unicode-Zeicheneigenschaften, Unicode-Normalisierung, Fallfaltung und andere grundlegende Operationen gemäß Unicode-Standard .

  • Regulärer Ausdruck : Die regulären Ausdrücke der ICU unterstützen Unicode vollständig und bieten gleichzeitig eine sehr wettbewerbsfähige Leistung.

  • Bidi : Unterstützung für den Umgang mit Text, der eine Mischung aus links nach rechts (Englisch) und rechts nach links (Arabisch oder Hebräisch) enthält.

  • Textgrenzen : Suchen Sie nach den Positionen von Wörtern, Sätzen, Absätzen innerhalb eines Textbereichs oder nach Positionen, die für die Zeilenumbruch beim Anzeigen des Texts geeignet wären.

___ tag123perl ___ Perl ist eine prozedurale, allgemeine Programmiersprache für allgemeine Zwecke, die für ihre native Unterstützung von regulären Ausdrücken und String-Parsing-Funktionen bekannt ist. Bitte verwenden Sie diesen Tag für Fragen zu Perl im Allgemeinen. Für Dinge, die mit der neuen (aber verwandten) Sprache "Perl 6" zu tun haben, verwenden Sie bitte das perl6-Tag. Verwenden Sie für reguläre Ausdrücke nach Perl-Art in anderen Sprachen das Regex-Tag oder, falls sie auf der PCRE-Bibliothek basieren, das PCRE-Tag. ___ answer2287993 ___

Sehen Sie sich Ссылка an, eine C ++ - Bibliothek zum Verarbeiten von Unicode-Zeichenfolgen.

    
___ answer2288540 ___

Der einfachste Weg, die Verarbeitung durchzuführen, besteht darin, Ihre Eingabe in ein %code% zu bringen (was logisch ein Array von %code% ist). Nun haben Sie immer noch keine "Zeichen", weil dieses Konzept etwas komplexer ist in Hindi. Sie werden jedoch Teilstrings haben, die durch %code% und das L 'getrennt sind. wird auch getrennt sein. Z.B. Sie können %code%

aufrufen     
___ tag123nlp ___ Natural Language Processing (NLP) ist ein Teilbereich der künstlichen Intelligenz, bei dem nützliche Informationen aus natürlichsprachlichen Daten transformiert oder extrahiert werden. Methoden umfassen maschinelles Lernen und regelbasierte Ansätze. ___ tag123utf8 ___ UTF-8 ist eine Zeichencodierung, die jeden Unicode-Codepunkt mit einer Bytefolge von ein bis vier Byte beschreibt. Es ist abwärtskompatibel zu ASCII und unterstützt weiterhin die Darstellung aller Unicode-Codepunkte. ___ qstnhdr ___ C ++ - Wie liest man Unicode-Zeichen (zB Hindi Script) mit C ++ oder gibt es einen besseren Weg durch eine andere Programmiersprache? ___
ravenspoint 18.02.2010 13:02
quelle

Tags und Links