この言葉は何語ですか?


16

特定の単語の言語を決定するプログラムまたは関数を作成する必要があります。

タスクは、4つの言語で最も一般的な5000の単語の一部を認識することです。

  • 英語
  • ドイツ人
  • イタリアの
  • ハンガリー語

単語リストは、このGitHubリポジトリにあります。

提供されたテストケースの40%で間違いを犯すことができます。つまり、20000個の入力のうち8000個を誤って分類する可能性があります。

詳細

  • リストには小文字の単語のみが含まれているa-zため、たとえばwon'tmöchteなどは含まれません。
  • いくつかの単語が複数の言語で表示されます。これは、コードが常に期待される出力を正しく推測できないことを意味します。
  • 便宜上、すべてのテストケースを1つのリストとしてダウンロードできます。各行の数字は、単語の言語を示します。(1英語、2ドイツ語、3イタリア語、4ハンガリー語の場合。)
  • 標準抜け穴は許可されていません。
  • 単語リストを使用して、プログラミング言語によって提供される類似のデータは禁止されています。

入力

  • 小文字の英字(az)のみを含む文字列。
  • 末尾の改行はオプションです。

出力

  • 言語ごとに明確で一貫した(常に同じ)出力を提供することで、単語を分類できます。(たとえば1、英語、2ドイツ語、3イタリア語、4ハンガリー語)。

これはコードゴルフであるため、最短のプログラムまたは機能が優先されます。

関連コードのゴルフの質問:これは言葉ですか?

単語リストは、wiktionary.orgと101languages.netから取得されました。


リストは正しいですか?私はドイツ語を聞いたことがないと確信しています。すべての可能な言語で配列を出力することはカウントされますか?たとえば、明らかにすべての言語にあるため、{1,2,3,4}を置くことはできません
Eumel

@Eumel単語リストの生成に使用された言語のテキストに英語のフレーズが含まれている可能性があるため、最初のカップルの英語の単語は他のリストのどこかに存在する可能性があります。入力を1つの言語のみに分類できます。(質問で述べたように、「コードは常に期待される出力を正しく推測できない」ことを意味します。)
randomra

リストには小文字の単語のみが含まれます ...それは完全に真実ではありません。このall_languagesファイルには、大文字の単語(MrGutenbergなど)と単語以外の ""(空の文字列)および "]] |-"が含まれます。前者を小文字にして後者を削除しても大丈夫だと思いますか?
squeamish ossifrage

@squeamishossifrageキャッチしてくれてありがとう。英語のリストを更新しました。(〜60の大文字の単語と2つの非単語がありました。)
randomra

分音記号を削除する理由 目的が分音記号のない言語を区別することである場合、分音記号のない言語を使用しないのはなぜですか?
パット

回答:


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

オンラインでお試しください!| 変更された複数行バージョン

説明

まず、同等のPythonは次のようなものです。

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バージョンも同様で、ラインのペアが交換ステージを形成します。たとえば、最初の2行

.*[aeio]$
1

最初の行の一致を2番目の行の内容で置き換えます。

次の3行は同じことを行いますが、Retinaの反グレップモードを使用します-反グレップ(で指定A`)は、指定された正規表現に一致する行を削除し、次の2行は空の行から目的の出力への置き換えです。

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

次の行ではanti-grepを再度使用していますが、空の行を置き換えず、ハンガリー語の固定出力を提供します。

A`[jkz]|gy|m$

最後に、最後の2行

\D+
4

空でない数字以外の行をに置き換え4ます。すべての置換は、if/else ifチェーンをシミュレートする以前の置換がアクティブ化されていない場合にのみ発生します。


1

LabVIEW、29のLabVIEWプリミティブ、148.950バイト

言語を循環し、単語が存在する場合は反復子を配列に入れます。これは内側のループによってチェックされ、i番目の行を選択して実行します=ます。LabVIEWでは、文字列がまったく同じ場合にのみ真を返します。

ここで、出力配列の最初の要素を取得して、英語が残りを超えるようにします。

現在の出力は0、英語、1ドイツ語、2イタリア語、および3ハンガリー語用です。


私はLabViewに精通していませんが、どのように値(単語リスト)を保存し、LabViewプリミティブにどのように反映しますか?メタエントリには、「定数:文字列は文字ごとに1つのLabVIEWプリミティブです」とあります。それはプリミティブの数を大幅に増やしませんか?
ここにユーザー名を挿入

ディレクトリパス+ビルドパスと文字列+ロードファイルのファイルからロードします。ストレージは内部で行われ、ワイヤーで渡されます。
ユーメル

5
私は間違っているかもしれませんが、ワードリストを圧縮/保存する方法が課題の核心だと思います。そのため、外部ファイルからのロードは許可されない場合があります。それについてOPに尋ねます。:)
ユーザー名をここに挿入します

2
外部ファイルを使用する場合、そのサイズはソリューションの一部であるため、コードサイズに追加する必要があります。
-randomra

私はそれらが与えられることになっていたという印象を受けていましたが、病気でそれらを追加します
np-ユーメル

1

Java、3416バイト、62%

これが私の解決策です。指定された単語のリストを分析し、各言語の60個の最も一般的なバイグラムとトライグラムを見つけます。今、私は単語に対してnグラムをチェックし、単語内のほとんどのnグラムを持つ言語を選択しています。

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.