Pembuatan teks dalam bahasa Rusia berdasarkan templat

Ketika saya baru mulai bekerja pada permainan teks saya, saya memutuskan bahwa salah satu fitur utamanya adalah deskripsi artistik yang indah dari tindakan para karakter. Sebagian saya ingin "menyelamatkan", karena saya tidak tahu bagaimana menjadwalkannya. Menyimpan tidak berfungsi, tetapi ternyata pustaka Python ( github , pypi ) untuk menghasilkan teks, dengan mempertimbangkan ketergantungan kata-kata dan fitur tata bahasa mereka.

Misalnya, dari templat:
[Pahlawan] [melewati | pahlawan] melewati halaman yang tidak mencolok dan tiba-tiba [memperhatikan | pahlawan] anak-anak bermain. Mereka berlari dengan pedang kayu, tongkat dan topeng monster. Tiba-tiba salah satu pemain berhenti, menaruh [mainan | hero.weapon | vn] [hero.weapon | vn] , berteriak: “ [I | pahlawan] [hebat | pahlawan] [pahlawan] ! Dapatkan itu! " - dan bergegas ke "binatang buas". Mereka jatuh ke tanah, melompat lengan dan kaki mereka, dan kemudian berdiri, melepas topeng mereka dan tertawa. [Mendengus | pahlawan] dan [dirinya sendiri | pahlawan] [pahlawan] , tetapi tidak [ memulai | pahlawan] pergi ke si kecil.
Kita bisa mendapatkan teks berikut (mengubah kata-kata tebal):
Hallr berjalan melewati halaman yang tidak mencolok dan tiba-tiba melihat anak-anak bermain. Mereka berlari dengan pedang kayu, tongkat dan topeng monster. Tiba-tiba, salah satu pemain berhenti, mengeluarkan pedang mainan berlapis emas , berteriak: “ Saya Hallr yang hebat ! Dapatkan itu! " - dan bergegas ke "binatang buas". Mereka jatuh ke tanah, melompat lengan dan kaki mereka, dan kemudian berdiri, melepas topeng mereka dan tertawa. Hallr sendiri terkekeh , tetapi tidak pergi ke si kecil.
Atau seperti ini:
Fievara berjalan melewati halaman yang tidak mencolok dan tiba-tiba melihat anak-anak bermain. Mereka berlari dengan pedang kayu, tongkat dan topeng monster. Tiba-tiba salah satu pemain berhenti, mengeluarkan mainan catarrh , berteriak: “ Saya Fievara yang hebat ! Dapatkan itu! " - dan bergegas ke "binatang buas". Mereka jatuh ke tanah, melompat lengan dan kaki mereka, dan kemudian berdiri, melepas topeng mereka dan tertawa. Fievara sendiri mendengus , tetapi tidak pergi ke si kecil.

Pemesanan pasangan
Penafian 1 . Saya bukan ahli bahasa dan perpustakaan ditulis "untuk bekerja", dan bukan "untuk persis sesuai dengan semua aturan bahasa". Karena itu, saya meminta maaf sebelumnya untuk ketidakakuratan dalam terminologi atau interpretasi yang tidak lengkap dari aturan bahasa Rusia.

Penafian 2 . Perpustakaan dikembangkan sekitar 5 tahun yang lalu, sekarang sarana alternatif pembuatan teks dapat muncul (atau tumbuh ke keadaan normal). Misalnya, sesuatu yang menarik mungkin ada dalam perangkat lunak untuk pelokalan.

Tentang kerumitan pembuatan teks


Bahasa Rusia rumit dalam banyak aspeknya. Secara khusus, kata-kata memiliki sejumlah besar bentuk morfologis. Misalnya, kata sifat dapat memiliki bentuk lengkap dan pendek, bervariasi berdasarkan jenis kelamin, jumlah, kasus, animasi dan tingkat perbandingan. Pilihan bentuk tertentu tergantung pada kata-kata lain dalam kalimat. Kami mengatakan "wanita cantik", tetapi "pria cantik". Kata "cantik" dalam hal ini tergantung pada kata "pria" / "wanita" - bentuknya ditentukan oleh jenis kelamin kata utama.

Karenanya, kesulitan dimulai ketika kami mencoba menghubungi seseorang berdasarkan jenis kelaminnya. Saat menyusun teks untuk situs web, surat, permainan, orang harus membuat kata-kata yang sangat rapi (menghindari jenis kelamin pengguna), menulis beberapa teks sekaligus, atau menggunakan bahasa markup dengan berbagai tingkat universalitas.

Saya menginginkan sesuatu yang lebih dari sekadar ketergantungan pada jenis kelamin pemain, dan bahkan agar pengguna sendiri dapat menambahkan teks baru (dan pengguna "rata-rata" cukup buta huruf, seperti yang kita semua tahu :-)). Karena itu, tanpa menemukan perangkat lunak yang tepat, saya memutuskan untuk melakukannya sendiri.

Fitur perpustakaan


UTG (generator teks universal - bukan nama yang sangat sederhana) memungkinkan Anda untuk membuat template untuk menghasilkan teks dengan berikut:

  • variabel (mis. nama karakter);
  • ketergantungan kata pada variabel (misalnya, kata sifat pada kata benda);
  • Ketergantungan beberapa variabel pada orang lain;
  • Properti eksplisit dari kata-kata dan variabel (misalnya, Anda dapat menentukan bahwa nama karakter dimasukkan dalam huruf induk);

Saat menghasilkan teks dari templat:

  • Properti yang diperlukan dari kata utama ditransfer ke kata-kata tergantung. Misalnya, jenis kelamin kata benda ditransfer ke kata sifat.
  • Bentuk kata-kata dependen konsisten dengan angka (dengan mempertimbangkan bentuk kata-kata dependen).
  • Preposisi dimodifikasi jika perlu (misalnya, tentang saya / tentang Anda), dalih untuk ini harus dihapus.

Selain itu diterapkan:

  • Kamus untuk menyimpan kata-kata yang diperlukan.
  • Repositori templat untuk menyimpannya dengan mengetik dan memilih yang acak.

Perpustakaan "tahu" tentang keberadaan kata benda, kata sifat, kata ganti, kata kerja, partisipatif, angka, preposisi, dan "kutipan" (teks yang tidak dapat diubah).

Properti kata-kata berikut ini diperhitungkan: bagian dari pidato, kasus, animasi, jumlah, jenis kelamin, bentuk kata kerja, waktu, orang, jenis, kategori kata sifat, derajat kata sifat, kategori kata ganti, janji, bentuk preposisi, bentuk kata sifat, bentuk partisip, bentuk kata benda ( selain bentuk normal, kata benda memiliki hitungan ).

Format template dan contoh penggunaan


Mari kita lihat templat sederhana:
Kemarin [mob] [digigit | mob] [hero | ext] .
Bergantung pada nilai-nilai variabel, templat dapat muncul sebagai frasa seperti itu:
Kemarin, Hallena sedikit hyena.
begini dan begitu:
Kunang-kunang menggigit hantu kemarin.
Pertimbangkan templat lebih detail:

  • - teks biasa.
  • [mob] - sebuah variabel, bukannya nama monster itu diganti.
  • [|mob] - kata yang bergantung pada variabel, bagian dari propertinya akan berubah tergantung pada properti dari nama monster (misalnya, angka). Generator teks secara otomatis mengenali properti dari bentuk kata dan mencoba untuk menyimpannya (misalnya, waktu yang telah berlalu akan dikenali dan disimpan, sehingga Anda tidak perlu menentukannya).
  • [hero|] - sebuah variabel, alih-alih nama pahlawannya diganti. Selain itu diindikasikan bahwa nama harus dalam kasus akusatif.

Lebih banyak contoh template.
Beberapa contoh teknis dapat ditemukan dalam tes .

Jika Anda tertarik pada lebih banyak contoh, Anda dapat melihatnya di situs web mainan. Tautan ke sana dapat ditemukan dengan mencari-cari di profil saya, atau dengan menulis secara pribadi.

Baik variabel dan kata-kata dependen dalam template disorot secara identik dan memiliki format berikut:

  • [ - membuka braket persegi.
  • - tergantung kata atau pengenal variabel. Generator pertama memeriksa keberadaan variabel dengan nama ini, jika tidak ada variabel seperti itu, kata tersebut dicari dalam kamus.
  • | - batang vertikal - pemisah, diperlukan jika kita menentukan properti tambahan.
  • - variabel tempat bentuk kata bergantung mungkin tidak ada.
  • | - batang vertikal - pemisah, diperlukan jika kita menentukan properti tambahan.
  • - deskripsi bentuk kata yang diperlukan (kasus, jenis kelamin, dan sebagainya). Daftar mereka dapat ditemukan di halaman proyek di github dan pypi.
  • ] Apakah braket kotak penutup.

Anda dapat menentukan properti tambahan apa pun sesuka Anda, mereka akan diterapkan dalam urutan definisi, misalnya:

[ 1| 2|,| 3|,,]

Dalam kebanyakan kasus, format berikut sudah cukup:

  • [] - masukkan variabel dalam bentuk normal (misalnya, kata benda dalam kasus nominatif singular).
  • [|] - masukkan variabel dengan properti yang ditentukan.
  • [|] - masukkan kata, cocokkan dengan variabel (misalnya, kata sifat "cantik" dengan kata benda dalam jenis kelamin dan huruf besar-kecil).
  • [||] - masukkan kata, cocokkan dengan variabel dan tentukan properti tambahan.

Harap dicatat:

  • Menentukan properti untuk kata dan variabel hanya valid di tempat penyisipan, oleh karena itu, untuk mendapatkan frasa "pahlawan cantik" kita harus menunjukkan kasus akusatif secara eksplisit untuk dua kata: [|hero|] [hero|] .
  • Generator teks dapat “menebak” properti kata dengan bentuknya, misalnya, dalam frasa [hero] [|hero] Anda dapat menghilangkan bentuk kata kerja dari kata kerja tersebut.
  • Properti yang ditentukan nanti akan menimpa properti yang ditentukan sebelumnya. Misalnya, dalam frasa [|hero] [hero|] , akusatif kata sifat tidak akan ditetapkan, karena akan diganti dengan kasus nominatif dari pahlawan variabel.
  • Daftar properti kata dapat ditemukan di halaman perpustakaan di github dan pypi.

Contoh kode
Diperlukan Python 3

Instalasi

 pip install utg python -m unittest discover utg 

Kode

 from utg import relations as r from utg import dictionary from utg import words from utg import templates from utg import constructors ####################################### #     ####################################### coins_forms = [#   '', '', '', '', '', '', #   '', '', '', '', '', '', #   (  , #     autofill_missed_forms) '', '', '', '', '', ''] # : ,   coins_properties = words.Properties(r.ANIMALITY.INANIMATE, r.GENDER.FEMININE) #      ,    coins_word = words.Word(type=r.WORD_TYPE.NOUN, forms=coins_forms, properties=coins_properties) #        . #      , #          : # - utg.data.WORDS_CACHES # - utg.data.INVERTED_WORDS_CACHES ############################## #     ############################## #       # (     utg.data.WORDS_CACHES[r.WORD_TYPE.VERB]) action_forms = (['', '', '', '', ''] + [''] * 15) # : ,   action_properties = words.Properties(r.ASPECT.PERFECTIVE, r.VOICE.DIRECT) action_word = words.Word(type=r.WORD_TYPE.VERB, forms=action_forms, properties=action_properties) #       (  ) action_word.autofill_missed_forms() ############################################## #       ############################################## test_dictionary = dictionary.Dictionary(words=[coins_word, action_word]) ################ #   ################ template = templates.Template() # externals —  ,      template.parse('[Npc] [|npc] [hero|] [coins] [|coins|].', externals=('hero', 'npc', 'coins')) ############################## #    ############################## hero_forms = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''] # : ,   hero_properties = words.Properties(r.ANIMALITY.ANIMATE, r.GENDER.MASCULINE) hero = words.WordForm(words.Word(type=r.WORD_TYPE.NOUN, forms=hero_forms, properties=hero_properties)) npc_forms = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''] # : ,   npc_properties = words.Properties(r.ANIMALITY.ANIMATE, r.GENDER.FEMININE) npc = words.WordForm(words.Word(type=r.WORD_TYPE.NOUN, forms=npc_forms, properties=npc_properties)) ########################## #   ########################## result = template.substitute(externals={'hero': hero, 'npc': npc, 'coins': constructors.construct_integer(125)}, dictionary=test_dictionary) ########################## #  ########################## result == '   125 .' 

Tentang kamus


Seperti yang mungkin Anda perhatikan, UTG membutuhkan pembentukan kamus. Ini dilakukan "dengan tangan" karena pada saat pengembangan:

  • Saya tidak menemukan kamus morfologi kualitatif yang dapat diakses secara umum.
  • Perpustakaan pymorphy masih versi pertama dan cukup sering menyipit (terutama dengan kasus akusatif), itulah sebabnya saya harus meninggalkannya.

Jika Anda ingin menggunakan generator dengan banyak kata, sebelum Anda mengendarainya secara manual, coba gunakan pymorphy2, atau cari kamus yang sudah jadi dan ekspor dari itu.

Total


Semoga perpustakaan ini bermanfaat.

Jika Anda memiliki ide untuk pengembangannya (atau bahkan lebih baik, keinginan untuk berpartisipasi di dalamnya) - tulis pesan pribadi, tarik permintaan, kirim bug ke github.

Source: https://habr.com/ru/post/id471278/


All Articles