Generate langauge training application data with ChatGPT

Введение

У меня всегда был интерес к изучению языков. Несмотря на то, что особыми успехами во владении иностранными языками я никогда не отличался, мне доставляло удовольствие собирать смыслы из кирпичиков слов и проводить разного рода параллели.

Например, приложением Duolingo я пользовался через веб версию еще до появления у меня смартфона.

Duolingo profile

Изучать языки в интерактивном формате достаточно интересно. Плюсом добавляется геймификация и относительно рандомные задания.

Первое языковое приложение

В 2019 году мы с @snchz29 написали бота для VK, который создает сессии из игр “угадай слово”. В пуле было 12 языков, которые, честно говоря, выбирались нами изначально просто наугад.

languages = ['en', 'uk', 'pl', 'fr', 'de', 'it', 'es', 'ar', 'zh-cn', 'ja', 'ko'] 

У игрока была возможность выбрать пару языков из пула и начать бесконечную сессию “вопрос-ответ” с ботом.

Dialog with vk bot

Пул слов был проаннотирован частями речи (сразу оговорюсь, что это были категории из индо-европейской семьи) и варианты ответа выбирались из слов той же части речи, что и загаданное слово.

Создание базы слов

Наибольшую ценность подобных приложений составляет база знаний, которая в случае приложения выше представляла собой массив проаннотированных слов с переводами на разные языки.

Для генерации подобной базы был взят список из ~5000 наиболее частотных слов русского языка с информацией о части речи. Далее мы прогнали этот список через API Google Translate и получили нужный список. Стоит отметить, что в то время для многих пар [слово на русском]:[перевод на язык n] API возвращал либо некорректный ответ, либо просто пустое значение. Несмотря на это, для популярных пар языков бот работал достаточно стабильно и мой личный опыт залипания в самописную игрушку могу оценить исключительно положительно.

Вот пример того, как мы хранили данные:

стать:to become:devenir:um zu werden:divenire:to favorecer:se tornar:变成, :から似合われた:나타난다:стати:zostać:verb

Не могу прокомментировать, что написано на азиатских языках. Машинный перевод такой машинный перевод.

Бота в общий доступ мы так и не выпустили, но неплохо попрактиковались в написании подобных программ. Примечательно, что это было на первом курсе университета. Как много времени уже прошло…

Второй виток самописных игрушек

После года жизни за рубежом, в братской Сербии, я ощутил нехватку чего-то подобного для местного языка. Приложений для изучения сербского не так уж много. По крайней мере, я не нашел сербского (сербо-хорвато-боснийско-черногорско-…) в популярных языковый приложениях. Параллельно с этим росла проблема развития словарного запаса. И если для изучения грамматики я мог посмотреть видео на youtube или полистать учебник, то вокабуляр таким образом расширять гораздо сложнее. К тому же и грамматические правила можно завернуть в более живой формат.

Переварив эту идею, первым делом в голову пришла мысль сделать фронтенд в виде телеграмм бота. Стало примерно понятно с чего начать, как организовать сценарий диалога (стэйт-машину, мы ведь с вами люди образованные, в конце-то концов), какие визуальные элементы добавить (клавиатура с вариантами выбора, эмодзи и пр.), но возник вопрос где взять данные.

Голова моя тыква и последнее оказалось нетривиальным. Пользоваться Google Translate API стало достаточно сложнее и качестве перевода ru-rs и en-rs оставляет желать лучшего. Контекстуальные переводчики вроде Glosbe чаще всего не предоставляют API и использовать их для каких-то больших батч-переводов непросто.

Мытарство мое по поводу поиска контента длилось не долго, ибо не могло пройти и дня без упоминания новых языковых моделей вроде ChatGPT, и понял я, что все не так уж и безнадежно.

Генерируем данные с помощью ChatGPT

Будем использовать языковую модель для генерации языковых данных. Попросим построить таблицу с падежными окончаниями в сербском и русском.

Вот что сгенерировала модель на запрос can you provide examples for serbian and russian as well as noun endings for each case.can you present this as a table?:

Case Serbian Endings Serbian Example Russian Endings Russian Example
Nominative -a (feminine) knjiga (book) -а/-я (feminine) книга (book)
-o (neuter) -о/-е (neuter)
-i (masculine) -й/-ь/-ъ (masculine)
Genitive -e (feminine) knjige (book’s) -ы/-и (feminine) книги (book’s)
-a (neuter) -а/-я (neuter)
-a/i (masculine) -а/-я/-ей (masculine)
Dative -i (feminine) knjizi (to/for book) -е/-у (feminine) книге (to/for book)
-u (neuter) -у/-ю (neuter)
-u/-ima (masculine) -у/-ю/-ам (masculine)
Accusative -u (feminine) knjigu (book) -у/-ю (feminine) книгу (book)
-o (neuter) -о/-е (neuter)
-a/-e (masculine) -а/-я/-й/-ь/-ъ (masculine)
Vocative -o (feminine) knjigo (book) -о/-е (feminine) книга (book)
-o (neuter) -о/-е (neuter)
-i (masculine) -й/-ь/-ъ (masculine)
Locative -i/-u (feminine) knjizi (on/in/at book) -е/-у (feminine) книге (on/in/at book)
-u/-i (neuter) -е/-и (neuter)
-u/-ima (masculine) -е/-ах/-ях (masculine)
Instrumental -om (feminine) knjigom (with book) -ой/-ей (feminine) книгой (with book)
-om (neuter) -ом/-ем (neuter)
-im/-em (masculine) -ом/-ем/-ами (masculine)

Я пользователь-любитель и не знаю всех секретов “промптинга”, но результат получился довольно симпатичный.

Попробуем попросить проспрягать нам самые частотные глаголы can you provide 20 the most frequent serbian verbs, all forms. format as a table:

Infinitive Ja Ti On/ona/ono Mi Vi Oni/one/ona
biti sam si je smo ste su
imati imam imaš ima imamo imate imaju
hteti hoću hoćeš hoće hoćemo hoćete hoće
raditi radim radiš radi radimo radite rade
reći kažem kažeš kaže kažemo kažete kažu
videti vidim vidiš vidi vidimo vidite vide
znati znam znaš zna znamo znate znaju
hteti hoću hoćeš hoće hoćemo hoćete hoće
uraditi uradim uradiš uradi uradimo uradite urade
trebati trebam trebaš treba trebamo trebate trebaju
moći mogu možeš može možemo možete mogu
čuti čujem čuješ čuje čujemo čujete čuju
jesti jedem jedeš jede jedemo jedete jedu
dati dajem daješ daje dajemo dajete daju
pitati pitam pitaš pita pitamo pitate pitaju
voleti volim voliš voli volimo volite vole
govoriti govorim govoriš govori govorimo govorite govore
nositi nosim nosiš nosi nosimo nosite nose

Есть повторения вроде raditi/uraditi, но результат все также неплох. В последующих ответах на тот же запрос встречаются повторы, даже несмотря на условие не повторять глаголы из прошлых ответов, но это можно уже исправить при обработке этих данных.

И что-нибудь совсем попсовое напоследок: EN-RS translation

Замечательно!

Если что-нибудь из этого получится, напишу пост с продолжением. Спасибо, что дочитали до конца.