Che lingua è questa parola?


16

Dovresti scrivere un programma o una funzione che determina la lingua di una determinata parola.

Il compito è riconoscere alcune delle 5000 parole più comuni in 4 lingue:

  • inglese
  • Tedesco
  • italiano
  • ungherese

Gli elenchi di parole sono disponibili in questo repository GitHub.

È consentito commettere errori nel 40% dei casi di test forniti . Vale a dire che puoi classificare erroneamente 8000 dei 20000 ingressi.

Dettagli

  • Gli elenchi contengono solo parole con lettere minuscole a-z, ad esempio won'te möchtenon sono inclusi.
  • Alcune parole appaiono in più lingue, il che significa che il tuo codice non può sempre indovinare correttamente l'output previsto.
  • Per comodità è possibile scaricare tutti i casi di test in un unico elenco . In ogni riga un numero indica la lingua della parola. ( 1per inglese, 2tedesco, 3italiano e 4ungherese.)
  • Le scappatoie standard non sono ammesse.
  • L'uso di elenchi di parole è vietato per i nostri dati simili forniti dal tuo linguaggio di programmazione.

Ingresso

  • Una stringa contenente solo lettere inglesi minuscole (az).
  • Il trascinamento di newline è facoltativo.

Produzione

  • Puoi classificare le parole fornendo un output distinto e coerente (sempre lo stesso) per ogni lingua. (Ad esempio 1per l'inglese, 2per il tedesco, 3per l'italiano e 4per l'ungherese.)

Questo è il codice golf, quindi vince il programma o la funzione più breve.

Codice correlato domanda golf: è anche una parola?

Gli elenchi di parole sono stati presi da wiktionary.org e 101languages.net.


sei sicuro che le liste siano corrette? Sono abbastanza sicuro di non aver mai sentito parlare in tedesco. Conta l'output di un array con tutte le lingue possibili? ad es. apparentemente è in tutte le lingue, quindi metterebbe {1,2,3,4}
Eumel

@Eumel Le prime due parole inglesi potrebbero essere presenti da qualche parte negli altri elenchi poiché potrebbero esserci delle frasi inglesi nei testi delle lingue che sono state usate per generare gli elenchi di parole. Puoi classificare un input in una sola lingua. (Whihch significa, come menzionato nella domanda, che "il tuo codice non può sempre indovinare correttamente l'output previsto".)
randomra

Gli elenchi contengono solo parole con lettere minuscole ... Non è del tutto vero. Il all_languagesfile include decine di parole in maiuscolo ( Mr, Gutenberg, ecc) e le non-parole "" (stringa vuota) e "]] | -". Presumo che sia OK per minuscole la prima ed eliminare la seconda?
ossifrage schifoso

@squeamishossifrage Grazie per la cattura. Aggiornate le liste inglesi. (C'erano ~ 60 parole maiuscole e 2 non parole.)
randomra,

Perché rimuovere i segni diacritici? Se l'obiettivo è distinguere le lingue che non hanno segni diacritici, allora perché non usare le lingue che non hanno segni diacritici?
pat

Risposte:


9

Retina , 51 byte

.*[aeio]$
1
A`en$|ch|ei|au
^$
2
A`[jkz]|gy|m$
\D+
4

Ho trovato le regex e @ MartinBüttner ha fatto la conversione a / golf a Retina, quindi ... evviva per lo sforzo di squadra?

La mappatura è 1 -> Italian, 2 -> German, (empty) -> Hungarian, 4 -> English, con l'importo classificato in ciascuna categoria 4506 + 1852 + 2092 + 3560 = 12010.

Provalo online! | Versione multilinea modificata

Spiegazione

Prima di tutto, l'equivalente Python è qualcosa del genere:

import re
def f(s):
  if re.search("[aeio]$", s):
    return 1
  if re.search("en$|ch|ei|au", s):
    return 2
  if re.search("[jkz]|gy|m$", s):
    return ""
  return 4

Vorrei solo dire che o$è un eccellente indicatore dell'italiano.

La versione Retina è simile, con coppie di linee che formano fasi di sostituzione. Ad esempio, le prime due righe

.*[aeio]$
1

sostituisce le corrispondenze della prima riga con i contenuti della seconda.

Le tre righe successive fanno lo stesso, ma usando la modalità anti-grep di Retina - anti-grep (specificato con A`) rimuove la linea se corrisponde alla regex data, e le due righe seguenti sono una sostituzione da una riga vuota all'output desiderato.

A`en$|ch|ei|au
^$
2

La riga seguente usa di nuovo anti-grep, ma non sostituisce la riga vuota, fornendo l'output fisso per l'ungherese.

A`[jkz]|gy|m$

Finalmente le ultime due righe

\D+
4

sostituisce una riga non cifra non vuota con 4. Tutte le sostituzioni possono avvenire solo se non è stata attivata alcuna sostituzione precedente, simulando una if/else ifcatena.


1

LabVIEW, 29 LabVIEW Primitives e 148.950 byte

scorre ciclicamente le lingue e inserisce l'iteratore in un array se la parola è presente. Questo viene verificato dal circuito interno, selezionando la riga e facendo =. In LabVIEW è vero solo se le stringhe sono esattamente le stesse.

Ora prendi il primo elemento dell'array di output in modo che l'inglese si occupi del resto.

L'output per ora è 0per inglese, 1tedesco, 2italiano e 3ungherese.


Non ho familiarità con LabView, ma come memorizzi i valori (elenchi di parole) e come si riflettono nei LabView Primitives? La voce meta dice: " Costanti: le stringhe sono 1 LabVIEW Primitive per carattere ". Non aumenterebbe notevolmente il conteggio dei primitivi?
inserire nomeutentequi

Carico il da un file che è percorso directory + percorso build con stringa + file di caricamento. La memorizzazione viene eseguita internamente e viene passata dai fili.
Eumel,

5
Potrei sbagliarmi, ma penso che il nocciolo della sfida sia su come comprimere / archiviare le liste di parole. Pertanto, il caricamento da un file esterno potrebbe non essere consentito. Chiederà all'OP di questo. :)
inserireusernamehere

2
Se si utilizza un file esterno, è necessario aggiungerne le dimensioni alla dimensione del codice poiché fa parte della soluzione.
randomra,

avevo l'impressione che si supponesse che fossero dati, ma che male aggiungerli np
Eumel

1

Java, 3416 byte, 62%

questa è la mia soluzione, analizzo un elenco di parole date e trovo 60 bigrammi e trigrammi più comuni per ogni lingua. Ora sto controllando i miei n-grammi contro la parola e scegliendo la lingua con la maggior parte dei n-grammi in parola.

public class Classificator {

    String[][] triGr = {
            {"ing","ion","ent","tio","ted","nce","ter","res","ati","con","ess","ate","pro","ain","est","ons","men","ect","red","rea","com","ere","ers","nte","ine","her","ble","ist","tin","for","per","der","ear","str","ght","pre","ver","int","nde","the","igh","ive","sta","ure","end","enc","ned","ste","dis","ous","all","and","anc","ant","oun","ten","tra","are","sed","cti"},
            {"sch","che","ver","gen","ten","cht","ich","ein","ste","ter","hen","nde","nge","ach","ere","ung","den","sse","ers","and","eit","ier","ren","sen","ges","ang","ben","rei","est","nen","nte","men","aus","der","ent","hei","her","lle","ern","ert","uch","ine","ehe","auf","lie","tte","ige","ing","hte","mme","end","wei","len","hre","rau","ite","bes","ken","cha","ebe"},
            {"ent","are","ato","nte","ett","ere","ion","chi","con","one","men","nti","gli","pre","ess","att","tto","par","per","sta","tra","zio","and","iam","end","ter","res","est","nto","tta","acc","sci","cia","ver","ndo","amo","ant","str","tro","ssi","pro","era","eri","nta","der","ate","ort","com","man","tor","rat","ell","ale","gio","ont","col","tti","ano","ore","ist"},
            {"sze","ere","meg","ett","gye","ele","ond","egy","enn","ott","tte","ete","unk","ban","tem","agy","zer","esz","tet","ara","nek","hal","dol","mon","art","ala","ato","szt","len","men","ben","kap","ent","min","ndo","eze","sza","isz","fog","kez","ind","ten","tam","nak","fel","ene","all","asz","gon","mar","zem","szo","tek","zet","elm","het","eve","ssz","hat","ell"}

                    };
    static String[][] biGr = {
        {"in","ed","re","er","es","en","on","te","ng","st","nt","ti","ar","le","an","se","de","at","ea","co","ri","ce","or","io","al","is","it","ne","ra","ro","ou","ve","me","nd","el","li","he","ly","si","pr","ur","th","di","pe","la","ta","ss","ns","nc","ll","ec","tr","as","ai","ic","il","us","ch","un","ct"},
        {"en","er","ch","te","ge","ei","st","an","re","in","he","ie","be","sc","de","es","le","au","se","ne","el","ng","nd","un","ra","ar","nt","ve","ic","et","me","ri","li","ss","it","ht","ha","la","is","al","eh","ll","we","or","ke","fe","us","rt","ig","on","ma","ti","nn","ac","rs","at","eg","ta","ck","ol"},
        {"re","er","to","ar","en","te","ta","at","an","nt","ra","ri","co","on","ti","ia","or","io","in","st","tt","ca","es","ro","ci","di","li","no","ma","al","am","ne","me","le","sc","ve","sa","si","tr","nd","se","pa","ss","et","ic","na","pe","de","pr","ol","mo","do","so","it","la","ce","ie","is","mi","cc"},
        {"el","en","sz","te","et","er","an","me","ta","on","al","ar","ha","le","gy","eg","re","ze","em","ol","at","ek","es","tt","ke","ni","la","ra","ne","ve","nd","ak","ka","in","am","ad","ye","is","ok","ba","na","ma","ed","to","mi","do","om","be","se","ag","as","ez","ot","ko","or","cs","he","ll","nn","ny"}

                    };

    public int guess(String word) {

        if (word.length() < 3) {
            return 4; // most words below 2 characters on list are hungarians
        }
        int score[] = { 0, 0, 0, 0 };
        for (int i = 0; i < 4; i++) {
            for (String s : triGr[i]) {
                if (word.contains(s)) {
                    score[i] = score[i] + 2;
                }
            }
            for (String s : biGr[i]) {
                if (word.contains(s)) {
                    score[i] = score[i] + 1;
                }
            }
        }
        int v = -1;
        int max = 0;
        for (int i = 0; i < 4; i++) {
            if (score[i] > max) {
                max = score[i];
                v = i;
            }
        }
        v++;
        return v==0?Math.round(4)+1:v;
    }
}

e questa è la mia prova

public class Test {

    Map<String, List<Integer>> words = new HashMap<String, List<Integer>>();

    boolean validate(String word, Integer lang) {
        List<Integer> langs = words.get(word);
        return langs.contains(lang);
    }

    public static void main(String[] args) throws FileNotFoundException {

        FileReader reader = new FileReader("list.txt");
        BufferedReader buf = new BufferedReader(reader);
        Classificator cl = new Classificator();
        Test test = new Test();
        buf.lines().forEach(x -> test.process(x));
        int guess = 0, words = 0;
        for (String word : test.words.keySet()) {
            int lang = cl.guess(word);
            if (lang==0){
                continue;
            }
            boolean result = test.validate(word, lang);
            words++;
            if (result) {
                guess++;
            }
        }
        System.out.println(guess+ " "+words+ "    "+(guess*100f/words));
    }

    private void process(String x) {
        String arr[] = x.split("\\s+");
        String word = arr[0].trim();
        List<Integer> langs = words.get(word);
        if (langs == null) {
            langs = new ArrayList<Integer>();
            words.put(word, langs);
        }
        langs.add(Integer.parseInt(arr[1].trim()));

    }

}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.