versae commited on
Commit
486585a
1 Parent(s): 6b50e33

First full version of the models

Browse files
.gitattributes CHANGED
@@ -32,3 +32,21 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
32
  *.zip filter=lfs diff=lfs merge=lfs -text
33
  *.zst filter=lfs diff=lfs merge=lfs -text
34
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
  *.zip filter=lfs diff=lfs merge=lfs -text
33
  *.zst filter=lfs diff=lfs merge=lfs -text
34
  *tfevents* filter=lfs diff=lfs merge=lfs -text
35
+ data/validation_all.csv filter=lfs diff=lfs merge=lfs -text
36
+ data/validation_all.txt filter=lfs diff=lfs merge=lfs -text
37
+ data/validation_tatoeba.csv filter=lfs diff=lfs merge=lfs -text
38
+ data/test.txt filter=lfs diff=lfs merge=lfs -text
39
+ data/train.csv filter=lfs diff=lfs merge=lfs -text
40
+ data/train_tatoeba.csv filter=lfs diff=lfs merge=lfs -text
41
+ data/test_tatoeba.csv filter=lfs diff=lfs merge=lfs -text
42
+ data/validation_tatoeba.txt filter=lfs diff=lfs merge=lfs -text
43
+ data/test_all.csv filter=lfs diff=lfs merge=lfs -text
44
+ data/test_all.txt filter=lfs diff=lfs merge=lfs -text
45
+ data/test.csv filter=lfs diff=lfs merge=lfs -text
46
+ data/validation.csv filter=lfs diff=lfs merge=lfs -text
47
+ data/test_tatoeba.txt filter=lfs diff=lfs merge=lfs -text
48
+ data/train_all.csv filter=lfs diff=lfs merge=lfs -text
49
+ data/train_tatoeba.txt filter=lfs diff=lfs merge=lfs -text
50
+ data/train_all.txt filter=lfs diff=lfs merge=lfs -text
51
+ data/train.txt filter=lfs diff=lfs merge=lfs -text
52
+ data/validation.txt filter=lfs diff=lfs merge=lfs -text
code/create_fasttext_data.py ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from pathlib import Path
2
+ import pandas as pd
3
+
4
+
5
+
6
+
7
+ train = (pd.concat([pd.read_csv(p, sep="\t", names=["_text", "lang"]) for p in Path("/nfsmounts/datastore/langid2").rglob("*_train.tsv")])
8
+ .assign(text=lambda x: x["_text"].str[6:].str.strip())
9
+ .drop("_text", axis=1)
10
+ .query("'xxx' not in text")
11
+ .sample(frac=1)
12
+ .reset_index()
13
+ .drop('index', axis=1)
14
+ )
15
+ validation = (pd.concat([pd.read_csv(p, sep="\t", names=["_text", "lang"]) for p in Path("/nfsmounts/datastore/langid2").rglob("*_dev.tsv")])
16
+ .assign(text=lambda x: x["_text"].str[6:].str.strip())
17
+ .drop("_text", axis=1)
18
+ .query("'xxx' not in text")
19
+ .sample(frac=1)
20
+ .reset_index()
21
+ .drop('index', axis=1)
22
+ )
23
+ test = (pd.concat([pd.read_csv(p, sep="\t", names=["_text", "lang"]) for p in Path("/nfsmounts/datastore/langid2").rglob("*_test.tsv")])
24
+ .assign(text=lambda x: x["_text"].str[6:].str.strip())
25
+ .drop("_text", axis=1)
26
+ .query("'xxx' not in text")
27
+ .sample(frac=1)
28
+ .reset_index()
29
+ .drop('index', axis=1)
30
+ )
31
+
32
+ train.to_csv("train.csv", index=False)
33
+ validation.to_csv("validation.csv", index=False)
34
+ test.to_csv("test.csv", index=False)
35
+
36
+ Path("train.txt").write_text("\n".join(train.apply(lambda row: f"__label__{row['lang']} {row['text']}".replace('\n', ' '), axis=1).values))
37
+ Path("validation.txt").write_text("\n".join(validation.apply(lambda row: f"__label__{row['lang']} {row['text']}".replace('\n', ' '), axis=1).values))
38
+ Path("test.txt").write_text("\n".join(test.apply(lambda row: f"__label__{row['lang']} {row['text']}".replace('\n', ' '), axis=1).values))
39
+
code/create_models.py ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ import fasttext
2
+
3
+ model = fasttext.train_supervised(input='train.txt', autotuneValidationFile='validation.txt', autotuneDuration=60*60)
4
+ model.save_model("nordic-lid.bin")
5
+ print(model.test("test.txt"))
6
+
7
+ model_all = fasttext.train_supervised(input='train_all.txt', autotuneValidationFile='validation_all.txt', autotuneDuration=60*60)
8
+ model_all.save_model("nordic-lid_all.bin")
9
+ print(model_all.test("test.txt"))
10
+ print(model_all.test("test_all.txt"))
code/create_tatoeba_data.py ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import tarfile
2
+ from pathlib import Path
3
+
4
+ import pandas as pd
5
+ import requests
6
+ from sklearn.model_selection import train_test_split
7
+
8
+
9
+ if not Path("sentences.csv").exists():
10
+ print("Downloading data")
11
+ link = "http://downloads.tatoeba.org/exports/sentences.tar.bz2"
12
+ with requests.get(link , stream=True) as rx, tarfile.open(fileobj=rx.raw, mode="r|bz2") as tarobj:
13
+ tarobj.extractall("./")
14
+
15
+ print("Preparing sentences")
16
+ sents = pd.read_csv("sentences.csv", sep="\t", names=["index", "lang", "text"]).dropna().drop("index", axis=1)
17
+ sents = sents[sents.lang != "\\N"]
18
+ sents = sents[sents.groupby("lang")["lang"].transform("size") > 500]
19
+ sents = sents.groupby("lang").apply(lambda group: group.sample(11_000, replace=True)).droplevel("lang").drop_duplicates()
20
+ sents = sents.sample(frac=1).reset_index().drop('index', axis=1)
21
+ lang_count = len(sents.lang.unique())
22
+
23
+ print(f"Splitting sentences in {lang_count} languages")
24
+ train, validation_test = train_test_split(sents, stratify=sents.lang, test_size=0.1)
25
+ validation, test = train_test_split(validation_test, stratify=validation_test.lang, test_size=0.5)
26
+
27
+ print("Writing files")
28
+ train.to_csv("train_tatoeba.csv", index=False)
29
+ validation.to_csv("validation_tatoeba.csv", index=False)
30
+ test.to_csv("test_tatoeba.csv", index=False)
31
+
32
+ Path("train_tatoeba.txt").write_text("\n".join(train.apply(lambda row: f"__label__{row['lang']} {row['text']}".replace('\n', ' '), axis=1).values))
33
+ Path("validation_tatoeba.txt").write_text("\n".join(validation.apply(lambda row: f"__label__{row['lang']} {row['text']}".replace('\n', ' '), axis=1).values))
34
+ Path("test_tatoeba.txt").write_text("\n".join(test.apply(lambda row: f"__label__{row['lang']} {row['text']}".replace('\n', ' '), axis=1).values))
35
+
36
+ print("Done")
code/prepare_data.sh ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #wget http://downloads.tatoeba.org/exports/sentences.tar.bz2
2
+ #bunzip2 sentences.tar.bz2
3
+ #tar xvf sentences.tar
4
+ #awk -F"\t" '{print"__label__"$2" "$3}' < sentences.csv | shuf > all.txt
5
+ #head -3 all.txt
6
+ #head -n 10000 all.txt > validation_tatoeba.txt
7
+ #tail -n +10001 all.txt > train_tatoeba.txt
8
+
9
+ python create_fasttext_data.py
10
+ python create_tatoeba_data.py
11
+
12
+ cat train*.txt | shuf > train_all.txt
13
+ cat validation*.txt | shuf > validation_all.txt
14
+ cat test*.txt | shuf > test_all.txt
15
+ python <<EOF
16
+ from pathlib import Path
17
+ import pandas as pd
18
+
19
+ pd.DataFrame.from_records([line[9:].split(" ", 1) for line in Path("train_all.txt").read_text().split("\n") if line], columns=["lang", "text"]).to_csv("train_all.csv", index=False)
20
+ pd.DataFrame.from_records([line[9:].split(" ", 1) for line in Path("validation_all.txt").read_text().split("\n") if line], columns=["lang", "text"]).to_csv("validation_all.csv", index=False)
21
+ pd.DataFrame.from_records([line[9:].split(" ", 1) for line in Path("test_all.txt").read_text().split("\n") if line], columns=["lang", "text"]).to_csv("test_all.csv", index=False)
22
+
23
+ EOF
code/test_models.py ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from collections import defaultdict
2
+
3
+ import fasttext
4
+ import pandas as pd
5
+ from sklearn.metrics import classification_report
6
+ from tqdm import tqdm; tqdm.pandas()
7
+ #!pip install tabulate
8
+ import io
9
+ from pathlib import Path
10
+ import numpy as np
11
+ import pandas as pd
12
+ import requests
13
+ from sklearn.metrics import accuracy_score
14
+ from sklearn.metrics import classification_report
15
+ from sklearn.metrics import precision_recall_fscore_support
16
+
17
+
18
+ names = pd.read_csv(
19
+ io.StringIO(requests.get("https://iso639-3.sil.org/sites/iso639-3/files/downloads/iso-639-3.tab").text
20
+ ), sep="\t").set_index("Id").rename(
21
+ columns={"Ref_Name": "name"}
22
+ )[["name"]].to_dict()["name"]
23
+ tato_names = pd.read_html(
24
+ "https://tatoeba.org/en/stats/sentences_by_language"
25
+ )[0].rename(
26
+ columns={"Unnamed: 2": "code", "Language": "name"}
27
+ ).set_index("code")[["name"]].to_dict()["name"]
28
+ names.update(tato_names)
29
+
30
+ # langs = pd.read_csv("train.csv").lang.unique().tolist()
31
+ # langs_df = pd.DataFrame({"ISO-639-3": langs}).sort_values("ISO-639-3")
32
+ # langs_df["Language"] = langs_df["ISO-639-3"].apply(names.__getitem__)
33
+ # langs_df = langs_df.set_index("ISO-639-3")
34
+
35
+
36
+ def pandas_classification_report(y_true, y_pred, labels=None):
37
+ metrics_summary = precision_recall_fscore_support(
38
+ y_true=y_true,
39
+ y_pred=y_pred,
40
+ labels=labels)
41
+ weighted_avg = list(precision_recall_fscore_support(
42
+ y_true=y_true,
43
+ y_pred=y_pred,
44
+ labels=labels,
45
+ average='weighted'))
46
+ macro_avg = list(precision_recall_fscore_support(
47
+ y_true=y_true,
48
+ y_pred=y_pred,
49
+ labels=labels,
50
+ average='macro'))
51
+ accuracy = [np.nan, np.nan, accuracy_score(y_true=y_true, y_pred=y_pred), np.nan]
52
+ metrics_sum_index = ['precision', 'recall', 'f1-score', 'support']
53
+ class_report_df = pd.DataFrame(
54
+ list(metrics_summary),
55
+ index=metrics_sum_index,
56
+ columns=labels)
57
+
58
+ support = class_report_df.loc['support']
59
+ total = support.sum()
60
+ weighted_avg[-1] = total
61
+ macro_avg[-1] = total
62
+ accuracy[-1] = total
63
+
64
+ class_report_df['accuracy'] = accuracy
65
+ class_report_df['weighted avg'] = weighted_avg
66
+ class_report_df['macro avg'] = macro_avg
67
+ report = class_report_df.T
68
+ report["support"] = report["support"].astype(int)
69
+ return report
70
+
71
+
72
+ scores_text = ""
73
+ for model_name in ("nordic-lid.bin", "nordic-lid_all.bin"):
74
+ print(
75
+ f"""
76
+ ------------
77
+ {model_name}
78
+ ------------
79
+ """)
80
+ model = fasttext.load_model(model_name)
81
+
82
+ train = pd.read_csv("train.csv")
83
+ ddict = defaultdict(lambda: "---")
84
+ for k in train.lang.unique().tolist():
85
+ ddict[k] = k
86
+
87
+ train["nordic-lid"] = train.progress_apply(lambda row: ddict[model.predict(row["text"].replace("\n", " "))[0][0][-3:]], axis=1)
88
+ print("TRAIN")
89
+ print(model.test("train.txt"))
90
+ print(classification_report(train["lang"], train["nordic-lid"], digits=4))
91
+
92
+ val = pd.read_csv("validation.csv")
93
+ val["nordic-lid"] = val.progress_apply(lambda row: ddict[model.predict(row["text"].replace("\n", " "))[0][0][-3:]], axis=1)
94
+ print("VALIDATION")
95
+ print(model.test("validation.txt"))
96
+ print(classification_report(val["lang"], val["nordic-lid"], digits=4))
97
+
98
+ test = pd.read_csv("test.csv")
99
+ test["nordic-lid"] = test.progress_apply(lambda row: ddict[model.predict(row["text"].replace("\n", " "))[0][0][-3:]], axis=1)
100
+ print("TEST")
101
+ print(model.test("test.txt"))
102
+ print(classification_report(test["lang"], test["nordic-lid"], digits=4))
103
+
104
+ if "_all" in model_name:
105
+ train = pd.read_csv("train_all.csv")
106
+ ddict = defaultdict(lambda: "---")
107
+ for k in train.lang.unique().tolist():
108
+ ddict[k] = k
109
+
110
+ train["nordic-lid"] = train.progress_apply(lambda row: ddict[model.predict(row["text"].replace("\n", " "))[0][0][-3:]], axis=1)
111
+ print("TRAIN ALL")
112
+ print(model.test("train_all.txt"))
113
+ print(classification_report(train["lang"], train["nordic-lid"], digits=4))
114
+
115
+ val = pd.read_csv("validation_all.csv")
116
+ val["nordic-lid"] = val.progress_apply(lambda row: ddict[model.predict(row["text"].replace("\n", " "))[0][0][-3:]], axis=1)
117
+ print("VALIDATION ALL")
118
+ print(model.test("validation_all.txt"))
119
+ print(classification_report(val["lang"], val["nordic-lid"], digits=4))
120
+
121
+ test = pd.read_csv("test_all.csv")
122
+ test["nordic-lid"] = test.progress_apply(lambda row: ddict[model.predict(row["text"].replace("\n", " "))[0][0][-3:]], axis=1)
123
+ print("TEST ALL")
124
+ print(model.test("test_all.txt"))
125
+ print(classification_report(test["lang"], test["nordic-lid"], digits=4))
126
+
127
+ langs = pd.read_csv("train_all.csv").lang.unique().tolist()
128
+ else:
129
+ langs = pd.read_csv("train.csv").lang.unique().tolist()
130
+
131
+ langs_df = pd.DataFrame({"ISO-639-3": langs}).sort_values("ISO-639-3")
132
+ langs_df["Language"] = langs_df["ISO-639-3"].apply(names.__getitem__)
133
+ langs_df = langs_df.set_index("ISO-639-3")
134
+
135
+ report_df = pandas_classification_report(test["nordic-lid"], test["lang"], sorted(langs))
136
+ scores = report_df.join(langs_df)
137
+ scores.columns = map(str.title, scores.columns)
138
+ scores.index.name = "ISO-639-3"
139
+ scores = scores[["Language"] + [col.title() for col in scores.columns if col != "Language"]]
140
+ scores_text += f"## {model_name}\n\n{scores.reset_index().to_markdown(index=False, floatfmt='.4f')}\n\n"
141
+
142
+ print()
143
+
144
+ print(scores_text)
145
+ Path("./scores.md").write_text(scores_text)
data/test.csv ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e74990101c32ce2127b5746ddb94aed6fd2a58602dd43d5e0ba258ab9325b1a5
3
+ size 580011
data/test.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:50a7ad73a0065eb0d501c6608a0374148a5af0aacf5f3f558a932e9610985a71
3
+ size 624477
data/test_all.csv ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2a98db9e35920fbf002bae9195d8006cc63370360001f6ea41090155c70cda2c
3
+ size 2449952
data/test_all.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:73b8c4cc9a757a963b76c7b8e1e15370644a8967ef07237657b25336dda1955a
3
+ size 2831836
data/test_tatoeba.csv ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:630ca5569ae61e8b3a9a525b59cf966cc00520fa2507c0c5e3a589cc5f2c14e0
3
+ size 1869943
data/test_tatoeba.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:05ea1e7d20fc6252e2bc151d20f3be616e6ebf58ae2e043ca983f5d96276e7e7
3
+ size 2207358
data/train.csv ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:beefe8b0a9ba61cf55c9ef0885d36170ea4fb1f8c1487f8c8e131b7f15c598ec
3
+ size 8483510
data/train.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8d82958dfc4736b74801c21b090596d3da3aa60bea4f54d706f71753f1bbe8dd
3
+ size 9136984
data/train_all.csv ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:5dbf35164649f49e3f230b54978032b764d364dcb51b7f6f98276039661377f4
3
+ size 42158820
data/train_all.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:74f8c470418d15e87bd6c1ab4f3e40b5838546682d79692463b7f7f275a67914
3
+ size 48886432
data/train_tatoeba.csv ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:06120b49c7dbbd1a63739a30f5fb305a39da8477297768c4374470b508dd70d8
3
+ size 33675312
data/train_tatoeba.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:752a82a66e0002440eb4a035838d69c3cd9294ca28094318a584def7cab4b4dd
3
+ size 39749447
data/validation.csv ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e9d303938403699700be43133e06038b9c0f38954b875337cb29be89b94a39a8
3
+ size 577673
data/validation.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:064db1e9bbf1013a6b505dc1e9c66171ddbfe831f433ebc16a9f1c024c4683a1
3
+ size 622232
data/validation_all.csv ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c16ff730a83e409b494b71b77ebfa0c94498218a9574863b597343c3dd222cd2
3
+ size 2462876
data/validation_all.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:28c998fca8199809f8ac1b387b33de9002422af0f1bd2e6150c85ab2a7df1f71
3
+ size 2844912
data/validation_tatoeba.csv ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:96fc539c28120cc3a98b0a006c2cd36b7f1917987a3c3d6bab7a1c920595c546
3
+ size 1885205
data/validation_tatoeba.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8123f84395ff12491e0b5623fc36b07f977aa935d00e6aedbd5e5857e32336f6
3
+ size 2222679
nordic-lid.159.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:90835f286b3ecd1538b15c8f82a2dd461ecb5614903741767173a2c1ba8e6d48
3
+ size 747823000
nordic-lid.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a65c608ed4f0bfe05694ed75fd7b1643110a215cfd39fbc82a40f3374aaaf26e
3
+ size 273830875
scores.md ADDED
@@ -0,0 +1,188 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ## nordic-lid.bin
2
+
3
+ | ISO-639-3 | Language | Precision | Recall | F1-Score | Support |
4
+ |:-------------|:------------------|------------:|---------:|-----------:|----------:|
5
+ | dan | Danish | 0.9720 | 0.9838 | 0.9779 | 494 |
6
+ | eng | English | 0.9980 | 0.9940 | 0.9960 | 502 |
7
+ | fao | Faroese | 0.9920 | 0.9940 | 0.9930 | 499 |
8
+ | fin | Finnish | 1.0000 | 1.0000 | 1.0000 | 500 |
9
+ | isl | Icelandic | 0.9900 | 0.9920 | 0.9910 | 499 |
10
+ | nno | Norwegian Nynorsk | 0.9920 | 0.9861 | 0.9890 | 503 |
11
+ | nob | Norwegian Bokmål | 0.9840 | 0.9743 | 0.9791 | 505 |
12
+ | sma | Southern Sami | 0.9800 | 0.9703 | 0.9751 | 101 |
13
+ | sme | Northern Sami | 1.0000 | 0.9921 | 0.9960 | 504 |
14
+ | smj | Lule Sami | 0.9920 | 0.9960 | 0.9940 | 498 |
15
+ | smn | Inari Sami | 0.9950 | 1.0000 | 0.9975 | 199 |
16
+ | sms | Skolt Sami | 0.9900 | 0.9950 | 0.9925 | 199 |
17
+ | swe | Swedish | 0.9860 | 0.9920 | 0.9890 | 497 |
18
+ | accuracy | nan | nan | nan | 0.9905 | 5500 |
19
+ | weighted avg | nan | 0.9906 | 0.9905 | 0.9905 | 5500 |
20
+ | macro avg | nan | 0.9901 | 0.9900 | 0.9900 | 5500 |
21
+
22
+ ## nordic-lid_all.bin
23
+
24
+ | ISO-639-3 | Language | Precision | Recall | F1-Score | Support |
25
+ |:-------------|:----------------------------|------------:|---------:|-----------:|----------:|
26
+ | afr | Afrikaans | 0.9476 | 0.9476 | 0.9476 | 191 |
27
+ | ara | Arabic | 0.9708 | 0.9472 | 0.9588 | 492 |
28
+ | arq | Algerian Arabic | 0.9478 | 0.9237 | 0.9356 | 118 |
29
+ | arz | Egyptian Arabic | 0.6316 | 0.7660 | 0.6923 | 47 |
30
+ | asm | Assamese | 0.9828 | 0.9884 | 0.9856 | 173 |
31
+ | avk | Kotava | 0.9791 | 0.9894 | 0.9842 | 189 |
32
+ | aze | Azerbaijani | 0.9707 | 0.9789 | 0.9748 | 237 |
33
+ | bel | Belarusian | 0.9892 | 0.9733 | 0.9812 | 375 |
34
+ | ben | Bengali | 0.9872 | 0.9872 | 0.9872 | 235 |
35
+ | ber | Berber | 0.8881 | 0.8388 | 0.8627 | 577 |
36
+ | bos | Bosnian | 0.1310 | 0.3333 | 0.1880 | 33 |
37
+ | bre | Breton | 0.9648 | 0.9786 | 0.9716 | 280 |
38
+ | bua | Buryat | 0.9111 | 0.9111 | 0.9111 | 45 |
39
+ | bul | Bulgarian | 0.9597 | 0.9662 | 0.9630 | 444 |
40
+ | cat | Catalan | 0.9538 | 0.9475 | 0.9507 | 305 |
41
+ | cbk | Chavacano | 0.9627 | 0.9773 | 0.9699 | 132 |
42
+ | ceb | Cebuano | 0.8205 | 0.8533 | 0.8366 | 75 |
43
+ | ces | Czech | 0.9606 | 0.9740 | 0.9672 | 500 |
44
+ | chv | Chuvash | 0.9756 | 0.9877 | 0.9816 | 81 |
45
+ | ckb | Central Kurdish (Soranî) | 0.9751 | 0.9915 | 0.9832 | 355 |
46
+ | ckt | Chukchi | 0.9615 | 1.0000 | 0.9804 | 25 |
47
+ | cmn | Mandarin Chinese | 0.9530 | 0.8743 | 0.9120 | 557 |
48
+ | cor | Cornish | 0.9945 | 0.9628 | 0.9784 | 188 |
49
+ | csb | Kashubian | 0.9574 | 1.0000 | 0.9783 | 45 |
50
+ | cym | Welsh | 0.9375 | 0.9615 | 0.9494 | 78 |
51
+ | dan | Danish | 0.9401 | 0.9363 | 0.9382 | 1005 |
52
+ | deu | German | 0.9853 | 0.9781 | 0.9817 | 549 |
53
+ | dsb | Lower Sorbian | 0.8704 | 0.8246 | 0.8468 | 57 |
54
+ | dtp | Central Dusun | 0.8881 | 0.9549 | 0.9203 | 133 |
55
+ | ell | Greek | 0.9979 | 0.9979 | 0.9979 | 475 |
56
+ | eng | English | 0.9895 | 0.9839 | 0.9867 | 1055 |
57
+ | epo | Esperanto | 0.9817 | 0.9926 | 0.9871 | 540 |
58
+ | est | Estonian | 0.9545 | 0.9711 | 0.9628 | 173 |
59
+ | eus | Basque | 0.9844 | 0.9583 | 0.9712 | 264 |
60
+ | fao | Faroese | 0.9820 | 0.9859 | 0.9840 | 498 |
61
+ | fin | Finnish | 0.9932 | 0.9780 | 0.9855 | 1045 |
62
+ | fkv | Kven Finnish | 0.6154 | 0.8889 | 0.7273 | 18 |
63
+ | fra | French | 0.9871 | 0.9908 | 0.9890 | 542 |
64
+ | frr | North Frisian | 0.9640 | 0.9710 | 0.9675 | 138 |
65
+ | fry | Frisian | 0.6774 | 0.9545 | 0.7925 | 22 |
66
+ | gcf | Guadeloupean Creole French | 0.9619 | 1.0000 | 0.9806 | 101 |
67
+ | gla | Scottish Gaelic | 0.9412 | 0.9796 | 0.9600 | 49 |
68
+ | gle | Irish | 0.9635 | 0.9778 | 0.9706 | 135 |
69
+ | glg | Galician | 0.9104 | 0.9369 | 0.9234 | 206 |
70
+ | gos | Gronings | 0.9549 | 0.9588 | 0.9569 | 243 |
71
+ | grc | Ancient Greek | 0.9828 | 0.9828 | 0.9828 | 58 |
72
+ | grn | Guarani | 0.9684 | 0.9935 | 0.9808 | 154 |
73
+ | guc | Wayuu | 0.9111 | 0.9762 | 0.9425 | 42 |
74
+ | hau | Hausa | 0.9814 | 0.9953 | 0.9883 | 425 |
75
+ | heb | Hebrew | 1.0000 | 1.0000 | 1.0000 | 536 |
76
+ | hin | Hindi | 1.0000 | 0.9974 | 0.9987 | 391 |
77
+ | hoc | Ho | 0.9429 | 0.9167 | 0.9296 | 36 |
78
+ | hrv | Croatian | 0.7447 | 0.6119 | 0.6718 | 286 |
79
+ | hrx | Hunsrik | 0.8727 | 0.9231 | 0.8972 | 52 |
80
+ | hsb | Upper Sorbian | 0.8400 | 0.8289 | 0.8344 | 76 |
81
+ | hun | Hungarian | 0.9853 | 0.9926 | 0.9889 | 539 |
82
+ | hye | Armenian | 1.0000 | 1.0000 | 1.0000 | 225 |
83
+ | ido | Ido | 0.9791 | 0.9563 | 0.9676 | 343 |
84
+ | ile | Interlingue | 0.9352 | 0.9416 | 0.9384 | 291 |
85
+ | ilo | Ilocano | 0.9917 | 0.9600 | 0.9756 | 125 |
86
+ | ina | Interlingua | 0.9558 | 0.9621 | 0.9589 | 449 |
87
+ | ind | Indonesian | 0.8526 | 0.8203 | 0.8361 | 423 |
88
+ | isl | Icelandic | 0.9863 | 0.9897 | 0.9880 | 871 |
89
+ | ita | Italian | 0.9817 | 0.9711 | 0.9764 | 553 |
90
+ | jav | Javanese | 0.9600 | 0.9600 | 0.9600 | 50 |
91
+ | jbo | Lojban | 1.0000 | 0.9926 | 0.9963 | 405 |
92
+ | jpn | Japanese | 0.9851 | 1.0000 | 0.9925 | 530 |
93
+ | kab | Kabyle | 0.8382 | 0.8959 | 0.8661 | 509 |
94
+ | kat | Georgian | 1.0000 | 0.9885 | 0.9942 | 260 |
95
+ | kaz | Kazakh | 0.9896 | 0.9845 | 0.9870 | 193 |
96
+ | kha | Khasi | 0.9038 | 0.9400 | 0.9216 | 100 |
97
+ | khm | Khmer | 1.0000 | 1.0000 | 1.0000 | 75 |
98
+ | kmr | Northern Kurdish (Kurmancî) | 0.9851 | 0.9763 | 0.9807 | 338 |
99
+ | knc | Central Kanuri | 0.9719 | 0.9886 | 0.9802 | 175 |
100
+ | kor | Korean | 0.9972 | 0.9832 | 0.9902 | 358 |
101
+ | kzj | Coastal Kadazan | 0.9615 | 0.9336 | 0.9474 | 241 |
102
+ | lad | Ladino | 0.7846 | 0.7969 | 0.7907 | 64 |
103
+ | lat | Latin | 0.9756 | 0.9639 | 0.9697 | 498 |
104
+ | lfn | Lingua Franca Nova | 0.9745 | 0.9700 | 0.9723 | 434 |
105
+ | lij | Ligurian | 0.9333 | 0.9333 | 0.9333 | 90 |
106
+ | lin | Lingala | 0.9765 | 0.9765 | 0.9765 | 213 |
107
+ | lit | Lithuanian | 0.9864 | 0.9922 | 0.9893 | 512 |
108
+ | ltz | Luxembourgish | 0.9773 | 0.9348 | 0.9556 | 46 |
109
+ | lvs | Latvian | 0.9597 | 0.9795 | 0.9695 | 146 |
110
+ | lzh | Literary Chinese | 0.7692 | 0.8046 | 0.7865 | 87 |
111
+ | mal | Malayalam | 1.0000 | 1.0000 | 1.0000 | 44 |
112
+ | mar | Marathi | 0.9961 | 1.0000 | 0.9980 | 509 |
113
+ | mhr | Meadow Mari | 0.9849 | 0.9751 | 0.9800 | 201 |
114
+ | mkd | Macedonian | 0.9572 | 0.9480 | 0.9526 | 519 |
115
+ | mon | Mongolian | 0.9708 | 0.9779 | 0.9744 | 136 |
116
+ | mus | Muskogee (Creek) | 0.9000 | 0.9643 | 0.9310 | 28 |
117
+ | mya | Burmese | 1.0000 | 0.9643 | 0.9818 | 28 |
118
+ | nds | Low German (Low Saxon) | 0.9829 | 0.9710 | 0.9769 | 414 |
119
+ | nld | Dutch | 0.9662 | 0.9772 | 0.9717 | 527 |
120
+ | nnb | Nande | 0.9870 | 0.9870 | 0.9870 | 385 |
121
+ | nno | Norwegian Nynorsk | 0.9585 | 0.9652 | 0.9619 | 575 |
122
+ | nob | Norwegian Bokmål | 0.9247 | 0.9156 | 0.9201 | 912 |
123
+ | nst | Naga (Tangshang) | 1.0000 | 1.0000 | 1.0000 | 39 |
124
+ | nus | Nuer | 0.9903 | 0.9903 | 0.9903 | 103 |
125
+ | oci | Occitan | 0.9672 | 0.9555 | 0.9613 | 247 |
126
+ | orv | Old East Slavic | 0.9692 | 0.9692 | 0.9692 | 65 |
127
+ | oss | Ossetian | 0.9818 | 0.9926 | 0.9872 | 271 |
128
+ | ota | Ottoman Turkish | 0.9204 | 0.9905 | 0.9541 | 105 |
129
+ | pam | Kapampangan | 0.9865 | 0.9865 | 0.9865 | 74 |
130
+ | pcd | Picard | 0.9552 | 0.9846 | 0.9697 | 65 |
131
+ | pes | Persian | 0.9890 | 0.9890 | 0.9890 | 455 |
132
+ | pms | Piedmontese | 0.8780 | 0.9000 | 0.8889 | 40 |
133
+ | pol | Polish | 0.9848 | 0.9829 | 0.9838 | 526 |
134
+ | por | Portuguese | 0.9687 | 0.9616 | 0.9651 | 547 |
135
+ | prg | Old Prussian | 0.9800 | 0.9800 | 0.9800 | 50 |
136
+ | rhg | Rohingya | 0.9780 | 0.9944 | 0.9861 | 179 |
137
+ | rom | Romani | 0.9302 | 0.8889 | 0.9091 | 45 |
138
+ | ron | Romanian | 0.9826 | 0.9912 | 0.9869 | 457 |
139
+ | run | Kirundi | 0.9914 | 0.9665 | 0.9788 | 239 |
140
+ | rus | Russian | 0.9634 | 0.9814 | 0.9723 | 537 |
141
+ | sah | Yakut | 1.0000 | 0.9600 | 0.9796 | 50 |
142
+ | sat | Santali | 0.9942 | 0.9942 | 0.9942 | 171 |
143
+ | sdh | Southern Kurdish | 0.9423 | 0.9074 | 0.9245 | 54 |
144
+ | shi | Tashelhit | 0.9706 | 0.8980 | 0.9329 | 147 |
145
+ | slk | Slovak | 0.9333 | 0.9380 | 0.9356 | 403 |
146
+ | slv | Slovenian | 0.7018 | 0.8889 | 0.7843 | 45 |
147
+ | sma | Southern Sami | 0.9600 | 0.9600 | 0.9600 | 100 |
148
+ | sme | Northern Sami | 0.9980 | 0.9901 | 0.9940 | 504 |
149
+ | smj | Lule Sami | 0.9820 | 0.9959 | 0.9889 | 493 |
150
+ | smn | Inari Sami | 0.9950 | 0.9900 | 0.9925 | 201 |
151
+ | sms | Skolt Sami | 0.9750 | 0.9848 | 0.9799 | 198 |
152
+ | spa | Spanish | 0.9760 | 0.9601 | 0.9680 | 551 |
153
+ | sqi | Albanian | 0.9762 | 0.9762 | 0.9762 | 126 |
154
+ | srp | Serbian | 0.8367 | 0.8216 | 0.8291 | 499 |
155
+ | swc | Congo Swahili | 0.8727 | 0.8458 | 0.8591 | 454 |
156
+ | swe | Swedish | 0.9819 | 0.9819 | 0.9819 | 994 |
157
+ | swg | Swabian | 0.9694 | 0.9406 | 0.9548 | 101 |
158
+ | swh | Swahili | 0.6798 | 0.7225 | 0.7005 | 191 |
159
+ | tat | Tatar | 0.9791 | 0.9843 | 0.9817 | 381 |
160
+ | tgl | Tagalog | 0.9757 | 0.9710 | 0.9734 | 414 |
161
+ | tha | Thai | 1.0000 | 0.9910 | 0.9955 | 222 |
162
+ | thv | Tahaggart Tamahaq | 0.6552 | 0.7037 | 0.6786 | 27 |
163
+ | tig | Tigre | 1.0000 | 1.0000 | 1.0000 | 181 |
164
+ | tlh | Klingon | 1.0000 | 0.9932 | 0.9966 | 442 |
165
+ | tok | Toki Pona | 1.0000 | 1.0000 | 1.0000 | 495 |
166
+ | tpw | Old Tupi | 0.8929 | 0.9259 | 0.9091 | 27 |
167
+ | tuk | Turkmen | 0.9779 | 0.9603 | 0.9690 | 277 |
168
+ | tur | Turkish | 0.9908 | 0.9541 | 0.9721 | 567 |
169
+ | uig | Uyghur | 0.9966 | 0.9900 | 0.9933 | 300 |
170
+ | ukr | Ukrainian | 0.9831 | 0.9831 | 0.9831 | 534 |
171
+ | urd | Urdu | 1.0000 | 0.9914 | 0.9957 | 116 |
172
+ | uzb | Uzbek | 0.8200 | 0.9318 | 0.8723 | 44 |
173
+ | vie | Vietnamese | 0.9977 | 0.9953 | 0.9965 | 427 |
174
+ | vol | Volapük | 0.9908 | 0.9908 | 0.9908 | 218 |
175
+ | war | Waray | 0.9307 | 0.9691 | 0.9495 | 97 |
176
+ | wuu | Shanghainese | 0.8318 | 0.9036 | 0.8662 | 197 |
177
+ | xal | Kalmyk | 0.9302 | 0.9524 | 0.9412 | 42 |
178
+ | xmf | Mingrelian | 0.7419 | 0.8519 | 0.7931 | 27 |
179
+ | yid | Yiddish | 0.9971 | 1.0000 | 0.9986 | 348 |
180
+ | yue | Cantonese | 0.9004 | 0.9711 | 0.9344 | 242 |
181
+ | zgh | Standard Moroccan Tamazight | 0.9873 | 0.9873 | 0.9873 | 158 |
182
+ | zlm | Malay (Vernacular) | 0.8488 | 0.8902 | 0.8690 | 82 |
183
+ | zsm | Malay | 0.7606 | 0.7883 | 0.7742 | 274 |
184
+ | zza | Zaza | 0.9294 | 0.9634 | 0.9461 | 82 |
185
+ | accuracy | nan | nan | nan | 0.9591 | 44049 |
186
+ | weighted avg | nan | 0.9604 | 0.9591 | 0.9595 | 44049 |
187
+ | macro avg | nan | 0.9371 | 0.9474 | 0.9413 | 44049 |
188
+