-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_language.py
More file actions
147 lines (124 loc) · 8.4 KB
/
Copy pathtest_language.py
File metadata and controls
147 lines (124 loc) · 8.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
"""Определитель английского: ловит транслит и НЕ трогает русский.
Половина случаев - ловушки, и это не для красоты счёта. Промах в одну сторону
и в другую стоят разного. Пропустили английский - человек увидел кракозябры и
повторил фразу. Приняли русскую фразу за английскую - она ушла в переспрос, а
там модель русскую речь не распознаёт, а ПЕРЕВОДИТ: в письмо уедет английский
вместо русского, и человек этого может не заметить. Поэтому ложных
срабатываний тут больше, чем пропусков, и цена им выше.
Английские образцы - настоящий выход GigaAM на английской речи, а не
придуманный: часть снята синтезом Windows TTS, последняя строка - живая
диктовка владельца. Русские - обычные фразы, включая нарочно трудные: голые
заимствования без единого русского окончания.
$env:PYTHONIOENCODING="utf-8"
python test_language.py
"""
import sys
import language as L
def check(name, got, want, fails):
ok = got == want
print(f" {'OK ' if ok else 'НЕТ'} {name}")
if not ok:
print(f" ждали: {want!r}")
print(f" вышло: {got!r}")
fails.append(name)
def en(text, fails, want=True):
"""Проверка одной фразы. Оценку печатаем всегда - по ней видно запас."""
got = L.looks_english(text)
ok = got == want
print(f" {'OK ' if ok else 'НЕТ'} {L.ru_score(text):.2f} {text[:56]!r}")
if not ok:
print(f" ждали {'английский' if want else 'русский'}, "
f"вышло {'английский' if got else 'русский'}")
fails.append(text[:40])
def main() -> int: # noqa: C901 - это список случаев, а не логика
fails: list = []
print("АНГЛИЙСКИЙ - настоящий выход GigaAM на английской речи")
for t in ("ду ю спик энглиш",
"дуис пик инглиш",
"ту ю спик инглиш",
"плиз сенд ми зэ репорт бай фрайдэй",
"пли сент миде репорт бай фрайдай",
"фли сен мид репорт бай фрайдай",
"лэт ас скедул э митин туморроу морнин",
"ай вол кал ю бэк эн терминет",
"кадю плиз чек те докимент эн лат миноу",
"сэнк ю вери матч фор йор халп"):
en(t, fails)
print("\nРУССКИЙ - обычные фразы, трогать нельзя")
for t in ("Стратегическая сессия начинается в пятницу.",
"Он был там вчера и ничего не сказал.",
"Напомни мне позвонить в понедельник утром.",
"Да нет, наверное.",
"Спасибо, до встречи."):
en(t, fails, want=False)
# Главная ловушка. Эти слова русский говорит по-русски, и отдать такую
# фразу в переспрос значит вернуть человеку перевод вместо его же текста.
print("\nЛОВУШКА - заимствования в русской фразе")
for t in ("Окей, я всё понял, сделаю к пятнице.",
"Плиз, отправь мне отчёт.",
"Сорри, я опоздаю на десять минут.",
"Ну окей, давай так и сделаем.",
"Отправь мне ссылку на гитхаб, плиз."):
en(t, fails, want=False)
# Голые основы: ни окончания, ни мягкого знака, ни служебного слова. По
# морфологии они неотличимы от транслита - ровно на этом определитель и
# ломался, пока в нём не появился список заимствований.
print("\nЛОВУШКА - русская фраза из одних заимствований")
for t in ("Ноутбук завис, перезагрузи роутер.",
"Скинь таск в трекер.",
"Залей бэкап на сервер.",
"Апдейт зарелизили, чекни.",
"Бэкенд отдаёт джейсон, фронт падает.",
"Роутер, ноутбук, принтер."):
en(t, fails, want=False)
# Короткое не судим вовсе: на одном-двух словах признаков нет, а
# «Гитхап» - это обычная диктовка владельца, не английская речь.
# Указательные короче четырёх букв: окончания у них незаметные, в списке
# служебных их сперва не было, и «Дай мне ту книгу» уезжала в переспрос.
print("\nЛОВУШКА - указательные и короткие служебные")
for t in ("Дай мне ту книгу.",
"Возьми ту папку со стола.",
"В те дни было проще.",
"Скинь мне ту ссылку.",
"Дай ту флешку, пожалуйста."):
en(t, fails, want=False)
print("\nЛОВУШКА - меньше трёх слов не судим")
for t in ("Гитхап.", "роман?", "окей", "плиз", "Джейсон.",
"Пул реквест.", "ду ю"):
en(t, fails, want=False)
print("\nЛОВУШКА - судить не по чему")
for t in ("", " ", "...", "2026", "Do you speak English?"):
en(t, fails, want=False)
print("\nОЦЕНКА")
check("пусто - считаем своим", L.ru_score(""), 1.0, fails)
check("чистый русский - единица",
L.ru_score("я не знаю что это"), 1.0, fails)
check("чистый транслит - ноль",
L.ru_score("ду ю спик"), 0.0, fails)
check("латиница в счёт не идёт",
L.ru_score("поправь JSON в конфиге"), 1.0, fails)
# Порог отделяет одно от другого с запасом, и запас надо стеречь: сдвинуть
# его случайной правкой списка окончаний легче лёгкого.
check("порог ниже самой русской из английских проб",
L.SURE < L.THRESHOLD, True, fails)
print("\nЗАПАС МЕЖДУ ЯЗЫКАМИ")
worst_en = max(L.ru_score(t) for t in
("ду ю спик энглиш", "дуис пик инглиш",
"плиз сенд ми зэ репорт бай фрайдэй",
"лэт ас скедул э митин туморроу морнин"))
best_ru = min(L.ru_score(t) for t in
("Ноутбук завис, перезагрузи роутер.",
"Бэкенд отдаёт джейсон, фронт падает.",
"Скинь таск в трекер."))
print(f" худшая английская {worst_en:.2f}, лучшая русская {best_ru:.2f}")
check("между языками остался зазор", worst_en < best_ru, True, fails)
print()
if fails:
print(f"ПРОВАЛЕНО: {len(fails)}")
for f in fails:
print(f" - {f}")
return 1
print("ОК")
return 0
if __name__ == "__main__":
sys.exit(main())