2009-05-02 14 views
7

Ho un'idea per alcune app Web da scrivere per aiutarmi, e forse altri, a imparare meglio il giapponese poiché sto studiando la lingua.Suggerimenti di programmazione con lingua giapponese/caratteri

Il mio problema è che il sito sarà in gran parte in inglese, quindi ha bisogno di mescolare fluentemente caratteri giapponesi, di solito hirigana e katakana, ma in seguito kanji. Mi sto avvicinando a realizzare questo; Ho capito che le pagine e i file sorgente devono essere unicode e tipi di contenuto utf-8.

Tuttavia, il mio problema si presenta nella codifica attuale. Ciò di cui ho bisogno è di manipolare le stringhe di testo che sono kana. Un esempio è:

け す Ho bisogno di prendere quel verbo e convertirlo in te-form け し て. Preferirei farlo in javascript in quanto ti aiuterà in fondo a fare più manipolazioni, ma se dovessi fare semplicemente chiamate DB e tenere tutto in un DB.

La mia domanda non è solo come farlo in javascript, ma quali sono alcuni suggerimenti e strategie per fare questo genere di cose anche in altre lingue. Spero di ottenere di più nel fare app per l'apprendimento della lingua, ma sono perso quando si tratta di questo.

+0

stai guardando una qualche forma di deriva? Perdonate la mia ignoranza, ma questo sembra più difficile (per un linguaggio logografico) di quello che fareste per un normale linguaggio basato sull'alfabeto. – dirkgently

+0

No, non nell'esempio la parola radice è fondamentalmente け す ma sto cambiando il す in し e aggiungendo て. Un altro esempio è の む cambiando il む a ん で per ottenere の ん で. Un esempio più semplice potrebbe essere.た べ る che si dovrebbe cadere il る e aggiungere て per ottenere た べ て. Speriamo che questo abbia più senso. – percent20

+0

I tuoi esempi (stranamente!) Mi danno un'idea (che sono sicuro sia sbagliata) che tutto ciò che vuoi è una stringa replacemnet. Funzionerebbe anche l'espressione regolare (Unicode). – dirkgently

risposta

4

La mia domanda è non solo come farlo in javascript, ma quali sono alcuni suggerimenti e strategie per fare questo tipo di cose in altri linguaggi di troppo.

Quello che si vuole fare è una semplice manipolazione delle stringhe - a parte i separatori delle parole mancanti, come fa notare Barry, anche se questo non è un problema tecnico.

Fondamentalmente, per un moderno linguaggio di programmazione compatibile con Unicode (che JavaScript è stato dalla versione 1.3, credo) non c'è alcuna differenza tra un kana giapponese o kanji e una lettera latina - sono tutti solo caratteri. E una stringa è solo, beh, una stringa di caratteri.

Dove diventa difficile è quando è necessario convertire tra stringhe e byte, perché è necessario prestare attenzione a quale codifica si sta utilizzando.Sfortunatamente, molti programmatori, specialmente i madrelingua inglesi tendono a sorvolare su questo problema perché ASCII è la codifica standard di fatto per le lettere latine e altre codifiche di solito cercano di essere compatibili. Se le lettere latine sono tutto ciò di cui hai bisogno, allora puoi andare avanti ignorando beatamente le codifiche dei personaggi, credendo che i byte e i personaggi siano fondamentalmente la stessa cosa - e scrivi programmi che mutilano tutto ciò che non è ASCII.

Quindi il "segreto" della programmazione con riconoscimento Unicode è questo: imparare a riconoscere quando e dove stringhe/caratteri vengono convertiti da e verso byte, e assicurarsi che in tutti questi posti venga utilizzata la codifica corretta, vale a dire la stessa che sarà usato per la conversione inversa e uno che può codificare tutti i personaggi che stai usando. UTF-8 sta lentamente diventando lo standard di fatto e dovrebbe essere normalmente utilizzato ovunque tu abbia una scelta.

Tipici esempi (non esaustivi):

  • Quando si scrive il codice sorgente con le stringhe non ASCII (configurare codifica l'editor/IDE)
  • Quando si compila o interpretare come codice sorgente (compilatore/interprete ha bisogno di conoscere la codifica)
  • Durante la lettura/scrittura di stringhe in un file (codifica deve essere specificato da qualche parte nel API, o nei metadati del file)
  • Quando si scrive le stringhe in un database (codifica deve essere specificato nel configurazione del DB o r tabella)
  • Quando si consegnano pagine HTML tramite un server Web (la codifica deve essere specificata nelle intestazioni HTML o nella meta header delle pagine; le forme possono essere anche più difficili)
+0

In realtà dopo aver letto questo e aver parlato con un amico ho provato a fare di nuovo una semplice manipolazione delle stringhe b sul "tutto è una stringa" e ha funzionato. Non ho idea di quello che stavo facendo che ha ucciso il primo tentativo, ma sono contento che sia stato facile e mi sento stupido perché non funziona la prima volta. Grazie per la risposta. – percent20

0

Se ricordo correttamente (e ho rallentato molto l'anno in cui ho preso il giapponese in modo che potessi sbagliarmi), le sostituzioni che vuoi fare sono determinate dall'ultimo simbolo o due nella parola. Prendendo il tuo primo esempio, ogni verbo che termina in "す" avrà sempre "し て" se coniugato in questo modo. Allo stesso modo per む -> ん で. Potresti forse stabilire una mappatura dell'ultimo carattere (s) -> forma coniugata. Potrebbe essere necessario rendere conto di eccezioni, come qualsiasi cosa che si coniughi con xx っ て.

Per quanto riguarda la portabilità tra le lingue, è necessario implementare la logica in modo diverso in base a come funzionano. Questa soluzione sarebbe abbastanza semplice da implementare anche per lo spagnolo, poiché le coniugazioni dipendono dal fatto che il verbo termini in -ar, -er o -ir (con alcuni verbi che richiedono eccezioni nella tua logica). Sfortunatamente, questo è il limite delle mie abilità multi-lingue, quindi non so come andrebbe bene oltre quei due.

+0

In realtà ho pensato di fare la mappatura e posso vedere il beneficio di ma vedrai anche il beneficio di più su loro volano trasformazione. Sono stato incerto su quale approccio e persino su come trattare il giapponese tutti insieme mentre codice. La cosa più importante è più tardi quando arrivo a forme brevi e le forme di tai sono dove vedo il loro servizio di aiuto. – percent20

1

la tua domanda non mi è chiara.

tuttavia, ho avuto qualche esperienza con il linguaggio giapponese, quindi darò i miei 2 centesimi.

poiché i testi giapponesi non presentano la separazione delle parole (ad esempio il carattere dello spazio), lo strumento più importante che abbiamo dovuto acquisire è un riconoscitore di parole basato su dizionario.

una volta diviso il testo, è più facile manipolarlo con strumenti "normali".

c'erano solo 2 strumenti che hanno fatto quanto sopra, e come sottoprodotto hanno anche lavorato come tagger (cioè nome, verbo, ecc.).

modifica: utilizzare sempre unicode quando si lavora su lingue diverse.

+0

Scusa, la mia domanda è una specie di due cose in una. Ero nervoso per iniziare 2 argomenti diversi, quindi ho combinato un "Quali sono alcuni suggerimenti per lavorare con la lingua giapponese" e "Come posso realizzare xyz". Ci sono altri suggerimenti che puoi offrire con la tua esperienza, qualsiasi cosa sarebbe grandiosa. Non avevo pensato di spacciare le parole, non ero arrivato così lontano. Per lo più sono dopo come manipolare le singole parole. Tuttavia, qualsiasi suggerimento sulla programmazione con la lingua giapponese è utile e apprezzato. Per essere onesti stavo cercando di evitare di mappare i file in unicode, ma sembra che sia necessario utilizzare uno o entrambi. – percent20

26
  • Stick in Unicode e UTF-8 in tutto il mondo.
  • Stai lontano dalle codifiche giapponesi native: euc-jp, shiftjis, iso-2022-jp, ma tieni presente che probabilmente li incontrerai ad un certo punto se continui.
  • Acquisire familiarità con un segmentatore per eseguire operazioni complicate come l'analisi POS, la segmentazione delle parole, ecc. Gli strumenti standard utilizzati dalla maggior parte delle persone che lavorano su PNL (elaborazione del linguaggio naturale) sono in ordine di popolarità/potenza.

MeCab (originariamente su SourceForge) è impressionante: essa consente di scattare testo come,

「日本語は、とても難しいです。」

e ottenere tutti i tipi di informazioni grande indietro

kettle:~$ echo 日本語は、難しいです | mecab 
日本語 名詞,一般,*,*,*,*,日本語,ニホンゴ,ニホンゴ 
は 助詞,係助詞,*,*,*,*,は,ハ,ワ 
、 記号,読点,*,*,*,*,、,、,、 
難しい 形容詞,自立,*,*,形容詞・イ段,基本形,難しい,ムズカシイ,ムズカシイ 
です 助動詞,*,*,*,特殊・デス,基本形,です,デス,デス 
EOS

che è fondamentalmente una dettagliata run-down delle parti-of-speech, letture, pronunce, ecc. Ti farà anche il favore di analizzare i tempi verbali,

kettle:~$ echo メキシコ料理が食べたい | mecab 
メキシコ 名詞,固有名詞,地域,国,*,*,メキシコ,メキシコ,メキシコ 
料理 名詞,サ変接続,*,*,*,*,料理,リョウリ,リョーリ 
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ 
食べ 動詞,自立,*,*,一段,連用形,食べる,タベ,タベ 
たい 助動詞,*,*,*,特殊・タイ,基本形,たい,タイ,タイ 
EOS

Tuttavia, la documentazione è tutto in giapponese, ed è un po 'complicato da configurare e capire come formattare l'output nel modo desiderato. Ci sono pacchetti disponibili per Ubuntu/Debian, e le associazioni in un mucchio di lingue, tra cui Perl, Python, Ruby ...

Apt-Repos per Ubuntu:

deb http://cl.naist.jp/~eric-n/ubuntu-nlp intrepid all 
deb-src http://cl.naist.jp/~eric-n/ubuntu-nlp intrepid all

pacchetti da installare: $ apt-get install mecab-ipadic-utf8 mecab python-mecab

dovrebbe fare il trucco credo.

Le altre alternative a mecab sono, ChaSen, che è stata scritta anni fa dall'autore di MeCab (che funziona incidentalmente su Google ora) e Kakasi, che è molto meno potente.

Cercherò sicuramente di evitare di far rotolare le tue routine di coniugazione. il problema con questo è solo che richiederà tonnellate e tonnellate di lavoro, che altri hanno già fatto, e coprire tutti i casi limite con le regole è, alla fine della giornata, impossibile.

MeCab è statisticamente guidato e addestrato su un sacco di dati. Impiega una sofisticata tecnica di machine learning chiamata campi casuali condizionali (CRF) ed i risultati sono davvero buoni.

Divertiti con il giapponese. Non sono sicuro di quanto sia buono il tuo giapponese, ma se hai bisogno di aiuto con i documenti per mecab o qualsiasi altra cosa sentiti libera di chiedere anche a questo. Kanji può essere piuttosto intimidatorio all'inizio.

+0

Vorrei poterlo contrassegnare anche come risposta. :(Grazie per l'ottima informazione, stavo solo facendo le mie routine di coniugazione come esercizio di programmazione e per imparare meglio il nocciolo intorno alla lingua giapponese.Se vado oltre nel giapponese, darò un'occhiata a un segmentatore Grazie – percent20

+1

Post meraviglioso, grazie per questo MeCab rocks – aehlke

+0

Inciampato su MeCab mentre giocavo con C#. Volevo solo aggiungere che è fantastico. C'è anche un servizio web MeCab @ http://mimitako.net/api/mecapi.cgi. Oh e "non ufficiale" C# bindings @ http://en.sourceforge.jp/projects/mecabdotnet/. Cheers! –

2

Quello che devi fare è osservare le regole della grammatica. Avere una serie di regole per ogni coniugazione. Prendiamo per esempio il modulo て. Psudocode:

def te_form(verb) 
    switch verb.substr(-1, 1) == "る" then return # verb minus ru plus te 
    case "る" #return (verb - る) + て 
    case "す" #return (verb - す)+して 

ecc Fondamentalmente, scomposizione in tipo I, II e III verbi.

0

Poiché la maggior parte dei verbi in giapponese seguono uno di un piccolo insieme di modelli prevedibili, il modo più semplice e più estensibile per generare tutte le forme di un determinato verbo è quello di sapere quale coniugazione deve seguire, quindi scrivere le funzioni in genera ogni forma a seconda della coniugazione.

Pseudocodice:

generateDictionaryForm(verb) 
    case Ru-Verb: verb.stem + る 
    case Su-Verb: verb.stem + す 
    case Ku-Verb: verb.stem + く 
    ...etc. 

generatePoliteForm(verb) 
    case Ru-Verb: verb.stem + ります 
    case Su-Verb: verb.stem + します 
    case Ku-Verb: verb.stem + きます 
    ...etc. 

verbi irregolari sarebbero ovviamente essere speciale-carter.

Alcune varianti di questo funzionerebbero per qualsiasi altra lingua abbastanza regolare (ad esempio non inglese).

-2

Provare ad installare la mia gemma (rom2jap). È nel rubino.

gem install rom2jap 

Aprire il terminale e digitate:

require 'rom2jap' 
Problemi correlati