Domanda

Ho un'idea di alcune app Web da scrivere per aiutarmi, e forse altre, imparare il giapponese meglio da quando studio la lingua.

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

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

? ? Devo prendere quel verbo e convertirlo nella forma te ? ? ?. Preferirei farlo in javascript in quanto aiuterà lungo la strada per fare più manipolazioni, ma se devo 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 tipo di cose anche in altre lingue. Spero di fare di più nel fare app per l'apprendimento delle lingue, ma mi sono perso quando si tratta di questo.

È stato utile?

Soluzione

  

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

Quello che vuoi fare è una manipolazione delle stringhe piuttosto semplice - a parte i separatori di parole mancanti, come osserva Barry, anche se non è un problema tecnico.

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

Dove diventa difficile è quando devi convertire tra stringhe e byte, perché allora devi prestare attenzione a quale codifica stai usando. Sfortunatamente, molti programmatori, in particolare di madrelingua inglese, tendono a superare questo problema perché ASCII è la codifica standard de facto per lettere latine e altre codifiche che di solito cercano di essere compatibili. Se le lettere latine sono tutto ciò di cui hai bisogno, puoi andare d'accordo con la beatitudine ignoranza delle codifiche dei caratteri, credere che byte e caratteri siano sostanzialmente la stessa cosa - e scrivere programmi che mutilano tutto ciò che non è ASCII.

Quindi il "segreto" della programmazione compatibile con Unicode è questa: impara a riconoscere quando e dove stringhe / caratteri vengono convertiti in e da byte, e assicurati che in tutti quei punti venga utilizzata la codifica corretta, ovvero la stessa che verrà utilizzata 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 normalmente essere usato ovunque tu abbia una scelta.

Esempi tipici (non esaustivi):

  • Quando si scrive codice sorgente con valori letterali di stringa non ASCII (configurare la codifica nell'editor / IDE)
  • Durante la compilazione o l'interpretazione di tale codice sorgente (compilatore / interprete deve conoscere la codifica)
  • Durante la lettura / scrittura di stringhe in un file (la codifica deve essere specificata da qualche parte nell'API o nei metadati del file)
  • Quando si scrivono stringhe in un database (la codifica deve essere specificata nella configurazione del DB o della tabella)
  • Quando si consegnano pagine HTML tramite un server web (la codifica deve essere specificata nelle intestazioni HTML o nella meta header delle pagine; i moduli possono essere ancora più complicati)

Altri suggerimenti

  • Attenersi a Unicode e utf-8 ovunque.
  • Stai lontano dalle codifiche giapponesi native: euc-jp, shiftjis, iso-2022-jp, ma tieni presente che probabilmente le incontrerai ad un certo punto se continui.
  • Familiarizzare con un segmentatore per fare cose complicate come l'analisi POS, la segmentazione delle parole, ecc. gli strumenti standard usati dalla maggior parte delle persone che fanno il NLP (elaborazione del linguaggio naturale) sul giapponese sono, in ordine di popolarità / potere.

MeCab (originariamente su SourceForge ) è fantastico: ti permette di prendere del testo come,

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

e recupera ogni sorta di grandi informazioni

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

che è fondamentalmente un riassunto dettagliato delle parti del discorso, letture, pronunce, ecc. Ti farà anche il favore di analizzare i tempi verbali,

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

Tuttavia, la documentazione è tutta in giapponese ed è un po 'complicato impostare e capire come formattare l'output nel modo desiderato. Ci sono pacchetti disponibili per Ubuntu / Debian e collegamenti in un sacco 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

dovrei fare il trucco penso.

Le altre alternative a mecab sono, ChaSen , che è stato scritto anni fa dal autore di MeCab (che per inciso lavora ora su google ora) e Kakasi , che è molto meno potente.

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

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

Divertiti con i giapponesi. 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 libero di chiedere anche questo. Kanji può essere piuttosto intimidatorio all'inizio.

Quello che devi fare è guardare le regole della grammatica. Avere una serie di regole per ogni coniugazione. Prendiamo ? ? forma per esempio. 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, suddividilo in verbi di tipo I, II e III.

la tua domanda non è del tutto chiara per me.

tuttavia, ho avuto qualche esperienza di lavoro con la lingua giapponese, quindi darò i miei 2 centesimi.

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

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

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

modifica: usa sempre unicode quando lavori con i linguaggi.

Se ricordo bene (e mi sono rilassato molto l'anno in cui ho preso il giapponese, quindi potrei sbagliarmi), i rimpiazzi che vuoi fare sono determinati dall'ultimo simbolo o due nella parola. Prendendo il tuo primo esempio, ogni verbo che termina in '?' avrà sempre '? ?' quando coniugato in questo modo. Allo stesso modo per ? - >? ?. Potresti forse stabilire una mappatura degli ultimi caratteri - > forma coniugata. Potrebbe essere necessario tenere conto delle eccezioni, come tutto ciò che si coniuga con xx ? ?.

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

Poiché la maggior parte dei verbi in giapponese segue uno di un piccolo insieme di schemi prevedibili, il modo più semplice ed estensibile per generare tutte le forme di un dato verbo è far sapere al verbo quale coniugazione dovrebbe seguire, quindi scrivere le funzioni per generare 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.

I verbi irregolari sarebbero ovviamente in maiuscolo.

Alcune varianti di questo funzionerebbero con qualsiasi altra lingua abbastanza regolare (cioè non inglese).

Prova a installare il mio gioiello (rom2jap). È in rubino.

gem install rom2jap

Apri il tuo terminale e digita:

require 'rom2jap'
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top