Hasilkan kalimat yang bisa dimengerti

55

Masalah:

Hasilkan kalimat yang bisa dibaca dan dipahami. Itu harus mengandung subjek, kata kerja, dan objek, dan bentuk kata serta jamak harus cocok. Program ini juga harus dapat menghasilkan beberapa kalimat yang berbeda untuk memenuhi syarat.

Aturan:

  • Pengkodean kalimat-kalimat keras tidak diizinkan, dan juga tidak membacanya langsung dari file (saya sedang melihat Anda, hapus klasifikasi)
  • Anda dapat memiliki sejumlah daftar kata
  • Kirim contoh atau 2 kalimat yang telah dihasilkan oleh program Anda
  • Bahasa apa pun diterima
  • Ini adalah , jadi jawaban yang paling populer menang
Dokter
sumber
7
Saya pikir itu jelas dari beberapa jawaban ( MatLab saya melihat Anda) bahwa Anda harus memodifikasi aturan sedemikian sehingga penambangan data tidak diperbolehkan untuk menarik kata-kata berturut-turut dari sumber mana pun.
Carl Witthoft
Sementara saya menjadi sok pintar: karena ini murni kontes popularitas, seseorang harus memposting jpg HotModelBikini. Itu akan mendapatkan lebih banyak suara daripada apa pun.
Carl Witthoft
7
Saya akan mendukung siapa pun yang menggunakan pengulangan "kerbau" atau "ikan" sebagai contoh kalimat!
7
Sebagian besar jawaban di sini adalah milikku, kalimat lengkap dari sumber teks, atau hasilkan yang tidak memenuhi kriteria. Bagi saya, kedua pendekatan itu tampaknya bertentangan dengan semangat pertanyaan! Jika seseorang benar-benar ingin mengesankan, dapatkah saya menyarankan program yang dimulai dengan seperangkat struktur kalimat yang valid seperti [Adjective] [pl. noun] [verb] [adjective] [pl. noun]dan menarik dari kamus nyata (mungkin menggunakan salah satu API Kamus yang tersedia di luar sana) untuk mengisi kekosongan? Saya akan menulis sendiri jika ada waktu luang! :( Lagi pula ...Lazy Developers Write Lousy Programs.
Brian Lacy
1
@ Murniferret daftar Kata akan menjadi daftar kata-kata individual. Hard coding akan menjadi daftar kalimat lengkap. Dengan daftar kata, Anda biasanya memerlukan beberapa logika dalam program untuk mengumpulkan kalimat lengkap. Dengan kalimat kode keras, pada dasarnya Anda hanya perlu pernyataan cetak.
8bittree

Jawaban:

87

Pesta

fgrep '/* ' /usr/src/linux* -r | cut -d '*' -f 2 | head -$((RANDOM)) | tail -1

Persyaratan: sumber kernel linux dipasang di / usr / src

Ini mengeluarkan komentar acak dari sumber kernel. Apakah kalimat-kalimat itu benar-benar dapat dimengerti, masih terbuka untuk diperdebatkan.

Contoh output aktual:

  • end of packet for rx
  • I don't know what to do
  • 256 byte packet data buffer.
  • The rest of this junk is to help gdb figure out what goes where
  • Convert page list back to physical addresses, what a mess.
  • ???
  • Only Sun can take such nice parts and fuck up the programming interface
Kerusuhan
sumber
12
Bagus Anda harus menarik semuanya dan mengirimkannya sebagai fortunebasis data resmi .
Jason C
18
"???" komentar terbaik yang pernah ada
Ray
4
Bukankah aturan pertama 'juga tidak membacanya langsung dari file' dilanggar?
kuldeep.kamboj
6
Saya akan mengatakan mencari melalui kode sumber sistem dan memfilter teks dari komentar tidak benar-benar dihitung sebagai "membaca langsung".
Kerusuhan
7
dan Slave Overflow. nama yang bagus untuk situs web SE
TheDoctor
95

Matlab

why

contoh output:

>> why
The programmer suggested it.
>> why
To please a very terrified and smart and tall engineer.
>> why
The tall system manager obeyed some engineer.
>> why
He wanted it that way.

[Ini adalah salah satu telur paskah Matlab]

EDIT: Anda dapat melihat kode fungsi ini di sini: why.m

Elisa
sumber
3
Anda dapat melihat kode di sini: opg1.ucsd.edu/~sio221/SIO_221A_2009/SIO_221_Data/Matlab5/…
Elisha
8
Contoh kedua bukan kalimat. Ini adalah frase infinitif.
wchargin
2
Harus dari jawaban di sini menghasilkan tidak hanya kalimat (lihat jawaban tinggi lainnya misalnya). Tugas tidak mengatakan itu harus membuat hanya kalimat, tetapi mengatakan itu harus mampu menghasilkan kalimat.
Elisha
51

PHP

Dengan waktu yang cukup, ini akan menghasilkan semua literatur, masa lalu, sekarang dan masa depan. Aturan tidak menyebutkan bahwa tidak ada teks lain yang dapat diproduksi.

String 'TOS...'menyediakan frekuensi skala logaritmik dari huruf-huruf tersebut agar lebih mendekati bahasa Inggris. Ini digunakan untuk menghasilkan string yang lebih besar dengan perkiraan frekuensi huruf relatif.

$a = ord('A');
$s = '';

foreach (str_split('TOSRWQPPUALRQTTRGUUUQMMLMFZ') as $i=>$f)
{
    if (!ctype_alpha($c = chr($a + $i)))
        $c = ' ';
    $s .= str_repeat($c, round(exp((ord($f) - $a) / 3.976)));
}

$l = strlen($s) - 1;
for (;;)
    echo substr($s, mt_rand(0, $l), 1);

Menjalankannya, saya telah menemukan permata sastra seperti:

  • GO NOW- Anda sebagai subjek tersirat.
  • IM AOK - Saya A-OK
  • IM FDR - Saya F (ranklin) D (eleano) R (oosevelt)

Juga, banyak ejekan untuk secara singkat mengungkapkan ketidaksenangan dengan situasi saat ini. [Beberapa surat dihapus.]

  • F**K
  • S**T

Selain itu, berikut ini menggunakan penskalaan fine-tuned:

  • IS IT ON
  • I AM STU
  • I SEE HTML

sumber
60
Ya, sekelompok monyet bisa melakukan hal yang sama!
Tim S.
11
Saya suka! Sekarang buatlah program yang memproses surat-surat yang keluar dari situ dan temukan kalimat yang bisa dimengerti! :)
TheDoctor
2
+1 - setiap peluang untuk mengotomatisasi bagian penemuan? Tugas itu tampaknya menghasilkan kalimat * satu * (?). BTW: berapa banyak waktu yang Anda habiskan;)
Wolf
20
Bagaimana Anda mendapatkan F**Kdan S**Tasalkan tidak ada *di dalam 'ABCDEFGHIJKMLNOPQRSTUVWXYZ '?
glglgl
3
@Ypnypn - 'TOS...'String mewakili frekuensi setiap huruf dalam skala logaritmik. Begitu juga Amemiliki frekuensi T, Bmemiliki frekuensi O. Jmemiliki frekuensi terendah Ayang diterjemahkan menjadi 0, di mana log terbaliknya adalah 1. Karakter terakhir adalah spasi, yang memiliki frekuensi Z, atau bulat (exp (25 / 3.976)) = 538, sehingga spasi terjadi 538 kali lebih sering daripada J. Hanya berpikir itu menempatkan twist pada masalah monyet-at-a-mesin tik .
42

C

char*strerror(),i;main(){for(;--i;)puts(strerror(i));}

Contoh output:

Perangkat lunak yang menyebabkan koneksi batal
Panggilan sistem yang terputus harus dimulai kembali

Ada juga banyak output kalimat yang valid yang tidak memiliki subjek, kata kerja dan objek:


File waktu kedaluwarsa ada

ecatmur
sumber
bagaimana dan kapan ini berakhir? (Ya, tapi saya tidak mengerti mengapa)
phil294
1
@ Blauhirn kondisi terminasi loop --ibernilai false ketika i(variabel tipe chardengan nilai awal 0) mencapai 0 lagi. Jika chartidak ditandatangani (misalnya ARM), iakan segera membungkus ke nilai terbesarnya (biasanya 255) dan menghitung mundur ke 0. Jika charditandatangani (sebagian besar sistem Intel) perilaku ini secara tegas tidak terdefinisi, tetapi biasanya setelah mencapai nilai minimum ( biasanya -128) itu akan membungkus maksimum (biasanya 127) dan menghitung mundur ke 0. Jadi program biasanya akan mencetak 256 baris secara total.
ecatmur
37

Jawa

Menarik kalimat intro dari artikel Wikipedia acak:

import java.io.InputStream;
import java.net.URL;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;

public class RandomSentence {
    public static void main (String[] args) throws Exception {
        String sentence;
        do {
            InputStream in = new URL("https://en.wikipedia.org/wiki/Special:Random").openStream();
            Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(in);
            String intro = doc.getElementsByTagName("p").item(0).getTextContent();
            sentence = intro.replaceAll("\\([^(]*\\) *", "").replaceAll("\\[[^\\[]*\\]", "").split("\\.( +[A-Z0-9]|$)")[0];
        } while (sentence.endsWith(":") || sentence.length() < 30 || sentence.contains("?"));
        System.out.println(sentence + ".");
    }
}

Terkadang Anda beruntung; Saya mencoba meminimalkan ini dengan menetapkan panjang kalimat minimum dan menyaring kalimat yang diakhiri dengan ":" (semua halaman disambiguasi memulai dengan cara itu) atau mengandung "?" (Tampaknya ada banyak artikel dengan info yang tidak diketahui yang belum terselesaikan ditandai oleh tanda tanya). Batas kalimat adalah periode yang diikuti oleh spasi putih diikuti oleh angka atau huruf kapital.

Saya juga memfilter teks dalam tanda kurung (hasilnya masih berupa kalimat yang valid) untuk mencoba dan menghapus beberapa periode yang bukan batas kalimat. Saya menyaring kurung kurawal untuk menghapus nomor kutipan sumber. Contoh:

  • Idle Cure adalah band rock arena dari Long Beach, California.
  • Pemfokusan diri adalah proses optik non-linear yang disebabkan oleh perubahan indeks bias material yang terpapar radiasi elektromagnetik yang intens.
  • TB10Cs4H3 adalah anggota dari molekul RNA non-coding mirip H / ACA yang memandu situs modifikasi uridin menjadi pseudouridin RNA substrat.
  • Ram Liar Berkepala enam dalam mitologi Sumeria adalah salah satu Pahlawan yang dibunuh oleh Ninurta, dewa pelindung Lagash, di Irak kuno.
  • Sugar daddy adalah istilah umum untuk pria yang menawarkan untuk mendukung wanita atau pria yang lebih muda setelah menjalin hubungan yang biasanya seksual.
  • Gereja Old Bethel United Methodist terletak di 222 Calhoun St., Charleston, Carolina Selatan.
  • Douglas Geers adalah komposer Amerika.

Jika Anda melihat ada masalah tata bahasa, itu salah Anda karena tidak menjadi editor Wikipedia yang rajin! ;-)

Jason C
sumber
4
Pasti ada perbedaan antara "valid" dan "dimengerti". Saya punya beberapa pseudouridines RNA substrat untuk Anda di sini, sayang.
Jason C
1
Saya mendapatkan ini saat pertama kali saya menjalankannya: Echinolittorina africana / Litorina africana Philippi, 1847 / Litorina decollata Philippi, 1847 / Littorina africana / Littorina perplexa Turton, 1932 / Nodilittorina africana./ Tampaknya ada beberapa halaman Wiki yang harus Anda kecualikan dari Anda. Cari! ;) Ha ha! OMG, kedua kalinya saya menjalankannya, mengembalikan garis dari halaman Wiki Mikhail Gorbachev. Siapa yang berbagi nama depan saya. Cukup aneh.
mikhailcazi
2
Tanda '/' sebenarnya tidak ada di sana! Haha: PI menggunakannya untuk mewakili baris baru. Mungkin saya harus menggunakan \ n. Itu dari sini: en.wikipedia.org/wiki/Afrolittorina_africana . Tabel di sebelah kanan, dengan sinonim :) Bagaimanapun, itu bukan kesan buruk jadi jangan khawatir, karena hal Mikhail Gorbachev itu cukup keren. Dan semua kalimat setelah itu normal.
mikhailcazi
2
Anda dapat menemukan jawaban Fisika ini sebagai teman pengguna baru yang menarik, dari salah satu artikel tersebut.
EP
2
Ini mungkin salah satu aspek umum tetapi sangat tidak intuitif dari probabilitas: peristiwa sekali dalam sejuta bisa sangat umum di dunia dengan miliaran orang. Yang mengatakan, saya tidak yakin apa yang akan dikatakan analisis formal. Saya juga cukup terkejut! Anda mungkin memperhatikan bahwa tidak ada 'lelaki lain' yang terlibat.
EP
34

Soooo ... Karena ini adalah , saya bersenang-senang dengan evaldan dengan berbagai fungsi. Pada dasarnya saya menghasilkan angka acak dan kemudian menjalankan fungsi acak berdasarkan nomor itu (di wajah Anda,! switch) Via eval.

PHP, ~ 9k keluaran yang valid

<?php

//Subjects
function s1(){ echo "I "; $m = rand(1,20); eval ("v".$m."(0);");}
function s2(){ echo "You "; $m = rand(1,20); eval ("v".$m."(0);");}
function s3(){ echo "He "; $m = rand(1,20); eval ("v".$m."(1);");}
function s4(){ echo "She "; $m = rand(1,20); eval ("v".$m."(1);");}
function s5(){ echo "We "; $m = rand(1,20); eval ("v".$m."(0);");}
function s6(){ echo "They "; $m = rand(1,20); eval ("v".$m."(0);");}

//Verbs
function v1($n){ echo "want"; if($n==1)echo"s"; echo " to "; $z = rand(1,10); eval ("a".$z."();");}
function v2($n){ echo "need"; if($n==1)echo"s"; echo " to "; $z = rand(1,10); eval ("a".$z."();");}
function v3($n){ echo "ha"; if($n==1){echo"s";}else{echo"ve";} echo " to "; $z = rand(1,10); eval ("a".$z."();");}
function v4($n){ echo "wanted to "; $z = rand(1,10); eval ("a".$z."();");}
function v5($n){ echo "needed to "; $z = rand(1,10); eval ("a".$z."();");}
function v6($n){ echo "had to "; $z = rand(1,10); eval ("a".$z."();");}
function v7($n){ echo "eat"; if($n==1)echo"s"; echo " "; $w = rand(1,20); eval ("o".$w."();");}
function v8($n){ echo "think"; if($n==1)echo"s"; echo " about "; $w = rand(1,20); eval ("o".$w."();");}
function v9($n){ echo "ate "; $w = rand(1,20); eval ("o".$w."();");}
function v10($n){ echo "thought about "; $w = rand(1,20); eval ("o".$w."();");}
function v11($n){ echo "draw"; if($n==1)echo"s"; echo " "; $w = rand(1,20); eval ("o".$w."();");}
function v12($n){ echo "drew "; $w = rand(1,20); eval ("o".$w."();");}
function v13($n){ echo "smell"; if($n==1)echo"s"; echo " like "; $w = rand(1,20); eval ("o".$w."();");}
function v14($n){ echo "shot "; $w = rand(1,20); eval ("o".$w."();");}
function v15($n){ echo "destroy"; if($n==1)echo"s"; echo " "; $w = rand(1,20); eval ("o".$w."();");}
function v16($n){ echo "destroyed "; $w = rand(1,20); eval ("o".$w."();");}
function v17($n){ echo "melt"; if($n==1)echo"s"; echo " "; $w = rand(1,20); eval ("o".$w."();");}
function v18($n){ echo "saw "; $w = rand(1,20); eval ("o".$w."();");}
function v19($n){ echo "ha"; if($n==1){echo"s";}else{echo"ve";} echo " "; $w = rand(1,20); eval ("o".$w."();");}
function v20($n){ echo "had "; $w = rand(1,20); eval ("o".$w."();");}

//Auxiliaries
function a1(){ echo "punch "; $w = rand(1,20); eval ("o".$w."();");}
function a2(){ echo "drive "; $w = rand(1,20); eval ("o".$w."();");}
function a3(){ echo "mount "; $w = rand(1,20); eval ("o".$w."();");}
function a4(){ echo "see "; $w = rand(1,20); eval ("o".$w."();");}
function a5(){ echo "have "; $w = rand(1,20); eval ("o".$w."();");}
function a6(){ echo "eat "; $w = rand(1,20); eval ("o".$w."();");}
function a7(){ echo "stun "; $w = rand(1,20); eval ("o".$w."();");}
function a8(){ echo "kiss "; $w = rand(1,20); eval ("o".$w."();");}
function a9(){ echo "Ted "; $w = rand(1,20); eval ("o".$w."();");} //See "How I met Your Mother" for further informations :)
function a10(){ echo "blow "; $w = rand(1,20); eval ("o".$w."();");}

//Objects
function o1(){ echo "a cow!<br>";}
function o2(){ echo "a meatball!<br>";} 
function o3(){ echo "a car!<br>";} 
function o4(){ echo "shoes!<br>";} 
function o5(){ echo "pigs!<br>";} 
function o6(){ echo "a telephone!<br>";} 
function o7(){ echo "some bottles of water!<br>";} 
function o8(){ echo "a laptop!<br>";} 
function o9(){ echo "my shorts!<br>";} //Quote needed
function o10(){ echo "anchovies!<br>";}
function o11(){ echo "an alarm clock!<br>";}
function o12(){ echo "every second!<br>";}
function o13(){ echo "until the end!<br>";}
function o14(){ echo "sitting!<br>";}
function o15(){ echo "a sword!<br>";}
function o16(){ echo "fire!<br>";}
function o17(){ echo "the dust!<br>";}
function o18(){ echo "in the bedroom!<br>";}
function o19(){ echo "a poor ant!<br>";}
function o20(){ echo "a pencil!<br>";}

//Testing
$n = rand(1,6); eval ("s".$n."();");
$n = rand(1,6); eval ("s".$n."();");
$n = rand(1,6); eval ("s".$n."();");
$n = rand(1,6); eval ("s".$n."();");

?>

Beberapa output ...

She draws a sword!
They thought about sitting!
You eat my shorts!
He wanted to Ted a cow!
You want to mount a poor ant!
She smells like anchovies!
He wanted to have shoes!
They wanted to see a pencil!
Vereos
sumber
@ nyuszika7h, PHP_EOLhanya pernah sama dengan \natau \r\n, tergantung pada sistem operasi, tetapi tidak pernah <br>atau serupa.
timmyRS
@timmyRS Ya, Anda benar, ini adalah komentar lama, saya tidak tahu mengapa saya menulisnya saat itu.
nyuszika7h
33

PHP + Project Gutenberg

Saya menulis skrip PHP yang mengubah dokumen teks biasa menjadi satu set kata bigrams , yang kemudian digunakan untuk menghasilkan kalimat acak. Berikut adalah beberapa contoh yang lebih baik yang dihasilkan dari keseluruhan versi teks pidato Patrick "Give Me Liberty Or Give Me Death" Patrick , termasuk cetak kecil Project Gutenberg:

  • Proyek Gutenberg Eteks bangsa, dan perbudakan!

  • Kami mohon maaf atas peringatan ke-200 Cetak Kecil ini!

  • ANDA TIDAK MEMILIKI TIDAK ADA JAMINAN LAINNYA DARI JENIS APA PUN, EKSPRESI ATAU KERUSAKAN INSIDENTAL, Tetapi bagi saya, kematian!

Anda dapat mencobanya sendiri di sini. Perbarui halaman untuk kumpulan kalimat baru.

Jika Anda ingin menjalankan sendiri kode sumbernya, jangan lupa memuat $src_textdengan teks biasa yang Anda pilih.

<html>
<head>
<title>Give Me Liberty Or Give Me Death</title>
<style>
body { margin:4em 6em; text-align:center; background-color:#feb; }
h1 { font-weight:normal; font-size:2em; margin-bottom:2em; }
blockquote { font-style:italic; }
</style>
</head>
<body>
<h1>A collection of quotes randomly generated from Patrick Henry's speech
<a href="http://www.gutenberg.org/ebooks/6">Give Me Liberty Or Give Me Death</a>
(and its accompanying Project Gutenberg blurb).</h1>
<?php

/* Give Me Liberty Or Give Me Death */
/* Plain text available from http://www.gutenberg.org/ebooks/6 */
$src_text = file_get_contents('libertyordeath.txt');

$bigrams = array();
$openers = array();
$loc = 0;
$new_sentence = true;
$last = false;
while (preg_match('/\'?\w+[^\s\[\]\*\(\)"#@]*/',$src_text,$matches,PREG_OFFSET_CAPTURE,$loc)) {
  $w = $matches[0][0];
  $loc = $matches[0][1]+strlen($w);
  $bareword = preg_replace('/\W/','',$w);
  if ($last) {
    if (!isset($bigrams[$last][$w])) $bigrams[$last][$w] = 1;
    else $bigrams[$last][$w]++;
  }
  if (!isset($bigrams[$bareword])) $bigrams[$bareword] = array();
  $last = $bareword;
  if ($new_sentence && preg_match('/^[A-Z]/',$w)) {
    if (!isset($openers[$w])) $openers[$w] = 1;
    else $openers[$w]++;
    $new_sentence = false;
  }
  if (ends_sentence($w)) {
    $new_sentence = true;
    $last = false;
  }
}

/* Now generate ten random sentences */

for ($ns=0; $ns<10; $ns++) {

  echo "<blockquote><p>";

  /* Choose a starting word */

  $sum = 0;
  foreach ($openers as $w=>$c) $sum += $c;
  $r = mt_rand(0,$sum);
  foreach ($openers as $w=>$c) {
    $r -= $c;
    if ($r<=0) break;
  }

  /* Barf out additional words until end of sentence reached */

  while(1) {
    echo "$w ";
    if (ends_sentence($w)) break;
    $bareword = preg_replace('/\W/','',$w);
    $sum = 0;
    foreach ($bigrams[$bareword] as $w=>$c) $sum += $c;
    $r = mt_rand(0,$sum);
    foreach ($bigrams[$bareword] as $w=>$c) {
      $r -= $c;
      if ($r<=0) break;
    }
  }

  echo "</p></blockquote>\n";
}

function ends_sentence($w) {
  if (!preg_match('/[\.\?!]$/',$w)) return false;
  if (preg_match('/^(\w|St|Mr|Ms|Mrs|Messrs|i\.e|e\.g|etc|Rd)\./i',$w)) return false;
  return true;
}

?>
</body>
</html>
osifrque melengking
sumber
+10 Yang ini benar-benar memaku semangat tantangan! Saya tidak dapat menemukannya sekarang tetapi dulu ada generator kalimat berbasis Google online yang bekerja dengan cara yang sama, tetapi bigrams (atau opsional n-gram lebih besar) berasal dari hasil pencarian Google dengan mencari kata dan mengamati apa yang mengikutinya dalam cuplikan pratinjau hasil pencarian. Mungkin saya akan membuatnya kembali dan mempostingnya di sini.
Jason C
Bagaimana dengan yang ini! "Tuan, kami menemukan yang senang telah meningkatkan kontes." Atau yang ini! "Mereka memberi tahu kami pengembalian uang dari momen mengerikan untuk memperbaiki bagian Etext 6 Date terakhir diperbarui: 5 Mei 2005 Dirilis secara resmi hanya untuk pertempuran kami."
Hosch250
1
But for me, death!: DI berharap semua lisensi / perjanjian berakhir dengan kuat.
Navin
Haha, "Dibebaskan secara resmi untuk pertempuran kita sendiri."
Jason C
1
Saya mendapat "Tidak ada." :(
TheNumberOne
29

Python

Entri ini memilih kata-kata dari kamus seluruh sistem. Ini mengambil keuntungan dari fakta bahwa Anda dapat membuat sebagian besar kata benda menjadi kata kerja dan sebaliknya. Ini menggunakan beberapa heuristik untuk mengklasifikasikan kata-kata dan menghindari ketidakmungkinan yang jelas.

Ini menghasilkan beberapa pernyataan yang hampir waras:

The snigger westernizes the bacteriologist.
A drizzle stoked the sentiments.

Banyak yang gila:

Tipper's orthopaedic knitwear plates a payroll.
A fibula teletypewritered a yogi.
The protozoan's spiralling skydive coats this veterinarian

Dan banyak hal yang terdengar seperti Monty Python membuat sindiran cabul:

That rolling indictment tarries some bang's bulge.
Some inflammatory tush's intermarriage sextants some postman.
Some pentagon's manufacturer squeaked the wolverine.
A disagreeable participant is entertaining my optimized spoonful.

Versi 3 telah dimodifikasi untuk mengambil file teks apa pun sebagai input:

$ man python | python words.py
The disabled comma-separated source is using those wizards at exit.
$ cat COPYING | python words.py  #GPL
My user accord actions a gnu of software.
$ cat pg2591.txt | python words.py #Grimm's Fairy Tales 
Some bargain receives my threepence.
Any wrong worms your world.
$ cat words.py | python words.py #self reflection
Your filter_possesive not_nouned those prepositions.
$ ls /usr/bin | python words.py  #directory lists
Their dropbox funziped an arch.

Kode (versi 3) :

import random
import string
import sys
import re

#words = open("/usr/share/dict/words").readlines()
words = re.sub("[]:;.,:?!<>{}()|=\"`[]",' ',sys.stdin.read(),flags=re.M).split()
words = list(set(words))

articles=('','a ','the ','some ','this ','that ','my ','any ','your ','their ',
             'all ','more '
             'an ') #an must be last
pl_articles=('','some ','those ','many ','the ','these ')
prepositions = ('of','by','to','for','from','in','with','on','which','when','at',
                     'into','as','if','near')
conjunctions = ('and','or','but')
verbs = ('is','are','was', 'be','do','came','been','had','have')
pronouns_s = ('he','she','it','we','you')
pronouns_o = ('him','her','them')

possesive=False
modifiers=0
use_prep = None

MAX_MODIFIERS=2

def is_modifier(w):
    return ("'" in w or
        w[-2:] in ('ry','ed','er','ic','al')  or
        w[-3:] in ('ing','est','ble','ous') or
        w[-4:] in ('less','ical','mmon') )

def is_verb(w):
    return (w in verbs or 
        w[-2:] in ('ed',) or
        w[-3:] in ('ing','ize') )

def is_article(w):
    return w+' ' in articles or w+' ' in pl_articles

def is_conjunction(w):
    return w in conjunctions

def filter_possesive(w,always=False): 
    global possesive
    #allow only one
    result = True if "'" in w else False
    if result:
        if always: return False
        if not possesive: 
            possesive = True
            return False
    return result

def is_preposition(w):
    global use_prep
    if w in prepositions:
        use_prep = w
        return True
    return False

def is_adverb(w):
    return w[-2:]=='ly'

def is_gerund(w):
    return w[-3:]=='ing'

def is_plural(w):
    return w[-1]=='s'

def not_verb(w):
    return (w in ('you','they','our','yes') or 
              w[-4:] in ('ness','such') or
              w in pronouns_o or w in pronouns_s
              )

def not_noun(w):
    return (w in verbs)


def getword():
    while True:
        w=words[random.randrange(len(words))].rstrip()
        if w[0] in string.ascii_uppercase: continue
        if is_article(w) or is_preposition(w):  continue
        if filter_possesive(w): continue 
        #print w
        return w

def get_article():
    return articles[random.randrange(len(articles)-1)]

#print '--s--'
substr=''
conjunction = False
while True:
    w=getword()
    if is_modifier(w):
        if modifiers < MAX_MODIFIERS:
            substr+=w+' '
            modifiers+=1
        else: continue
    elif is_adverb(w) or is_plural(w) or not_noun(w): continue
    else:
        if is_conjunction(w): 
            conjunction = w
            continue    
        substr= substr+w+' '
        if conjunction:
            substr+=conjunction+' '
            conjunction = False
            continue
        if w in pronouns_s: 
            substr = w+' '
            art=''
        else:
            art = get_article()
            if art is 'a ' and substr[0] in 'aeiou': art='an '
        substr= string.capwords(art+substr,'.')
        break

#print '--v--'
verbstr=''
while True:
    w=getword()
    if not_verb(w) or filter_possesive(w,True): continue
    elif is_adverb(w): verbstr+=w+' '
    elif is_gerund(w):
        verbstr+='is '+w+' '
        break
    elif is_verb(w):
        verbstr= verbstr+w+' '
        break
    elif is_modifier(w) or is_conjunction(w): continue
    else:
        if not is_plural(w):
            w=w+'ed' if w[-1]!='e' else w+'d'
        verbstr= verbstr+w+' '
        break

#print '--o--'
obstr=''
conjunction = False
while True:
    w=getword()
    if is_modifier(w):
        if modifiers<MAX_MODIFIERS:
            obstr+=w+' '
            modifiers+=1
        else: continue
    elif is_adverb(w) or not_noun(w) or w in pronouns_s: continue
    else:
        if is_conjunction(w): 
            conjunction = w
            continue
        obstr = obstr+w
        if conjunction:
            obstr+=' '+conjunction+' '
            conjunction = False
            continue
        if is_plural(w):
            art = pl_articles[random.randrange(len(pl_articles))] 
        else:
            art = articles[random.randrange(len(articles)-1)] 
            if art is 'a ' and obstr[0] in 'aeiou': art='an '
        if w in pronouns_o:
            obstr=w
        else:
            obstr= art+obstr
        break

#print '--p--'
while use_prep:
    w=getword()
    if (is_modifier(w) or is_preposition(w) or 
         is_gerund(w) or not_noun(w) or is_conjunction(w)):
        continue
    obstr+=' '+use_prep+' '+w
    use_prep=None

print substr+verbstr+obstr+'.'
ASHelly
sumber
3
Contoh kalimat membuat saya tertawa sangat keras, saya menangis! xD
mikhailcazi
cat FILE | COMMAND? UUOC ;)
nyuszika7h
Terima kasih @ nyuszika7h, saya belajar sesuatu hari ini. Menghentikan kebiasaan yang terlalu tua mungkin sulit ...
AShelly
1
This smoke toasted some nonresidents.. WOW.
phil294
25

Pesta

Terinspirasi oleh jawaban Matlab. Mengasumsikan Anda telah aptitudemenginstal.

r=$[ RANDOM % 7 ]
a=''
for i in `seq $r`; do a=$a'v'; done
if [ $r -ne 0 ]; then a='-'$a; fi
aptitude $a moo

Kemungkinan output (screenshot dari ini artikel wikipedia)

masukkan deskripsi gambar di sini

ace_HongKongIndependence
sumber
7
Saya pikir . /----\ -------/ \ / \ / | -----------------/ --------\ ----------------------------------------------ini bukan kalimat yang valid.
svick
1
@svick you winbisa berupa kalimat (objek "argumen" tersirat). Dan bahkan jika tidak, pertanyaannya tidak melarang kasus di mana output tidak valid.
ace_HongKongIndependence
23

Python:

import random
l = ['Buffalo']
while random.randint(0,5) > 0:
    l.append('buffalo')
print ' '.join(l) + '.'

Sampel:

  • Buffalo buffalo buffalo.
  • Kerbau kerbau kerbau kerbau kerbau kerbau kerbau kerbau.

Sayangnya, ini memiliki penanganan tanda baca dan huruf besar yang buruk, tetapi sekali lagi itu tidak terdaftar sebagai persyaratan.

Juga, di sini adalah referensi.

8bree
sumber
3
Jangan menambahkan spasi ke literal kerbau; alih-alih gunakan ' '.join(l). Itu akan menyingkirkan ruang trailing. Anda kemudian dapat menambahkan periode.
Blacklight Shining
@ BlacklightShining Diperbarui. Terima kasih untuk sarannya.
8bittree
Sama-sama. Dan +1 untuk kerbau. :)
Blacklight Shining
1
Disajikan dengan itertools ,print " ".join(takewhile(lambda _: randint(0, 5), repeat("buffalo"))).capitalize() + "."
nmclean
16

Karat + Toki Pona

Bahasa apa pun diterima, jadi saya menulis sebuah program di Rust yang menghasilkan beberapa kalimat dalam Toki Pona .

Toki Pona adalah upaya untuk menciptakan bahasa alami yang minimal, dan memiliki tata bahasa yang super sederhana dan teratur. Itu properti yang sangat berguna untuk kontes ini!

use std::rand;

#[deriving(Rand)]
struct Phrase { a: Option<~GNominal>, b: ~Sujet, c: ~Predicat }

#[deriving(Rand)]
enum Sujet { A(~GNominal), B(~SCompose) }

#[deriving(Rand)]
enum Predicat { C(~GVerbal), D(~PCompose) }

#[deriving(Rand)]
struct SCompose { a: ~Sujet, b: ~Sujet }

#[deriving(Rand)]
struct PCompose { a: ~Predicat, b: ~Predicat }

#[deriving(Rand)]
struct GNominal { a: ~nom::Nom, b: Multi<~adjectif::Adjectif> }

#[deriving(Rand)]
struct GVerbal { a: ~verbe::Verbe, b: Multi<~adjectif::Adjectif>, c: Multi<~ODirect> }

#[deriving(Rand)]
struct ODirect { a: ~GNominal}

#[deriving(Rand)]
enum Multi<T> { Zero, One(T), Two((T,T)) }

mod nom {
    #[deriving(Rand)]
    #[deriving(ToStr)]
    pub enum Nom {akesi,ala,ale,anpa,ante,ijo,ike,ilo,insa,jaki,jan,jo,kala,kalama,kama,kasi,ken,kili,kiwen,ko,kon,kule,kulupu,lape,lawa,len,lete,linja,lipu,luka,lupa,ma,mama,mani,meli,mi,mije,moku,moli,monsi,mun,musi,mute,nanpa,nasin,nena,nimi,noka,oko,olin,ona,pakala,pali,palisa,pana,pilin,pimeja,pini,pipi,poka,poki,pona,seli,selo,sewi,sijelo,sike,sina,sinpin,sitelen,sona,soweli,suli,suno,supa,suwi,tan,tawa,telo,tenpo,toki,tomo,tu,unpa,uta,utala,walo,wan,waso,wawa,weka,wile}
}

mod verbe {
    #[deriving(Rand)]
    #[deriving(ToStr)]
    pub enum Verbe {ante,awen,ijo,ike,jaki,jan,jo,kalama,kama,ken,kepeken,kule,kute,lape,lawa,lete,lili,lon,lukin,moku,moli,musi,mute,nasa,olin,open,pakala,pali,pana,pilin,pimeja,pini,pona,seli,sin,sitelen,sona,suli,suwi,tawa,telo,toki,tu,unpa,utala,wan,wawa,weka,wile,}
}

mod adjectif {
    #[deriving(Rand)]
    #[deriving(ToStr)]
    pub enum Adjectif {ala,ale,anpa,ante,awen,ike,insa,jaki,jan,jelo,kama,kin,kiwen,kon,kule,kute,kulupu,lape,laso,lawa,lete,lili,linja,loje,luka,lukin,mama,meli,mi,mije,moli,monsi,mun,musi,mute,nasa,ni,olin,ona,pali,pimeja,pini,poka,pona,sama,seli,sewi,sike,sin,sina,suli,suwi,taso,tawa,toki,tomo,unpa,uta,walo,wan,wawa,weka,wile,}
}

impl ToStr for Phrase {
    fn to_str(&self) -> ~str {
        self.a.as_ref().map_or(~"", |g| format!("{:s} la ", g.to_str()))
        + format!("{:s} li {:s}", self.b.to_str(), self.c.to_str())
    }
}

impl ToStr for Sujet {
    fn to_str(&self) -> ~str {
        match *self {
            A(ref v) => v.to_str(),
            B(ref v) => v.to_str(),
        }
    }
}

impl ToStr for Predicat {
    fn to_str(&self) -> ~str {
        match *self {
            C(ref v) => v.to_str(),
            D(ref v) => v.to_str(),
        }
    }
}

impl ToStr for SCompose {
    fn to_str(&self) -> ~str {
        format!("{:s} en {:s}", self.a.to_str(), self.b.to_str())
    }
}

impl ToStr for PCompose {
    fn to_str(&self) -> ~str {
        format!("{:s} li {:s}", self.a.to_str(), self.b.to_str())
    }
}

impl ToStr for GNominal {
    fn to_str(&self) -> ~str {
        format!("{:s} {:s}", self.a.to_str(), self.b.to_str())
    }
}

impl ToStr for GVerbal {
    fn to_str(&self) -> ~str {
        format!("{:s} {:s} {:s}", self.a.to_str(), self.b.to_str(), self.c.to_str())
    }
}

impl ToStr for ODirect {
    fn to_str(&self) -> ~str {
        format!("e {:s}", self.a.to_str())
    }
}

impl<T: ToStr> ToStr for Multi<~T> {
    fn to_str(&self) -> ~str {
        match *self {
            Zero => ~"",
            One(ref v) => v.to_str(),
            Two((ref v,ref w)) => format!("{:s} {:s}", v.to_str(), w.to_str()),
        }
    }
}

fn main() {
    let phrase = rand::random::<Phrase>();
    println!("{:s}\n{:?}", phrase.to_str(), phrase);
}

Saya tidak berbicara Toki Pona, tetapi saya menemukan sintaksis Toki Pona sebagai seperangkat aturan BNF di Wikipedia. Saya membuat satu struct atau enum untuk setiap aturan BNF, dan saya menjelaskannya dengan deriving(Rand), yang memberi saya cara untuk menghasilkan Phrasestruct acak gratis! Kemudian, saya menerapkan ToStruntuk masing-masing struct ini untuk mengubahnya menjadi string.

Saya bermaksud meninggalkan nama struct dalam bahasa Prancis, karena aturan BNF yang saya temukan adalah dalam bahasa Prancis, dan juga karena itu memasukkan kembali sifat multibahasa dari pengiriman saya!

Output sampel

Beberapa output dan terjemahannya, yang saya lakukan berdasarkan aturan BNF dan kamus Toki Pona . Saya yakin terjemahan ini sebagian besar salah, tetapi Toki Pona sebenarnya meninggalkan banyak ruang untuk penafsiran sebuah kalimat.

nasin mi tawa la jan li jaki

Saat dalam perjalanan, seseorang mencemari

monsi li jaki li jan ike musi

Puntungnya kotor dan orang jahat yang lucu

sina li tawa ale jelo e kili tawa e insa

Anda memindahkan buah dan pusat ke alam semesta kuning

Masalah

  • Saya tidak memeriksa apakah kata kerja transitif atau tidak, sehingga beberapa kalimat secara tata bahasa salah.
  • Beberapa struct bersifat rekursif, dan ketika sebuah aturan dapat diulang, saya secara acak memilih untuk menghasilkan elemen 0, 1 atau 2. Ini dapat menyebabkan kalimat yang dibuat lama oleh veeeeeery, mengandung ribuan kata ...
  • Saya tidak dapat benar-benar memverifikasi validitas output, saya sepenuhnya mengandalkan sintaks BNF, kamus, dan tebakan liar saya sendiri :)
barjak
sumber
1
sina li tawa ale jelo e kili tawa e insa == "Anda memindahkan buah dan pusat ke alam semesta kuning" Cukup bagus untuk sebuah mesin, biasanya hanya pengguna tp canggih yang dapat menggunakan konstruksi transformatif.
MatthewMartin
1
monsi li jaki li jan ike musi == Pantat (pantat? seperti di brengsek?) Kotor dan orang jahat yang lucu.
MatthewMartin
1
Hai terima kasih atas komentar Anda, @MatthewMartin! Saya tentu tidak mengharapkan pembicara Toki Pona untuk melihat kiriman saya, tapi saya senang mengetahui bahwa orang-orang ini tidak sepenuhnya omong kosong :)
barjak
Petunjuk: Ini bukan kode golf.
nyuszika7h
1
@ nyuszika7h Saya tidak yakin apa tujuan dari komentar Anda. Memang, ini bukan golf kode, karena ini adalah kontes popularitas.
barjak
14

Python

import this


The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
Renae Lider
sumber
7
Bisakah Anda membantah bahwa import antigravitymengarah ke output I LEARNED IT LAST NIGHT! EVERYTHING IS SO SIMPLE!? : D
ace_HongKongIndependence
Tidak diragukan lagi, ya.
Renae Lider
14

Prolog

Gunakan pengulangan prolog dan tata bahasa generatif yang mendekati tata bahasa Inggris untuk menghasilkan semua kalimat yang mungkin.

Versi ini memiliki kosakata dan struktur kalimat yang cukup terbatas, tetapi seharusnya cukup mudah diperluas.

Kode:

% Define the vocabulary
verb(V) :- V = 'eats' | V = 'fights' | V = 'finds'.
subj_pronoun(P) :- P = 'he' | P = 'she' | P = 'it'.
obj_pronoun(P) :- P = 'him' | P = 'her' | P = 'it'.
name(N) :- N = 'alice' | N = 'bob'.
noun(N) :- N = 'cat' | N = 'door' | N = 'pen'.
article(H) :- H = 'the' | H = 'a'.

% Grammar
subject_phrase_short(H) :- subj_pronoun(H)
                         | name(H).
% Subordinate clause. Don't use verb_phrase here to avoid recursive clauses.
sub_clause([Which, Verb|T], Rest) :- Which = 'which', verb(Verb),
                                     object_noun_phrase_short(T, Rest).
subject_phrase([H|T], Rest) :- subject_phrase_short(H), Rest = T.
object_noun_phrase_short([A, N | T], Rest) :- article(A), noun(N), Rest = T
                                            | obj_pronoun(A), Rest = [N|T].
object_phrase(L, Rest) :- object_noun_phrase_short(L, Rest)
                        | object_noun_phrase_short(L, Rest1), sub_clause(Rest1, Rest).
verb_phrase([H|T], Rest) :- verb(H), object_phrase(T, Rest).
sentence(S) :- subject_phrase(S, Rest), verb_phrase(Rest, []).

Jalankan kueri ini:

sentence(L).

untuk menghasilkan semua kalimat yang mungkin dalam bahasa ini.

Beberapa output sampel:

L = [he, eats, the, cat] ;
L = [she, finds, a, door] ;
L = [alice, fights, the, door] ;
L = [he, fights, the, cat, which, eats, the, pen] ;
L = [alice, eats, him, which, finds, the, cat] ;

(EDIT: Izinkan klausa bawahan objek).

chrisd
sumber
1
Adakah contoh keluaran kalimat?
TheDoctor
Ya saya memasukkan beberapa sampel dalam jawabannya. Ini menghasilkan total 2520 output jadi saya tidak bisa memposting semuanya ...
chrisd
11

Python

Seperti yang Anda tahu, Anda dapat melakukan apa pun dengan python dengan beberapa imports. Tugas sederhana ini dapat diselesaikan dengan skrip python 2 baris ini.

import random

print ("I like the number "+str(random.uniform(0,1)))

Jumlah kalimat yang dihasilkan oleh skrip ini sangat besar: 10^12kalimat berbeda. Jika membaca seorang penjaga membawa Anda ~ 0,5 detik, maka membacanya semuanya akan lebih dari 15000 tahun!

Beberapa contoh kalimat:

  • I like the number 0.444371877853
  • I like the number 0.358614422548

Namun semua kalimat yang dihasilkan berisi subjek, kata kerja dan objek.

MEMPERBARUI:

Saya menerima beberapa kritik tentang beberapa kata canggih yang dapat dihasilkan alat kompleks ini. Ini adalah versi yang sedikit lebih panjang yang harus sesuai dengan sebagian besar daftar kata.

import random

print ('I like the number'+''.join([' '+{'0':'zero','.':'point','1':'one','2':'two','3':'three','4':'four','5':'five','6':'six','7':'seven','8':'eight','9':'nine'}[digit] for digit in str(random.uniform(0,1))])+'.')

Berikut beberapa contoh kalimat:

  • I like the number zero point six three five nine zero eight one five eight four two four.
  • I like the number zero point four nine zero eight four four three two zero six two seven.
Antonio Ragagnin
sumber
Saya gagal menemukan beberapa kata-kata Anda dalam kamus saya
Dr. belisarius
5
Saya menyesuaikan perangkat lunak saya agar lebih sesuai dengan kamus Anda yang buruk.
Antonio Ragagnin
2
Baik. Dalam 15.000 tahun saya akan posting untuk menyatakan saya telah menemukan semuanya
Dr. belisarius
10

Bermain dengan kamus internal Mathematica:

res = {};
SeedRandom[42 + 1];
Do[
  (While[
    If[(c = Flatten@WordData[RandomChoice[WordData[All]], "Examples"][[All, 2]]) != {},
     StringPosition[(c1 = RandomChoice@c), "'" | "-" | "\\" | "`"] != {}, True, True]];
   sp = ToLowerCase /@ StringSplit[c1, (WhitespaceCharacter .. | ",")];
   toChange = RandomSample[Range@#, RandomInteger[IntegerPart[{#/2, #}]]] &@Length@sp;
   If[StringPosition[ToString@WordData[sp[[#]], "Definitions"],  "WordData"] == {}, 
    sp[[#]] = RandomChoice@ WordData[All, RandomChoice@WordData[sp[[#]], "PartsOfSpeech"]]]
             & /@ toChange;
   AppendTo[res, StringJoin@Riffle[sp, " "]];)
  ,
  {10}];
res

Anda beruntung, katakanlah, 70% dari waktu. Ini menghasilkan hal-hal seperti:

sirkuit listrik amygdaloid di
sana, Parkia tidak membatasi meskipun
masyarakatnya kasar.
Dokter Pendidikan tidak dapat menjawab kibbutz
teater musikal kecil melawan Julius Caesar
dan Tai nuthatch
merapikan pusat olahraga
sesuai dengan kebodohan yang diperlukan deterjen ekstrinsik
sans necromantic sorcerer
ini di lokasi lain piala istri trend-setting investor coklat
apa manusia-portabel bidang api
umbra apik mana jawaban saya
lain-lepas puing-puing badai tanpa aroma miring wangi kompleks Laut Aral
untuk mengaku mengaku jenis logam mongoloid

tapi terkadang:

adopsi saya pro paling tidak pertempuran Lutzen akan menarik uang tunai selama sementara Hejira dari golok
genus sembilan subduksi shiner umum Seiurus menghangatkan hati pendengarnya

Oh well, penggunaan bahasa Inggrisnya lebih baik daripada saya.

Belisarius
sumber
8

VBA / Excel

[edit 2]

Telah mengajarkannya bagaimana mengkonjugasikan kata kerja, contoh di bawah ini adalah past past tense:

Kokain liar moderat meluncur mengikuti keputusan instan bersejarah. Bab aman regional tersentak di dalam banyak entitas acak. Domain kanan kuning dihapus di belakang gender rapuh magnetik. Polusi fatal fisik mulai melewati sensasi mati miskin. Teater berani kognitif pergi ke depan literatur sadar rapuh. Output aktual konvensional menolak jauh dari situs kekebalan favorit. Kembar ekonomi tetap diakui karena kebutuhan manusia yang jahat.

Kode yang relevan berikut, tidak termasuk sekelompok fungsi parsing dan looping tambahan yang membosankan. Bagian utama yang hilang adalah berbagai daftar kata (berdasarkan bagian pembicaraan) yang melakukan pluralisasi, tegang, konjugasi, dll.

Semua akar kata dipilih secara acak, tetapi saya memaksanya diatur dalam pola kalimat tertentu:

Debug.Print getWords("ad adj adj nns vpa1s pl ad adj adj nns")

... itulah yang saya gunakan untuk menghasilkan output di atas. Ini mengikuti bentuk umum, "Rubah merah cepat melompati anjing cokelat malas."

Function getWords(strStruc As String) As String
    Dim i As Long
    Dim s As Long
    Dim strIn As String
    Dim strOut As String

    getWords = ""
    s = numElements(strStruc)
    For i = 1 To s
        strIn = parsePattern(strStruc, i)
        Select Case strIn
            Case ",", ";", ":", """" 'punctuation
                strOut = strIn
                getWords = Trim(getWords)
            Case "ai", "ad" 'indefinite article, definite article
                strOut = getArticle(strIn)
            Case "adj" 'adjective
                strOut = getWord("adj", 1)
            Case "nns" 'noun nominative singular
                strOut = getWord("n", 1)
            Case "nnp" 'noun nominative plural
                strOut = getWord("n", 2)
            Case "nps" 'noun posessive singular
                strOut = getWord("n", 3)
            Case "npp" 'noun posessive plural
                strOut = getWord("n", 4)
            Case "vpr1s" 'Present 1st Person Singular
                strOut = getWord("v", 1)
            Case "vpr2s" 'Present 2nd Person Singular
                strOut = getWord("v", 2)
            Case "vpr3s" 'Present 3rd Person Singular
                strOut = getWord("v", 3)
            Case "vi" 'Infinitive
                strOut = getWord("v", 4)
            Case "vpp" 'Present Participle
                strOut = getWord("v", 5)
            Case "vi" 'Imperative/Subjunctive
                strOut = getWord("v", 6)
            Case "vpa1s" 'Past Tense First Person
                strOut = getWord("v", 7)
            Case "vpa2s" 'Past Tense Second Person
                strOut = getWord("v", 8)
            Case "vpa3s" 'Past Tense Third Person
                strOut = getWord("v", 9)
            Case "vppr1s" 'Present Progressive First Person Singular
                strOut = getWord("v", 10)
            Case "vppr2s" 'Present Progressive Second Person Singular
                strOut = getWord("v", 11)
            Case "vppr3s" 'Present Progressive Third Person Singular
                strOut = getWord("v", 12)
            Case "vppe1s" 'Present Perfect First Person Singular
                strOut = getWord("v", 13)
            Case "vppe2s" 'Present Perfect Second Person Singular
                strOut = getWord("v", 14)
            Case "vpp3s" 'Present Perfect Third Person Singular
                strOut = getWord("v", 15)
            Case "vi1s" 'Imperfect First Person Singular
                strOut = getWord("v", 16)
            Case "vi2s" 'Imperfect Second Person Singular
                strOut = getWord("v", 17)
            Case "v13s" 'Imperfect Third Person Singular
                strOut = getWord("v", 18)
            Case "vsf" 'Simple Future
                strOut = getWord("v", 19)
            Case "vfp" 'Future Progressive
                strOut = getWord("v", 20)
            Case "vc" 'Conditional
                strOut = getWord("v", 21)
            Case "vcp" 'Conditional Perfect
                strOut = getWord("v", 22)
            Case "vci" 'Conditional Imperfect
                strOut = getWord("v", 23)
            Case "pl" 'location prepositions
                strOut = getWord("pl", 1)
        End Select
        getWords = getWords & strOut & " "
    Next i
End Function

[mulai posting asli]

Masih dalam proses, perlu menambahkan logika untuk tenses dan kata benda / kata kerja pluralization, yaitu .:

Rata-rata Anda bepergian dengan dosis yang seharusnya atau peningkatan suhu di luar tomat saya.

... yang dapat diurai, tetapi tidak masuk akal.

Pemrograman ini memungkinkan nelayan kotor mereka jauh-jauh membuang daging babi kami, bukannya tanpa hukuman.

Baik. Tidak benar-benar kalimat, tetapi lebih baik daripada beberapa pesan kesalahan JavaScript.

Permohonannya mengangkat setiap pertanyaan langsung yang diuraikan oleh putri saya di atas bahasa Inggrisnya.

Rutin sindiran itu hampir terkemuka ...

Kode untuk diikuti segera. Apakah kontes ini memiliki tenggat waktu?

[edit 1]

Kode yang dihasilkan di atas.

Function getWord(sht As Worksheet) As String
    Dim i As Long
    Dim freq As Long
    Dim c As Long
    Dim f As Double
    Dim fSum As Double

    c = 4
    fSum = WorksheetFunction.Count(sht.Columns(c))
    f = Rnd() * fSum
    i = 2
    Do
        If i >= f Then Exit Do
        i = i + 1
    Loop
    getWord = sht.Cells(i, 1).Value
End Function
Function PCase(str As String) As String
    PCase = UCase(Left(str, 1)) & Right(str, Len(str) - 1)
End Function
Sub doMakeSentences01()
    Dim shtIn As Worksheet
    Dim shtOut As Worksheet
    Dim strSheet As String
    Dim rIn As Long
    Dim rOut As Long
    Dim cFreq As Long
    Dim c As Long
    Dim strPattern As String
    Dim w As Long
    Dim strOut As String
    Dim strIn As String
    Dim strWord As String

    cFreq = 4
    Set shtOut = Sheets("Output")
    rOut = shtOut.Range("A65536").End(xlUp).Row + 1

    strPattern = "anvajncanvian"
    For rOut = rOut To rOut + 1000
        strOut = ""
        For w = 1 To Len(strPattern)
            Set shtIn = Sheets(Mid(strPattern, w, 1))
            strWord = getWord(shtIn)
            If w = 1 Then strWord = PCase(strWord)
            strOut = strOut & strWord & " "
        Next w
        strOut = Trim(strOut) & "."
        shtOut.Cells(rOut, 1).Value = strOut
    Next rOut
End Sub
Brandon R. Gates
sumber
5
Di mana kode Anda?
ace_HongKongIndependence
Lihat edit saya untuk kode.
Brandon R. Gates
6

Perl 5

OK, nyali program hanya ini:

use v5.14;
my %pad = (
    ...
);
sub pad { shift =~ s(\{(.+?)\}){pad($pad{$1}[rand(@{$pad{$1}})])}rogue }
say ucfirst pad '{START}';

Ini pada dasarnya mesin "madlib". Untuk benar-benar menghasilkan kalimat yang menarik, Anda perlu mengisi %padbeberapa data. Ini sebuah contoh %pad...

my %pad = (
  START => ['{complex}.'],
  complex => [
    '{simple}',
    '{simple}, and {simple}',
    '{simple}, and {complex}',
    '{simple}, but {simple}',
    '{simple}, yet {simple}',
    'even though everybody knows {simple}, {simple}',
    'not only {simple}, but also {simple}',
  ],
  simple => [
    '{thing} {verb}s {thing}',
    '{thing} {verb}s {adverb}',
    '{thing} is {adjective}',
    '{things} {verb} {thing}',
    '{things} {verb} {adverb}',
    '{things} are {adjective}',
    '{thing} {past_verb} {thing}',
    '{things} {past_verb} {thing}',
  ],
  thing => [
    'the {adjective} gorilla',
    'the {adjective} mailbox',
    'Archbishop Desmond Tutu',
    'the beef salad sandwich',
    'the {adjective} stegosaur',
    'the summit of Mt Everest',
    'Chuck Norris',
    'the cast of television\'s "Glee"',
    'a {adjective} chocolate cake',
  ],
  things => [
    '{adjective} shoes',
    'spider webs',
    'millions of {adjective} eels',
    '{adjective} children',
    '{adjective} monkeys',
    '{things} and {things}',
    'the British crown jewels',
  ],
  verb => [
    'love',
    'hate',
    'eat',
    'drink',
    'follow',
    'worship',
    'respect',
    'reject',
    'welcome',
    'jump',
    'resemble',
    'grow',
    'encourage',
    'capture',
    'fascinate',
  ],
  past_verb => [  # too irregular to derive from {verb}
    'loved',
    'ate',
    'followed',
    'worshipped',
    'welcomed',
    'jumped',
    'made love to',
    'melted',
  ],
  adverb => [
    'greedily',
    'punctually',
    'noisily',
    'gladly',
    'regularly',
  ],
  adjective => [
    'enormous',
    'tiny',
    'haunted',
    'ghostly',
    'sparkling',
    'highly-decorated',
    'foul-smelling',
    '{adjective} (yet {adjective})',
    'expensive',
    'yellow',
    'green',
    'lilac',
    'tall',
    'short',
  ],
);

Inilah beberapa contoh kebijaksanaan yang saya temukan dari sana %pad. Kalimat-kalimat ini belum diedit untuk panjang, tanda baca, tata bahasa, dll, meskipun saya telah memilah beberapa yang tidak menarik dan menata ulang urutan di mana kalimat muncul - mereka tidak lagi dalam urutan yang dihasilkan, tetapi saya sedang mencoba untuk gunakan itu untuk menceritakan sebuah kisah: sebuah kisah yang saya harap Anda akan menemukan menyentuh dan memprovokasi pemikiran.

  • Jaring laba-laba pendek.
  • Jaring laba-laba tertarik secara teratur.
  • Monyet pendek berkilau, tetapi jaring laba-laba meminumnya dengan rakus.
  • Monyet-monyet yang berkilauan (namun berbau busuk) mengikuti gorila mungil (namun berkilau).
  • Puncak Gunung Everest menyambut stegosaurus yang sangat dihiasi.
  • Tidak hanya puncak Gunung Everest yang mahal, tetapi juga pemeran televisi "Glee" mengikuti gorila yang berkilauan.
  • Para pemeran televisi "Glee" menyerupai kotak surat lilac.
  • Kotak surat mahal, dan stegosaurus mahal melompat Chuck Norris, namun sepatu hijau melompat sandwich salad daging sapi.
  • Sandwich salad daging sapi menyukai Chuck Norris.
  • Jutaan belut berkilau berwarna hijau (namun menakutkan).
tobyink
sumber
Sekarang jika Anda dapat mengisi pad secara programatis
Pureferret
Populasi pad secara sistematis tidak banyak tantangan. Cukup gesek wiktionary atau sesuatu. Itu tidak akan menghasilkan kalimat yang menyenangkan.
tobyink
Ini tidak banyak tantangan, tapi saya pikir itu bagian yang menyenangkan.
Pureferret
5

Microsoft Word

Saya tidak yakin apakah ini dapat diterima, tetapi karena html, saya pikir ini juga harus dapat diterima.

 =rand(1,1)

Contoh kalimat:

Pada tab Sisipkan, galeri menyertakan item yang dirancang untuk berkoordinasi dengan keseluruhan tampilan dokumen Anda.

Anda dapat menggunakan galeri ini untuk menyisipkan tabel, header, footer, daftar, halaman sampul, dan blok bangunan dokumen lainnya.

Anda juga dapat menentukan sejumlah kalimat dan paragraf.

Mhmd
sumber
4

Pekerjaan yang sedang berjalan menggunakan JSoup dan simpleNLG

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

import simplenlg.framework.NLGFactory;
import simplenlg.lexicon.Lexicon;
import simplenlg.phrasespec.SPhraseSpec;
import simplenlg.realiser.english.Realiser;

/**
 * Scapes words from Wiktionary then assembles them into sentences
 * 
 * @author pureferret
 *
 */
public class SentenceBuilder {
    static ArrayList<String> ListOfWordTypes= new ArrayList<>(Arrays.asList("Noun","Verb","Adjective","Adverb","Proper noun","Conjunction"));
    private static String RandomWiktWord ="http://toolserver.org/~hippietrail/randompage.fcgi?langname=English";  
    /**
     * @param args
     */
    public static void main(String[] args) {
        Lexicon lexicon = Lexicon.getDefaultLexicon();
        NLGFactory nlgFactory = new NLGFactory(lexicon);
        Realiser realiser = new Realiser(lexicon);

        ArrayList<String> nounList = new ArrayList<String>();
        ArrayList<String> verbList = new ArrayList<String>();
        ArrayList<String> adjeList = new ArrayList<String>();
        ArrayList<String> adveList = new ArrayList<String>();
        ArrayList<String> pnouList = new ArrayList<String>();
        ArrayList<String> conjList = new ArrayList<String>();


        String word= null;
        String wordType = null;

        try {
            newDoc:
            while( nounList.size()<1 ||
                    verbList.size()<1 ||
//                  adjeList.size()<2 ||
//                  adveList.size()<2 ||
                    pnouList.size()<1){
                Document doc = Jsoup.connect(RandomWiktWord).get();
                Element bodyElem = doc.body();
                word = bodyElem.select("h1>span[dir=auto]").get(0).ownText();
                int wtIdx = 0;
                while(wtIdx<bodyElem.select("div#mw-content-text span.mw-headline").size()){
                    wordType = bodyElem.select("div#mw-content-text span.mw-headline").get(wtIdx).id()
                            .replace("_", " ");
                    wtIdx++;
                    switch (wordType) {
                    case "Proper noun":
                        pnouList.add(word);
                        continue newDoc;
                    case "Noun":
                        nounList.add(word);
                        continue newDoc;
                    case "Verb":
                        verbList.add(word);
                        continue newDoc;
                    case "Adjective":
                        adjeList.add(word);
                        continue newDoc;
                    case "Adverb":
                        adveList.add(word);
                        continue newDoc;
                    case "Conjunction":
                        conjList .add(word);
                        continue newDoc;
                    default:
                        break;
                    }
                }
            }
                SPhraseSpec p = nlgFactory.createClause();
                p.setSubject(pnouList.get(0));
                p.setVerb(verbList.get(0));
                p.setObject(nounList.get(0));

                String output2 = realiser.realiseSentence(p); // Realiser created earlier.
                System.out.println(output2);

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.err.println(word + " is a " + wordType);
        } catch (IndexOutOfBoundsException e) {
            e.printStackTrace();
            System.err.println(word + " is a " + wordType);
        }
    }

}

Masalah:

  • Kalimatnya terlalu sederhana
  • Kadang-kadang 404-an (tanpa penanganan yang baik!)
  • Hanya menghasilkan satu kalimat pada satu waktu
  • Menggunakan case switch!

Output sampel:

Popoloca menusuk kacang runner.
Tropic of Capricorn memancarkan tubuh.
Beijing sinonim kotak bantal.
Chukchis mempengaruhi budaya.

Pureferret
sumber
3

PHP

<?php
  $trends = file_get_contents('http://www.google.com/trends/hottrends/widget?pn=p1&tn=30');
  preg_match_all("/widget-title-in-list'>(.+?)</", $trends, $m);

  $q = urlencode($m[1][array_rand($m[1])]);
  $page = file_get_contents("http://www.google.com/search?q=$q&btnI=1");
  preg_match_all('/[A-Z]([\w,]+ ){2,}[\w, ]+?[.!]/', strip_tags($page), $m);

  echo $m[0][array_rand($m[0])];

Ini mengambil 30 pencarian google paling trending, melakukan pencarian "I Feel Lucky", dan kemudian menampilkan kalimat acak dari halaman itu dengan setidaknya 3 kata.

Contoh:

"Dia dianggap sebagai medali favorit dalam acara itu."

"Kate lulus dari sekolah menengah setahun lebih awal."

"15 April 2014, untuk mempromosikan kepatuhan dengan kebijakan tentang biografi orang hidup."

"Atas nama Bryan, kami, keluarganya, ingin mengucapkan terima kasih kepada semua orang atas curahan cinta, doa, dan dukungan."

"Artikel ini tentang pemain bola basket Amerika."

"Maaf, browser Anda menonaktifkan JavaScript atau tidak memiliki pemain yang didukung."

primo
sumber
3

Python 2.7

python2.7 -c "import urllib2, pprint; pprint.pprint([str(x[:x.find('<')]) for x in unicode(urllib2.urlopen('http://codegolf.stackexchange.com/questions/21571/generate-an-understandable-sentence').read(), 'utf8').split('<p>') if x.find('<') >= 1][1].split('.')[0])"

keluaran:

Hasilkan kalimat yang bisa dibaca dan dipahami

eqzx
sumber
Gunakan URI berbagi Stack Exchange (misalnya, /q/21571bukan /questions/21571/generate-an-understandable-sentence).
Blacklight Shining
2
Karena ini bukan kode golf, jeda baris untuk keterbacaan akan menyenangkan.
nyuszika7h
2

Script Shell

Skrip ini akan selalu menampilkan judul pertanyaan pertama yang saat ini ada di atas situs ini. Asumsi saya adalah judul pertanyaan akan selalu dapat dibaca manusia. Dan itu akan berubah secara dinamis. Jadi, setiap kali pertanyaan baru datang dan ketika skrip dieksekusi, itu akan memberikan judul pertanyaan terbaru.

curl "codegolf.stackexchange.com" -s |  w3m -dump -T text/html > foo.txt
awk 'f;/more tags/{f=1}' foo.txt > foo1.txt
sed '8q;d' foo1.txt

Output percobaan 1

Find words containing every vowel

Output percobaan 2

Hello World 0.0!

SUNTING

Tidak menggunakan file apa pun. Tanpa file, saya bisa menggunakan skrip di bawah ini.

value1=$(curl "codegolf.stackexchange.com" -s |  w3m -dump -T text/html)
echo "$value1" | grep -A 8 "more tags" | tail -1

Keluaran

Generate an understandable sentence
Ramesh
sumber
1
juga tidak membacanya langsung dari file ...
rafaelcastrocouto
Saya telah membuat perubahan untuk tidak menggunakan file. Sekarang, itu hanya menggunakan variabel. Bagaimana dengan yang ini?
Ramesh
2
hapus suara!
rafaelcastrocouto
2

JavaScript (ES6)

var t='';for(f of [_=>foo,_=>null.a,_=>0..toString(0)])try{f()}catch(e){t+=e.message+'\n';}t

Menjalankannya di konsol menghasilkan

foo is not defined
null has no properties
radix must be an integer at least 2 and no greater than 36
Oriol
sumber
Bahkan lebih pendek:t='';for(f of [_=>foo,_=>null.a,_=>0..toString(0)])try{f()}catch(e){t+=e.message+'\n'}t
Sikat gigi
2

Namun skrip Python lain

The jawaban user3058846 tidak buruk, tetapi menampilkan setiap kalimat, setiap kali. Di sini, saya mengusulkan skrip yang menghasilkan kalimat acak dari Zen Python :

from random import choice
import subprocess
proc = subprocess.Popen(('python', '-c', 'import this'), stdout=subprocess.PIPE,)
# Get output of proc, split by newline
sentences = [x for x in proc.communicate()[0].splitlines() if x != '']
print(choice(sentences))

Dalam satu baris, untuk penggemar :

from random import choice;import subprocess;print(choice([x for x in subprocess.Popen("python -c 'import this'",shell=True,stdout=subprocess.PIPE).communicate()[0].split('\n') if x]))

(Boooh, kotor.)

Contoh:

>>> a()  # <--- a is just the oneline above
Explicit is better than implicit.
>>> a() 
Although never is often better than *right* now.
>>> a() 
Errors should never pass silently.
>>> a() 
Special cases aren't special enough to break the rules.


Cara lain yang menyenangkan dengan Python

Berkat @TheDoctor tuangkan idenya :-) Hening output impor dan kemudian bermain dengan dict pseudo-terenkripsi dalam modul.

import sys, random 
_stdout, sys.stdout = sys.stdout, open('/tmp/trash', 'w')  # silent the stdout just for the import
import this
sys.stdout = _stdout
lst = []
for x in this.s:
    if x in this.d:
        lst.append(this.d[x])
    else:
        lst.append(x)

# Then, example from the interpreter
>>> random.choice(''.join(lst).split('\n'))
'Beautiful is better than ugly.'
>>> random.choice(''.join(lst).split('\n'))
'Although never is often better than *right* now.'
>>>
Maxime Lorant
sumber
Biasanya ini adalah praktik yang buruk untuk digunakan shell=True. Meskipun tidak aman dalam kasus ini, karena Anda tidak mengambil input pengguna, saya akan memilih subprocess.Popen(('python', '-c', 'import this')).
nyuszika7h
Tahukah Anda jika Anda bisa membungkam puisi itu import this, ada variabel dalam modul thisyang berisi semua teks, tetapi dienkripsi. Ada juga kamus untuk mendekripsi.
TheDoctor
1
@TheDoctor Lihat jawaban saya yang diperbarui: D
Maxime Lorant
1

Python 3

Dijamin akan menghasilkan keluaran gramatikal! (Biasanya.)

import re
from urllib.request import urlopen
from random import random, choice as pick

letters = "abcdefghijklmnopqrstuvwxyz"
wordregex = re.compile(r'a href="/wiki/([a-z_]+)"')
subjects = {1:("I","we"), 2:("you",), 3:("they",)}
objects = {1:("me","us"), 2:("you",), 3:("him","her","it","them")}
patterns = ["{0} {1} {2}.",
            "Why do {0} {1} {2}?",
            "It's because {0} {1} {2}, of course.",
            "Did {0} {1} {2}?",
            "{0} will not {1} {2}!",
            ]

wiktionaryurl = "http://en.wiktionary.org/w/index.php?" + \
              "title=Category:English_{0}&pagefrom={1}"

def getWord(category):
    subset = pick(letters) + pick(letters)
    url = wiktionaryurl.format(category, subset)
    try:
        response = urlopen(url)
    except:
        print("An error occurred while connecting to the Internet!")
        return "fail"
    page = str(response.read())
    word = pick(wordregex.findall(page))
    word = word.replace("_", " ")
    return word

for i in range(10):
    verb = getWord("transitive_verbs")
    subjPerson = pick([1,2,3])
    subj = pick(subjects[subjPerson])
    if random() > 0.4:
        # Use a plural noun for the object
        obj = getWord("plurals")
    else:
        # Use a pronoun for the object
        objPerson = pick([1,2,3])
        while subjPerson == objPerson and subjPerson in (1,2):
            objPerson = pick([1,2,3])
        obj = pick(objects[objPerson])
    sentence = pick(patterns).format(subj, verb, obj)
    sentence = sentence[0].upper() + sentence[1:]
    print(sentence)

Untuk membuatnya menjadi tata bahasa yang sempurna, hapus garis bawah dari wordregex. Ini akan melarang entri multi-kata yang mengarah ke kalimat buruk seperti "Kami zip up Anda."

Contoh dijalankan:

We appropriate journals.
I will not masticate you!
Did you lower me?
Why do I sag estoppels?
They will not proofread you!
It's because you unbeguile mucosae, of course.
Why do I flack zakuski?
You will not visit junkpiles!
Did they goat us?
Why do we prefix nolids?

Output favorit sejauh ini:

They you her.

Lihat itu: http://en.wiktionary.org/wiki/you#Verb .

DLosc
sumber
0

Python

Hasil:

$ python mksentence.py
infringement lecture attainment
Produce more? (Y/N)y
impeachment recoup ornament
Produce more? (Y/N)y
maladjustment edit discouragement
Produce more? (Y/N)y
embellishment guest punishment
Produce more? (Y/N)y
settlement section escapement
Produce more? (Y/N)y
segment withhold recruitment
Produce more? (Y/N)

Saya menggunakan daftar kata dari sini. Cari kata-kata yang mengandung setiap vokal

Beberapa aturan lagi dapat ditambahkan. Misalnya, jika kata yang diakhiri dengan "ness" dan kata itu juga ada di set tanpa akhiran, maka itu adalah kata benda.

Kode sumber:

#!/usr/bin/env python
# vim: set fileencoding=utf-8 ts=4 sw=4 tw=72 :

from __future__ import (unicode_literals, absolute_import,
                        division, print_function)

import random                     

if __name__ == "__main__":        
    filename = 'corncob_lowercase.txt'
    noun = set()
    verb = set()
    whole_words_set = {word.rstrip() for word in open(filename)}

    for word in whole_words_set:
        if word.endswith('ment'):
            noun.add(word)
        elif word.endswith('ing'):
            if word[:-3] in whole_words_set:
                verb.add(word[:-3])
            elif word[:-3]+"e" in whole_words_set:
                verb.add(word[:-3]+"e")
    noun_list = list(noun)
    verb_list = list(verb)
    while True:                   
        sentence = "%s %s %s" % (random.choice(noun_list),
                                 random.choice(verb_list),
                                 random.choice(noun_list))                                                                                           
        print(sentence)
        if input("Produce more? (Y/N)").lower() == "n":
            break
yegle
sumber
3
Apakah saya benar-benar payah pada Python dan Bahasa Inggris, atau apakah Anda mengeluarkan 3 kata benda, bukan 2 kata benda dan kata kerja?
ace_HongKongIndependence
@ace Ups, saya memutuskan untuk memperbaiki kode di menit terakhir :-(
yegle
0

Pesta

Mencoba menjalankan program yang ada tetapi tidak diinstal memberikan ini (di Linux Mint 13).

$ say
The program 'say' is currently not installed.  To run 'say' please ask your administrator to install the package 'gnustep-gui-runtime'
pengguna80551
sumber
Dalam distro yang berbeda, itu memberi Anda kalimat yang berbeda.
TheDoctor
Itu sebabnya saya katakan di LM13
user80551
0

Python 3

Pandangan lain di The Zen of Python , terinspirasi oleh jawaban Maxime .

import codecs
import os
import sys
import random

stdout = sys.stdout
sys.stdout = open(os.devnull, 'r+')

import this

sys.stdout.close()
sys.stdout = stdout

zen = codecs.decode(this.s, 'rot-13').splitlines()

print(random.choice(zen))
nyuszika7h
sumber
0
var vocab={
    noun:{
        tp:{
            singular:["Mike","Chan","Karl","Mithun","Debasish","Kamal","Group","Crowd","He","She"],
            plural:["They"],
        },
        fp:{
            singular:["I"],
            plural:["We"]
        },
        sp:{
            singular:["You"],
            plural:["You"]
        }

    },
    verbIndicator:{
        tp:{
            present:{
                singular:["is"],
                plural:["are"]
            },
            past:{
                singular:["was"],
                plural:["were"]
            }
        },
        fp:{
            present:{
                singular:["am"],
                plural:["are"]
            },
            past:{
                singular:["was"],
                plural:["were"]
            }
        },
        sp:{
            present:{
                singular:["are"],
                plural:["are"]
            },
            past:{
                singular:["were"],
                plural:["were"]
            }
        }
    },
    verb:{
        continuous:{
            consumer:["having"],
            performer:["doing","playing","watching"]
        },
        simple:{
            consumer:["had"],
            performer:["did","played","watched"]
        }
    },
    dependentAction:{
        consumer:["food","fun","badtime"],
        performer:["movie","cricket","song","dance"]
    },
    independentAction:["Cooking","Playing","singing"],
    adjective:["good","bad","excellent","awesome"],
    object:["boy","Person","girl","Human being","Man","Mental"]
}

var referenceBook={
    figure:["fp","sp","tp"],
    time:["present","past"],
    singularity:["singular","plural"],
    verState:{
        present:["continuous"],
        past:["continuous","simple"]
    },
    objectRole:["consumer","performer"]
};

function getTerm(term) {
    var cur = referenceBook[term] || [];
    var randomIndex = Math.ceil((Math.random() * 93967)) % cur.length;
    return cur[randomIndex]

}
function getToken(key) {
    var path = key.split("-");
    var token = vocab;
    path.forEach(function(s) {
        token = token[s];
   });

    return token[Math.ceil((Math.random() * 1000)) % token.length];

}

function generateSentence(rules) {
    rules.forEach(function(str) {
        var m = str.match(/{[^}]*}/g)

        var variable = {};
        if (m) {
            m.forEach(function(s) {
                s = s.replace(/(^{)|(}$)/g, "");
                variable[s] = getTerm(s);
            });

            for (var each in variable) {
                str = str.replace(new RegExp("{" + each + "}", 'g'), variable[each]);

            }
        }
        var cur = str.split("|");
        var sentence = "";
        cur.forEach(function(s) {
            sentence += " " + getToken(s);

        })
        console.log(sentence);

    })


};
/*

In the rules array, I specify rules for the sentence to be genrated

*/

var rules = [
    "noun-{figure}-{singularity}|verbIndicator-{figure}-{time}-{singularity}|verb-continuous-{objectRole}|dependentAction-{objectRole}", 
    "noun-sp-singular|adjective|object"
];

generateSentence(rules);
Chandrajith Belliappa Chan
sumber
4
Silakan sebutkan bahasa ini.
Rodolfo Dias
1
@RodolfoDias Saya cukup yakin ini Javascript ... meskipun tidak.
TheDoctor