이 단어는 어떤 언어입니까?


16

주어진 단어의 언어를 결정하는 프로그램이나 기능을 작성해야합니다.

이 작업은 4 개의 언어로 5000 개의 가장 일반적인 단어를 인식하는 것입니다.

  • 영어
  • 독일 사람
  • 이탈리아 사람
  • 헝가리 인

단어 목록은 이 GitHub 리포지토리에서 찾을 수 있습니다 .

제공된 테스트 사례의 40 %에서 실수를 할 수 있습니다 . 즉, 20000 개의 입력 중 8000을 잘못 분류 할 수 있습니다.

세부

  • 목록은 소문자와 단어가 포함 a-z예를 들어, 정도 won'tmöchte포함되지 않습니다.
  • 몇 단어가 여러 언어로 표시되므로 코드가 항상 예상되는 출력을 정확하게 추측 할 수는 없습니다.
  • 편의상 모든 테스트 사례를 하나의 목록으로 다운로드 할 수 있습니다 . 각 줄에서 숫자는 단어의 언어를 나타냅니다. ( 1영어, 2독일어, 3이탈리아어 및 4헝가리어)
  • 표준 허점 은 허용되지 않습니다.
  • 단어 목록을 사용하면 프로그래밍 언어에서 제공하는 유사한 데이터가 금지됩니다.

입력

  • 소문자 영문 (az) 만 포함 된 문자열입니다.
  • 후행 줄 바꿈은 선택 사항입니다.

산출

  • 각 언어에 대해 명확하고 일관된 (항상 동일한) 출력을 제공하여 단어를 분류 할 수 있습니다. (예 : 1영어, 2독일어, 3이탈리아어 및 4헝가리어)

이것은 코드 골프이므로 가장 짧은 프로그램이나 기능이 승리합니다.

관련 코드 골프 질문 : 이것은 심지어 단어입니까?

단어 목록은 wiktionary.org 및 101languages.net에서 가져 왔습니다.


목록이 정확합니까? 나는 독일어에서 들어 본 적이 없어요. 가능한 모든 언어로 배열을 출력합니까? 예를 들어 명백하게 모든 언어로되어 있으므로 {1,2,3,4}
Eumel

@Eumel 단어 목록을 생성하는 데 사용 된 언어 텍스트에 영어 문구가있을 수 있으므로 첫 번째 두 영어 단어가 다른 목록 어딘가에있을 수 있습니다. 입력을 하나의 언어로만 분류 할 수 있습니다. 질문에 언급 된 바와 같이 "코드가 항상 예상 된 결과를 정확하게 추측 할 수는 없습니다"라는 의미입니다.
randomra

이 목록에는 소문자가 포함 된 단어 만 포함되어 있습니다 ... 그것은 사실이 아닙니다. 이 all_languages파일에는 수십 개의 대문자 단어 ( Mr, Gutenberg등)와 단어가 아닌 ""(빈 문자열) 및 "]] |-"가 포함됩니다. 전자를 소문자로 바꾸고 후자를 삭제해도된다고 생각합니까?
squeamish ossifrage

@squeamishossifrage 감사합니다. 영어 목록을 업데이트했습니다. (~ 60 개의 대문자와 2 개의 비 단어가있었습니다.)
randomra

분음 부호를 제거해야하는 이유 분음 부호가없는 언어를 구별하는 것이 목표라면 분음 부호가없는 언어를 사용하지 않는 이유는 무엇입니까?
pat

답변:


9

레티 나 , 51 바이트

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

나는 정규 표현식을 생각해 냈고 @ MartinBüttner는 Retina에서 / 골퍼로 변환을 했으므로 팀 노력을 위해 만세?

매핑은 1 -> Italian, 2 -> German, (empty) -> Hungarian, 4 -> English각 범주로 분류 된 금액이 4506 + 1852 + 2092 + 3560 = 12010됩니다.

온라인으로 사용해보십시오! | 수정 된 여러 줄 버전

설명

우선, 동등한 파이썬은 다음과 같습니다.

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

이탈리아 o$훌륭한 지표 라고 말하겠습니다 .

Retina 버전은 유사하며 라인 쌍이 교체 단계를 형성합니다. 예를 들어 처음 두 줄

.*[aeio]$
1

첫 번째 줄의 일치 항목을 두 번째 줄의 내용으로 바꿉니다.

다음 세 줄은 동일하지만 Retina의 안티 그렙 모드를 사용 A`하면 주어진 정규 표현식과 일치하는 줄을 제거합니다. 다음 두 줄은 빈 줄에서 원하는 출력으로 대체됩니다.

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

다음 줄은 다시 grep을 사용하지만 빈 줄을 바꾸지 않고 헝가리어에 고정 출력을 제공합니다.

A`[jkz]|gy|m$

마지막으로 마지막 두 줄

\D+
4

비어 있지 않은 숫자가 아닌 줄을로 바꿉니다 4. 모든 치환은 이전 치환이 활성화되지 않은 경우에만 발생하여 if/else if사슬을 시뮬레이션 할 수 있습니다.


1

LabVIEW, 29 개 LabVIEW 프리미티브 및 148.950 바이트

언어를 순환하고 단어가 있으면 반복자를 배열에 넣습니다. 이것은 내부 루프에 의해 점검되어 i 번째 라인을 선택하고 수행 =합니다. LabVIEW에서는 문자열이 정확히 동일한 경우에만 true를 제공합니다.

이제 출력 배열의 첫 번째 요소를 사용하여 나머지를 영어로 처리하십시오.

현재 출력은 0영어, 1독일어, 2이탈리아어 및 3헝가리어입니다.


LabView에 익숙하지는 않지만 값 (단어 목록)을 어떻게 저장하고 LabView 프리미티브에 어떻게 반영됩니까? 메타 엔트리는 " 상수 : 문자열은 문자 당 1 개의 LabVIEW 기본 요소입니다 "라고 말합니다. 그것이 Primitive 수를 크게 늘리지 않습니까?
insertusername 여기

문자열 +로드 파일이있는 디렉토리 경로 + 빌드 경로 인 파일에서를로드합니다. 저장은 내부적으로 이루어지며 전선으로 전달됩니다.
Eumel

5
나는 틀릴 지 모르지만 도전의 핵심은 단어 목록을 압축 / 저장하는 방법에 관한 것입니다. 따라서 외부 파일에서로드하는 것이 허용되지 않을 수 있습니다. 그것에 대해 OP에게 물어볼 것입니다. :)
insertusernamehere

2
외부 파일을 사용하는 경우 크기가 솔루션의 일부이므로 코드 크기에 추가되어야합니다.
randomra

나는 그 주어진하지만 병이 그들 NP 추가 될 예정되었다는 인상이었다
Eumel

1

자바, 3416 바이트, 62 %

이것은 내 해결책입니다. 주어진 단어 목록을 분석하고 각 언어에 대해 60 가지 가장 일반적인 bigram 및 trigram을 찾습니다. 이제 n-gram을 단어와 비교하고 n-gram이 가장 많은 언어를 선택합니다.

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;
    }
}

그리고 이것은 내 테스트 케이스입니다

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()));

    }

}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.