2010-02-09 15 views
6

Sto usando Python 3.1, ma posso effettuare il downgrade se necessario.Python - conteggio e traduzione delle lettere

Ho un file ASCII contenente una storia breve scritta in una delle lingue il cui alfabeto può essere rappresentato con ASCII superiore o inferiore. Desidero:

1) rilevano una codifica al meglio delle mie capacità, ottenere una sorta di metrica fiducia (varierebbe a seconda della lunghezza del file, a destra)

2) Traduci automaticamente l'intero? cosa usando qualche servizio online gratuito o una biblioteca.

Domanda aggiuntiva: Cosa succede se il testo è scritto in una lingua in cui occorrono 2 o più byte per rappresentare una lettera e il segno di ordinamento dei byte non è lì per aiutarmi?

Infine, come faccio a gestire la punteggiatura e i caratteri misc come lo spazio? Succederà più frequentemente di alcune lettere, giusto? Che dire del fatto che a volte la punteggiatura e i personaggi possono essere mescolati - potrebbero esserci due rappresentazioni di una virgola, due rappresentazioni per ciò che sembra una "a", ecc.?

Sì, ho letto . Per favore aiutami con almeno alcuni di questi articoli.

Grazie!

P.S. Questo non è un compito a casa, ma è per scopi auto-educativi. Preferisco usare una libreria a frequenza di lettere che sia open source e leggibile rispetto a quella che è chiusa, efficiente, ma fa funzionare bene il lavoro.

risposta

2

Essenzialmente ci sono tre compiti principali per attuare l'applicazione descritta:

  • 1a) Identificare la codifica dei caratteri del testo di input
  • 1b) Identificare la lingua del testo di input
  • 2) Get il testo tradotto il testo, per mezzo di una delle API dei servizi on-line

per 1a, si consiglia di dare un'occhiata a decodeh.py, a parte lo script stesso, fornisce molte risorse molto utili per quanto riguarda i set di caratteri e la codifica in generale. CharDet, menzionato in altre risposte sembra anche degno di considerazione.

Una volta che la codifica dei caratteri è nota, come suggerito, è possibile risolvere 1b) calcolando il profilo di frequenza del carattere del testo e confrontandolo con le frequenze note.Sebbene semplice, questo approccio fornisce in genere un rapporto di precisione decente, sebbene possa essere debole su testi più brevi e anche su testi che seguono particolari schemi; per esempio un testo in francese con molti riferimenti alle unità nel sistema metrico avrà una proporzione insolitamente alta delle lettere M, K e C.

Un approccio complementare e molto simile, usare bi-grammi (sequenze di due lettere) e tri-grammi (tre lettere) e le corrispondenti tabelle di riferimenti alla distribuzione di frequenza in varie lingue.

Altri metodi di rilevamento della lingua implicano la tokenizzazione del testo, cioè considerando le parole all'interno del testo. Le risorse NLP includono tabelle con le parole più utilizzate in varie lingue. Tali parole sono in genere articoli, aggettivi possessivi, avverbi e simili.

Una soluzione alternativa al rilevamento della lingua è affidarsi al servizio di traduzione online per capirlo. Ciò che è importante è fornire il servizio di traduzione con il testo in un carattere codificante che comprende, a condizione che la lingua sia superflua.

Infine, come molte applicazioni pratiche di NLP, è possibile decidere di implementare più soluzioni. Utilizzando un modello di progettazione strategica, è possibile applicare diversi filtri/classificatori/passaggi in un ordine particolare e uscire da questa logica in punti diversi a seconda della situazione. Ad esempio, se una semplice frequenza di caratteri/bigrammi corrisponde al testo in inglese (con una piccola deviazione), si può semplicemente fermarsi lì. In caso contrario, se la lingua indovinato è il francese o il tedesco, eseguire un altro test, ecc ecc

1

Se si dispone di un file ASCII, posso dire con certezza al 100% che è codificato in ASCII. Oltre a questo prova chardet. Ma conoscere la codifica non è necessariamente sufficiente per determinare in che lingua si trova.

Come per le codifiche multibyte, L'unico modo affidabile per gestirlo è sperare che abbia caratteri nell'alfabeto latino e cercare quale metà del la coppia ha il NULL. Altrimenti consideralo come UTF-8 a meno che tu non conosca meglio (Shift-JIS, GB2312, ecc.).

Oh e UTF-8. UTF-8, UTF-8, UTF-8. Non penso di poterlo sottolineare abbastanza. E nel caso io non abbia ... UTF-8.

+0

Grazie. Si prega di elaborare il secondo paragrafo. Immagino che la mia conoscenza delle codifiche non sia così profonda come pensavo. –

+2

Qualcuno ha detto UTF-8 ?! – jathanism

2

frequenza di carattere è piuttosto semplice

Ho appena notato che si sta utilizzando Python3.1 quindi questo è ancora più facile

>>> from collections import Counter 
>>> Counter("Μεταλλικα") 
Counter({'α': 2, 'λ': 2, 'τ': 1, 'ε': 1, 'ι': 1, 'κ': 1, 'Μ': 1}) 

Per le versioni più vecchie di Python:

>>> from collections import defaultdict 
>>> letter_freq=defaultdict(int) 
>>> unistring = "Μεταλλικα" 
>>> for uc in unistring: letter_freq[uc]+=1 
... 
>>> letter_freq 
defaultdict(<class 'int'>, {'τ': 1, 'α': 2, 'ε': 1, 'ι': 1, 'λ': 2, 'κ': 1, 'Μ': 1}) 
+0

Metallika, lol. Bene, sì, posso calcolare una frequenza che io chiamo "ingenua", ma come faccio a confrontare quella distribuzione con alcuni di quelli noti? –

1

ho fornito alcune risposte condizionate comunque la tua domanda è un po 'vago e inconsistente. Modifica la tua domanda per fornire risposte alle mie domande di seguito.

(1) Si dice che il file è ASCII ma si desidera rilevare una codifica? Eh? Non è la risposta "ascii" ?? Se hai davvero bisogno di rilevare una codifica, usa chardet

(2) Traduci automaticamente cosa? la codifica? linguaggio? Se lingua, sai qual è la lingua di input o stai cercando di rilevarla anche tu? Per rilevare la lingua, prova a guess-language ... nota che è necessario un ritocco per una migliore individuazione del giapponese. Vedi this SO topic che prende in considerazione il problema giapponese e sottolinea anche che per QUALSIASI indovinatore di lingue, è necessario rimuovere tutto il rumore HTML/XML/Javascript/etc dal tuo testo altrimenti distorce pesantemente il risultato verso linguaggi ASCII come l'inglese (o catalano) !).

(3) Si sta parlando di una "libreria di frequenza delle lettere" ... si utilizzerà questa libreria per fare cosa? Se si indovina la lingua, sembra che l'uso della frequenza delle singole lettere non sia di grande aiuto per distinguere tra le lingue che usano lo stesso (o quasi lo stesso) set di caratteri; è necessario utilizzare la frequenza di gruppi di tre lettere ("trigrammi").

(4) Le vostre domande sulla punteggiatura e gli spazi: dipende dal vostro scopo (di cui non siamo ancora sicuri). Se lo scopo è il rilevamento della lingua, l'idea è di standardizzare il testo; per esempio. Sostituisci tutte le esecuzioni di not (lettera o apostrofo) con un singolo spazio, quindi rimuovi qualsiasi spazio bianco iniziale/finale, invece di aggiungere 1 spazio iniziale e uno finale finale: maggiore precisione viene acquisita trattando i bigrammi di inizio/fine della parola come trigrammi.Nota che come sempre in tutte le elaborazioni del testo dovresti decodificare immediatamente il tuo input in unicode e successivamente lavorare con unicode.

Problemi correlati