Wygeneruj zrozumiałe zdanie

55

Problem:

Wygeneruj zdanie, które można odczytać i zrozumieć. Musi zawierać podmiot, czasownik i obiekt, a czasy i liczby mnogie muszą się zgadzać. Program musi także być w stanie wygenerować kilka różnych zdań, aby się zakwalifikować.

Zasady:

  • Twarde kodowanie zdań jest niedozwolone i nie odczytuje ich bezpośrednio z pliku (patrzę na ciebie, niedbale)
  • Możesz mieć dowolną liczbę list słów
  • Prześlij przykładowe zdanie lub 2 wygenerowane przez Twój program
  • Każdy język jest akceptowany
  • To , więc wygrywa najbardziej pozytywna odpowiedź
Doktor
źródło
7
Sądzę, że z niektórych odpowiedzi ( MatLab patrzę na ciebie) wynika, że ​​należy zmodyfikować reguły, tak aby eksploracja danych nie mogła wyciągać kolejnych słów z żadnego źródła.
Carl Witthoft
Podczas gdy jestem inteligentnym: ponieważ jest to wyłącznie konkurs popularności, ktoś powinien po prostu opublikować plik jpg HotModelBikini. Otrzymasz więcej głosów niż cokolwiek innego.
Carl Witthoft
7
Będę głosować za każdym, kto użyje powtórzeń „bawoła” lub „ryby” jako przykładowych zdań!
7
Większość odpowiedzi tutaj albo wyszukuje prawidłowe, pełne zdania ze źródeł tekstowych, albo generuje wyniki, które nie spełniają kryteriów. Oba podejścia wydają mi się sprzeczne z duchem pytania! Jeśli ktoś naprawdę chce zrobić wrażenie, czy mogę zasugerować program, który zaczyna się od zestawu prawidłowych struktur zdań, takich jak [Adjective] [pl. noun] [verb] [adjective] [pl. noun]i wyciąga z prawdziwego słownika (może używając jednego z dostępnych interfejsów API Dictionary), aby wypełnić puste pola? Sam bym to napisał, gdybym miał kilka minut do stracenia! :( W końcu ...Lazy Developers Write Lousy Programs.
Brian Lacy
1
@ Listy słów Pureferret byłyby listami pojedynczych słów. Kodowanie na stałe byłoby listą pełnych zdań. W przypadku list słów zwykle potrzebujesz trochę logiki w programie, aby ułożyć pełne zdanie. W przypadku zdań zakodowanych w zasadzie wystarczy wydrukować oświadczenie.
8bittree

Odpowiedzi:

87

Grzmotnąć

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

Wymagania: źródło jądra linuksa zainstalowane w / usr / src

Wyciąga losowe komentarze ze źródła jądra. To, czy zdania są rzeczywiście zrozumiałe, jest przedmiotem dyskusji.

Przykłady rzeczywistej produkcji:

  • 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
Zamieszki
źródło
12
Dobry! Powinieneś pobrać je wszystkie i przesłać jako oficjalną fortunebazę danych.
Jason C
18
„???” najlepszy komentarz w historii
Ray
4
Czy nie jest naruszona pierwsza reguła „ani odczytanie ich bezpośrednio z pliku”?
kuldeep.kamboj
6
Powiedziałbym, że przeszukiwanie systemowego kodu źródłowego i odfiltrowywanie tekstu z komentarzy tak naprawdę nie liczy się jako „bezpośrednie czytanie”.
Riot
7
a Slave Overflow. ładna nazwa strony internetowej SE
TheDoctor
95

Matlab

why

przykład wyników:

>> 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.

[To jedno z pisanek Matlaba]

EDYCJA: możesz zobaczyć kod tej funkcji tutaj: dlaczego.m

Elizeusz
źródło
3
możesz zobaczyć kod tutaj: opg1.ucsd.edu/~sio221/SIO_221A_2009/SIO_221_Data/Matlab5/…
Elisha
8
Drugi przykład nie jest zdaniem. To bezokolicznik.
wchargin
2
Konieczność odpowiedzi tutaj powoduje nie tylko zdania (patrz na przykład inne wysoko głosowane odpowiedzi). Zadanie nie mówi, że musi tworzyć tylko zdania, mówi, że musi być w stanie tworzyć zdania.
Elizeusz
51

PHP

Dając wystarczająco dużo czasu, powstanie cała literatura, przeszłość, teraźniejszość i przyszłość. Reguły nie wspominały, że nie można tworzyć innych tekstów.

Ciąg 'TOS...'zapewnia logarytmiczną skalę skali liter, aby ściślej pasować do angielskiego. Służy to do generowania większego ciągu o przybliżonych względnych częstotliwościach liter.

$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);

Prowadząc go, odkryłem takie literackie klejnoty, jak:

  • GO NOW- Ty jako podmiot sugeruje się.
  • IM AOK - Nic mi nie jest
  • IM FDR - I'm F (ranklin) D (eleano) R (oosevelt)

Ponadto liczne zachęty do zwięzłego wyrażania niezadowolenia z obecnej sytuacji. [Niektóre litery zostały zredagowane.]

  • F**K
  • S**T

Również następujące przy użyciu precyzyjnego skalowania:

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

źródło
60
Kilka band małp może zrobić to samo!
Tim S.
11
Lubie Teraz stwórz program, który przetwarza wychodzące z niego litery i znajdzie zrozumiałe zdania! :)
TheDoctor,
2
+1 - jakieś szanse na zautomatyzowanie części odkrywania? Pozornie zadaniem było stworzenie * jednego * (?) Zdania. BTW: ile czasu spędziłeś;)
Wolf
20
Jak się dostać F**Ki S**Tpod warunkiem, że nie ma *w 'ABCDEFGHIJKMLNOPQRSTUVWXYZ '?
glglgl
3
@Ypnypn - 'TOS...'ciąg reprezentuje częstotliwość każdej litery w skali logarytmicznej. Więc Ama częstotliwość T, Bma częstotliwość O. Jma najniższą częstotliwość, Aktóra przekłada się na 0, z czego log odwrotny wynosi 1. Ostatni znak to spacja, która ma częstotliwość Zlub zaokrąglenie (exp (25 / 3.976)) = 538, więc spacje występują 538 razy częściej niż J. Pomyślałem, że to poprawi problem pisania małpy na maszynie do pisania .
42

do

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

Przykładowe dane wyjściowe:

Oprogramowanie spowodowało przerwanie połączenia
Przerwane połączenie systemowe należy zrestartować

Istnieje również wiele prawidłowych wyników zdań, które nie zawierają tematu, czasownika i obiektu:

Czas minął
Plik istnieje

ecatmur
źródło
jak i kiedy to się kończy? (tak, ale nie rozumiem dlaczego)
phil294
1
@ Blauhirn warunek zakończenia pętli jest --ioceniany na fałsz, gdy i(zmienna typu charo wartości początkowej 0) ponownie osiągnie wartość 0. Jeśli charjest bez znaku (np. ARM), inatychmiast zawinie się do największej wartości (zwykle 255) i odlicza do 0. Jeśli charjest podpisany (większość systemów Intel), zachowanie jest ściśle niezdefiniowane, ale zwykle po osiągnięciu wartości minimalnej ( zwykle -128) zawinie się do maksimum (zwykle 127) i odlicza do zera, więc program zwykle wydrukuje w sumie 256 linii.
ecatmur
37

Jawa

Wyciąga wprowadzenie z przypadkowego artykułu w Wikipedii:

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 + ".");
    }
}

Czasami masz pecha; Próbuję to zminimalizować, ustawiając minimalną długość zdania i odfiltrowując zdania kończące się na „:” (wszystkie strony ujednoznaczniające zaczynają się w ten sposób) lub zawierają „?” (wydaje się, że istnieje wiele artykułów o nierozwiązanych nieznanych informacjach oznaczonych znakami zapytania). Granice zdań to kropka, po której następuje biała spacja, po której następuje cyfra lub duża litera.

Filtruję również tekst w nawiasach (wynik jest nadal prawidłowym zdaniem), aby spróbować usunąć niektóre kropki, które nie są granicami zdań. Filtruję kwadratowe nawiasy klamrowe, aby usunąć źródłowe numery cytowań. Przykłady:

  • Idle Cure to zespół rockowy z Long Beach w Kalifornii.
  • Samoogniskowanie jest nieliniowym procesem optycznym indukowanym przez zmianę współczynnika załamania światła materiałów narażonych na intensywne promieniowanie elektromagnetyczne.
  • TB10Cs4H3 jest członkiem klasy niekodującej RNA podobnej do H / ACA, która kieruje miejscami modyfikacji urydyn do pseudourydyn substratowych RNA.
  • Sześciogłowy Dziki Baran w mitologii sumeryjskiej był jednym z Bohaterów zabitych przez Ninurta, patrona boga Lagasha, w starożytnym Iraku.
  • Sugar Daddy to slangowe określenie mężczyzny, który oferuje wsparcie typowo młodszej kobiecie lub mężczyźnie po nawiązaniu związku, który jest zazwyczaj seksualny.
  • Old Bethel United Methodist Church znajduje się przy 222 Calhoun St., Charleston, Karolina Południowa.
  • Douglas Geers to amerykański kompozytor.

Jeśli zauważysz jakieś problemy gramatyczne, to twoja wina, że ​​nie jesteś pracowitym edytorem Wikipedii! ;-)

Jason C.
źródło
4
Z pewnością istnieje różnica między „ważnym” a „zrozumiałym”. Mam tu dla ciebie trochę pseudourydyn substratu RNA, kochanie.
Jason C
1
Dostałem to po raz pierwszy: Echinolittorina africana / Litorina africana Philippi, 1847 / Litorina decollata Philippi, 1847 / Littorina africana / Littorina perplexa Turton, 1932 / Nodilittorina africana./ Wygląda na to, że istnieje kilka stron Wiki, które należy wykluczyć z twojego Szukaj! ;) Ha ha! OMG, kiedy uruchomiłem go po raz drugi, zwrócił wiersz ze strony Wiki Michaiła Gorbaczowa. Kto dzieli moje pierwsze imię. Całkiem dziwaczny.
mikhailcazi
2
„/” Tak naprawdę tam nie było! Haha: PI użył go do przedstawienia nowych linii. Może powinienem użyć \ n. Pochodzi stąd: en.wikipedia.org/wiki/Afrolittorina_africana . Tabela po prawej, pod synonimami :) W każdym razie nie było to złe wrażenie, więc nie martw się, ponieważ ta sprawa Michaiła Gorbaczowa była całkiem fajna. Wszystkie późniejsze zdania były normalne.
mikhailcazi
2
Być może ta fizyka odpowiada ciekawemu, niedawnemu współautorowi jednego z tych artykułów.
EP
2
Może to być jeden powszechny, ale bardzo nieintuicyjny aspekt prawdopodobieństwa: wydarzenia na milion mogą być dość powszechne w świecie z miliardami ludzi. To powiedziawszy, nie jestem pewien, co powiedziałaby analiza formalna. Byłem też dość zaskoczony! Możesz również zauważyć, że nie ma w tym „innego faceta”.
EP
34

Soooo ... Ponieważ jest to , dobrze się bawiłem evalz funkcjami. Zasadniczo generuję liczbę losową, a następnie wykonuję losową funkcję na podstawie tej liczby (na twojej twarzy switch,!) Za pośrednictwem eval.

PHP, ~ 9k poprawnych wyników

<?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."();");

?>

Niektóre wyjścia ...

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
źródło
@ nyuszika7h, PHP_EOLjest zawsze równy \nlub \r\n, w zależności od systemu operacyjnego, ale nigdy <br>lub podobny.
timmyRS
@ timmyRS Tak, masz rację, to jest stary komentarz, nie wiem, dlaczego to wtedy napisałem.
nyuszika7h
33

Projekt PHP + Gutenberg

Napisałem skrypt PHP, który zamienia zwykły dokument tekstowy w zestaw słów bigrams , które następnie wykorzystuje do generowania losowych zdań. Oto niektóre z lepszych przykładów, jakie wygenerował z całej wersji tekstowej przemówienia Patricka Henry'ego „Give Me Liberty Or Give Me Death” , w tym drobny druk Project Gutenberg:

  • Projekt Gutenberg Etext narodów i niewolnictwo!

  • Przepraszamy za 200. rocznicę tego drobnego druku!

  • NIE MASZ INNYCH GWARANCJI ŻADNEGO RODZAJU, WYRAŹNYCH LUB PRZYPADKOWYCH SZKÓD, ale dla mnie śmierć!

Możesz to wypróbować tutaj. Odśwież stronę, aby uzyskać nową partię zdań.

Jeśli chcesz sam uruchomić kod źródłowy, nie zapomnij załadować $src_textwybranego tekstu zwykłego.

<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>
piskliwy kostuch
źródło
+10 Ten naprawdę oddaje ducha wyzwania! Nie mogę go teraz znaleźć, ale kiedyś znajdował się internetowy generator zdań Google, który działał w podobny sposób, ale bigramy (lub opcjonalnie większe n-gramy) pochodzą z wyników wyszukiwania Google, wyszukując słowo i obserwując co nastąpiło po nim we fragmentach podglądu wyników wyszukiwania. Może odtworzę go i opublikuję tutaj.
Jason C
Co powiesz na ten! „Sir, okazało się, że z przyjemnością ulepszyliśmy konkurs”. Albo ten! „Mówią nam o zwrocie okropnego momentu na ulepszenie części Etext 6 Data ostatniej aktualizacji: 5 maja 2005 r. Oficjalnie wydany tylko dla naszych bitew.”
Hosch250
1
But for me, death!: DI chciałbym, aby wszystkie licencje / umowy zakończyły się tak mocno.
Navin
Haha, „Oficjalnie wydany tylko dla naszych bitew”.
Jason C,
1
Nie mam niczego." :(
TheNumberOne
29

Pyton

Ten wpis wybiera słowa z całego słownika systemowego. Wykorzystuje to, że większość rzeczowników można przekształcić w czasowniki i odwrotnie. Wykorzystuje kilka heurystyk do klasyfikowania słów i unikania oczywistych niemożliwości.

Wytwarza kilka prawie rozsądnych stwierdzeń:

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

Wiele szalonych:

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

I wiele rzeczy, które brzmią jak Monty Python tworzący sprośne insynuacje:

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.

Wersja 3 została zmodyfikowana, aby przyjmować dowolny plik tekstowy jako dane wejściowe:

$ 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.

Kod (wersja 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
źródło
3
Przykładowe zdania tak bardzo mnie rozśmieszają, że płaczę! xD
mikhailcazi
cat FILE | COMMAND? UUOC ;)
nyuszika7h
Dziękuję @ nyuszika7h, nauczyłem się dziś czegoś. Zerwanie z tym starym nawykiem może być jednak trudne ...
AShelly
1
This smoke toasted some nonresidents.. WOAH.
phil294
25

Grzmotnąć

Zainspirowany odpowiedzią Matlaba. Zakłada, że ​​masz aptitudezainstalowany.

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

Możliwe wyniki (zrzut ekranu z tego artykułu z Wikipedii)

wprowadź opis zdjęcia tutaj

ace_HongKongIndependence
źródło
7
Nie sądzę, żeby . /----\ -------/ \ / \ / | -----------------/ --------\ ----------------------------------------------to było prawidłowe zdanie.
svick
1
@svick you winmoże być zdaniem (sugerowany jest obiekt „argument”). I nawet jeśli tak nie jest, pytanie nie zabrania przypadków, w których dane wyjściowe są nieprawidłowe.
ace_HongKongIndependence
23

Pyton:

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

Próbki:

  • Buffalo Buffalo Buffalo.
  • Buffalo Buffalo Buffalo Buffalo Buffalo Buffalo Buffalo Buffalo.

Niestety, ma nieco słabą obsługę interpunkcji i wielkich liter, ale znowu te nie zostały wymienione jako wymagania.

Również tutaj jest odniesienie.

8bittree
źródło
3
Nie dodawaj spacji do literałów bawołów; zamiast tego użyj ' '.join(l). Pozbędzie się to końcowej przestrzeni. Następnie możesz po prostu dodać kropkę.
Blacklight Shining
@BlacklightShining Zaktualizowano. Dzieki za sugestie.
8bittree
Nie ma za co. I +1 dla bawołu. :)
Blacklight Shining
1
print " ".join(takewhile(lambda _: randint(0, 5), repeat("buffalo"))).capitalize() + "."
Wyrażono za
16

Rdza + Toki Pona

Dowolny język jest akceptowany, więc napisałem program w Rust, który generuje zdania w Toki Pona .

Toki Pona to próba stworzenia minimalnego języka naturalnego i ma bardzo prostą i regularną gramatykę. To bardzo przydatna właściwość do tego konkursu!

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);
}

Nie mówię po Toki Pona, ale znalazłem składnię Toki Pona jako zestawu reguł BNF na Wikipedii. Stworzyłem jedną strukturę lub wyliczenie dla każdej reguły BNF i opatrzyłem je adnotacjami deriving(Rand), co daje mi sposób na wygenerowanie losowej Phrasestruktury za darmo! Następnie zaimplementowałem ToStrdla każdej z tych struktur, aby przekonwertować je na ciąg.

Celowo zostawiłem nazwy struktur w języku francuskim, ponieważ zasady BNF, które znalazłem, są w języku francuskim, a także dlatego, że przywraca wielojęzyczny charakter mojego przesłania!

Przykładowe wyniki

Niektóre wyniki i ich tłumaczenia, które zrobiłem w oparciu o reguły BNF i słownik Toki Pona . Jestem pewien, że te tłumaczenia są w większości błędne, ale Toki Pona faktycznie pozostawia wiele miejsca na interpretację zdania.

nasin mi tawa la jan li jaki

Podczas mojej podróży ktoś został zanieczyszczony

monsi li jaki li jan ike musi

Tyłek jest brudny i jest zabawnym złym człowiekiem

sina li tawa ale jelo e kili tawa e insa

Przeniosłeś owoc i środek do żółtego wszechświata

Zagadnienia

  • Nie sprawdzam, czy czasownik jest przechodni, czy nie, dlatego niektóre zdania są gramatycznie niepoprawne.
  • Niektóre struktury są rekurencyjne, a gdy reguła może zostać powtórzona losowo wybieram 0, 1 lub 2 elementy. Może to prowadzić do bardzo długo generowanych zdań zawierających tysiące słów ...
  • Naprawdę nie mogę zweryfikować poprawności danych wyjściowych, polegam całkowicie na składni BNF, słowniku i własnych zgadywankach :)
Barjak
źródło
1
sina li tawa ale jelo e kili tawa e insa == "Przeniosłeś owoc i centrum do żółtego wszechświata" Całkiem nieźle jak na maszynę, zwykle tylko zaawansowani użytkownicy tp mogą korzystać z konstrukcji transformujących.
MatthewMartin
1
monsi li jaki li jan ike musi == Butt (ass? as in jerk?) jest brudny i jest zabawnym złym człowiekiem.
MatthewMartin
1
Hej dzięki za komentarze, @MatthewMartin! Z pewnością nie spodziewałem się, że mówca Toki Pona obejrzy moje zgłoszenie, ale cieszę się, że te sentecje nie są kompletnym bełkotem :)
barjak
Wskazówka: To nie jest golf golfowy.
nyuszika7h
1
@ nyuszika7h Nie jestem pewien, jaki jest cel Twojego komentarza. Rzeczywiście, nie jest to golf golfowy, ponieważ jest to konkurs popularności.
barjak
14

Pyton

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
źródło
7
Czy możesz argumentować, że import antigravityprowadzi to do wyniku I LEARNED IT LAST NIGHT! EVERYTHING IS SO SIMPLE!? : D
ace_HongKongIndependence
Bez wątpienia tak.
Renae Lider
14

Prolog

Użyj cofania prologa i gramatyki generatywnej zbliżonej do gramatyki angielskiej, aby wygenerować wszystkie możliwe zdania.

Ta wersja ma dość ograniczone słownictwo i strukturę zdań, ale powinna być dość łatwa do rozszerzenia.

Kod:

% 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, []).

Uruchom to zapytanie:

sentence(L).

wygenerować wszystkie możliwe zdania w tym języku.

Niektóre przykładowe wyniki:

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] ;

(EDYCJA: Zezwól na podrzędne klauzule obiektowe).

chrisd
źródło
1
Jakieś przykładowe wyniki zdań?
TheDoctor
Tak, w odpowiedzi umieściłem kilka próbek. Generuje w sumie 2520 wyników, więc nie mogę opublikować ich wszystkich ...
Chris
11

Pyton

Jak wiesz, możesz zrobić wszystko w Pythonie za pomocą kilku imports. To proste zadanie można wykonać za pomocą 2-wierszowego skryptu python.

import random

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

Liczba zdań wygenerowanych przez ten skrypt jest ogromna: 10^12różne zdania. Jeśli odczytanie sentece zajmie Ci około 0,5 sekundy, to przeczytanie ich wszystkich zajmie ponad 15000 lat!

Kilka przykładowych zdań:

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

Jednak wszystkie wygenerowane zdania zawierają temat, czasownik i obiekt.

AKTUALIZACJA:

Otrzymałem krytykę niektórych wyrafinowanych słów, które to złożone narzędzie może wywołać. Oto nieco dłuższa wersja, która powinna być zgodna z większością list słów.

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))])+'.')

Oto kilka przykładowych zdań:

  • 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
źródło
Nie udało mi się znaleźć niektórych z twoich słów w moim słowniku
dr belizariusz
5
Dostosowałem swoje oprogramowanie, aby lepiej pasowało do Twojego słabego słownika.
Antonio Ragagnin
2
Dobrze. Za 15000 lat poświadczę, że znalazłem je wszystkie
dr belizariusz
10

Zabawa ze słownikiem wewnętrznym 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

Masz szczęście, powiedzmy, w 70% przypadków. Generuje takie rzeczy jak:

amigdaloidowy obwód elektryczny
Parkia nie był restrykcyjny, choć poszarpał
jego długofalowe społeczeństwo
Doktor edukacji niezrozumiała odpowiedź na kibuc
mały teatr muzyczny przeciwko Juliuszowi Cezarowi
i kowalikowi Tai
w kojcu w centrum sportowym przeciw twojej niggardity
wymagane zewnętrzne detergenty
bez nekromancji czarnoksiężnika
te żyły pectoralis naprzeciwko latrii trofeum żona trendy trendy inwestorzy brązowy
co przenośne pole ognia
umbra uroczo po co moja odpowiedź
kolejna śrubokręt gruz burza bezzapachowy zapachowy kompleks Aral Sea wafel
dla rzekomej rozkoszy mongoloid typu metal

ale czasami:

adopcja kopalni przynajmniej za bitwę pod Lutzen przyniosłaby gotówkę w czasie, gdy Hejira tasaka
dziewięć pospolitych subdukcji Shiner rodzaj Seiurus rozgrzewa swoją publiczność

No cóż, jego angielski jest lepszy niż mój.

Dr Belizariusz
źródło
8

VBA / Excel

[edytuj 2]

Nauczyłem go, jak koniugować czasowniki, poniższe przykłady są proste w czasie przeszłym:

Umiarkowana dzika kokaina zbliżyła się do historycznej natychmiastowej decyzji. Regionalny rozdział dotyczący bezpieczeństwa zatrzasnął się wewnątrz licznych przypadkowych istot. Żółta prawa domena usunięta za magnetyczną kruchą płcią. Fizyczne śmiertelne zanieczyszczenie zaczęło się obok martwej złej sensacji. Odważny teatr poznawczy znalazł się na czele kruchej świadomej literatury. Konwencjonalna rzeczywista wydajność opierała się z dala od ulubionego miejsca odpornościowego. Naprawiony bliźniak gospodarczy rozpoznany na podstawie złej ludzkiej konieczności.

Poniżej znajduje się odpowiedni kod, z wyłączeniem szeregu nudnych pomocniczych funkcji parsowania i zapętlania. Głównymi brakującymi częściami są różne listy słów (według części mowy), które wykonują pluralizację, czasy, koniugacje itp.

Wszystkie pierwiastki słów są wybierane losowo, ale zmuszam je do ułożenia według określonego zdania:

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

... tego właśnie użyłem, aby wygenerować wynik powyżej. Wynika to z ogólnej formy: „Szybki czerwony lis przeskoczył nad leniwym brązowym psem”.

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

[rozpocznij oryginalny post]

Wciąż trwają prace, trzeba dodać logikę dla czasów i pluralizacji rzeczowników / czasowników, a mianowicie:

Twoja średnia podróż to nasza domniemana dawka ani wzrost temperatury poza moim pomidorem.

... który jest parsowalny, ale nie ma większego sensu.

Programowanie umożliwia ich brudnemu rybakowi daleko do naszego rzutu wieprzowiny zamiast zdania.

Dobrze. Naprawdę nie zdanie, ale lepsze niż niektóre komunikaty o błędach JavaScript.

Jego odwołanie podnosi każde żywe pytanie, które moja pani naszkicuje w języku angielskim.

Rutyna insynuacji jest prawie na najwyższym poziomie ...

Kod do śledzenia anon. Czy ten konkurs ma termin?

[edytuj 1]

Kod, który wygenerował powyższe.

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
źródło
5
Gdzie jest twój kod
ace_HongKongIndependence
Zobacz moją edycję kodu.
Brandon R. Gates
6

Perl 5

OK, wnętrzności programu są takie:

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

Jest to w zasadzie silnik „madlib”. Aby faktycznie wygenerować ciekawe zdania, musisz wypełnić %padniektóre dane. Oto przykład %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',
  ],
);

Oto kilka przykładów mądrości, którą z tego odkryłem %pad. Zdania te nie były edytowane pod względem długości, interpunkcji, gramatyki itp., Chociaż wybiłem kilka nieciekawych zdań i przestawiłem kolejność, w jakiej pojawiają się zdania - nie są już w kolejności, w jakiej zostały wygenerowane, ale zamiast tego próbuję użyj ich, aby opowiedzieć historię: historię, która, mam nadzieję, będzie dla ciebie zarówno wzruszająca, jak i prowokująca do myślenia.

  • Pajęczyny są krótkie.
  • Pajęczyny regularnie fascynują.
  • Krótkie małpy błyszczą, ale pajęczyny piją łapczywie.
  • Lśniące (ale śmierdzące) małpy podążyły za małym (ale musującym) gorylem.
  • Na szczycie góry Mount Everest powitano wysoko zdobionego stegozaura.
  • Drogi na szczycie góry Everest są nie tylko drogie, ale także obsada telewizyjnej „Glee” podążająca za błyszczącym gorylem.
  • Obsada telewizyjnej „Glee” przypomina liliową skrzynkę pocztową.
  • Droga skrzynka pocztowa jest wysoka, a drogi stegozaur skacze Chucka Norrisa, a zielone buty przeskakiwały kanapkę z sałatką z wołowiny.
  • Kanapka z sałatką wołową uwielbiała Chucka Norrisa.
  • Miliony lśniących węgorzy są zielone (ale upiorne).
Tobyink
źródło
Teraz, jeśli można programowo wypełnić pad
Pureferret
Programowe wypełnianie padów nie stanowi większego wyzwania. Wystarczy zeskrobać Wikisłownik lub coś takiego. Nie dałoby to jednak takich zabawnych zdań.
tobyink
To nie jest duże wyzwanie, ale myślę, że to fajna część.
Pureferret,
5

Pani Word

Nie jestem pewien, czy jest to akceptowalne, ale ponieważ HTML jest, myślę, że powinno to być również dopuszczalne.

 =rand(1,1)

Przykładowe zdania:

Na karcie Wstaw galerie zawierają elementy, które są zaprojektowane tak, aby koordynować z ogólnym wyglądem dokumentu.

Za pomocą tych galerii można wstawiać tabele, nagłówki, stopki, listy, strony tytułowe i inne bloki konstrukcyjne dokumentów.

możesz także podać dowolną liczbę zdań i akapitów.

Mhm
źródło
4

Prace w toku przy użyciu JSoup i 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);
        }
    }

}

Zagadnienia:

  • Zdania są zbyt proste
  • Czasami 404 (bez dobrego obchodzenia się!)
  • Generuje tylko jedno zdanie na raz
  • Wykorzystuje obudowę przełącznika!

Przykładowe wyniki:

Popoloca prickshes fasolka szparagowa.
Zwrotnik Koziorożca unosi ciała.
Pekin zsynchronizował pudełka na poduszki.
Czukczi zakulturował wpływanie.

Pureferret
źródło
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])];

Spowoduje to pobranie 30 najbardziej popularnych wyszukiwań w Google, wyszukiwanie „I Feel Lucky”, a następnie wyświetlenie losowego zdania z tej strony zawierającego co najmniej 3 słowa.

Przykłady:

„Była uważana za faworytkę medalu podczas imprezy”.

„Kate ukończyła szkołę średnią rok wcześniej”.

„15 kwietnia 2014 r. W celu promowania zgodności z polityką dotyczącą biografii żywych ludzi”.

„W imieniu Bryana my, jego rodzina, chcielibyśmy podziękować wszystkim za wylanie miłości, modlitw i wsparcia”.

„Ten artykuł dotyczy amerykańskiego koszykarza”.

„Niestety, Twoja przeglądarka ma wyłączoną obsługę JavaScript lub nie ma żadnego obsługiwanego odtwarzacza.”

primo
źródło
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])"

wynik:

Wygeneruj zdanie, które można odczytać i zrozumieć

eqzx
źródło
Użyj identyfikatorów URI udostępniania Stack Exchange (np. /q/21571Zamiast /questions/21571/generate-an-understandable-sentence).
Blacklight Shining
2
Ponieważ nie jest to golf golfowy, podział na wiersze dla czytelności byłby miły.
nyuszika7h
2

Skrypty powłoki

Ten skrypt zawsze wyświetla tytuł pierwszego pytania, które jest aktualnie na górze tej witryny. Zakładam, że tytuł pytania będzie zawsze czytelny dla człowieka. I zmieni się dynamicznie. Tak więc, gdy pojawi się nowe pytanie i skrypt zostanie wykonany, poda najnowszy tytuł pytania.

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

Wyjście z próby 1

Find words containing every vowel

Wyjście z próby 2

Hello World 0.0!

EDYTOWAĆ

Nie używa żadnych plików. Bez plików mogę użyć poniższego skryptu.

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

Wynik

Generate an understandable sentence
Ramesh
źródło
1
nie czyta ich bezpośrednio z pliku ...
rafaelcastrocouto
Wprowadziłem zmiany, aby nie używać pliku. Teraz użył tylko zmiennych. Co powiesz na ten?
Ramesh
2
usunięto głosowanie!
rafaelcastrocouto
2

JavaScript (ES6)

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

Uruchomienie go w konsoli powoduje

foo is not defined
null has no properties
radix must be an integer at least 2 and no greater than 36
Oriol
źródło
Jeszcze krótszy:t='';for(f of [_=>foo,_=>null.a,_=>0..toString(0)])try{f()}catch(e){t+=e.message+'\n'}t
Szczoteczka do zębów
2

Kolejny skrypt w języku Python

Odpowiedź user3058846 nie jest zły, ale to co wyświetla zdań, za każdym razem. Tutaj proponuję skrypt, który generuje losowe zdanie z Zen Pythona :

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))

W jednej linii dla fanów :

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, brudny.)

Przykłady:

>>> 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.


Kolejny fajny sposób w Pythonie

Dzięki @TheDoctor wlej ten pomysł :-) Wycisz dane wyjściowe importu, a następnie graj z pseudoszyfrowanym dyktem w module.

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
źródło
Zasadniczo jest to zła praktyka shell=True. Chociaż w tym przypadku nie jest to niebezpieczne, ponieważ nie bierzesz udziału użytkownika, wybrałbym subprocess.Popen(('python', '-c', 'import this')).
nyuszika7h
Czy wiesz, czy możesz wyciszyć wiersz import this, w module znajduje się zmienna thiszawierająca cały tekst, ale zaszyfrowana. Istnieje również słownik do jego odszyfrowania.
TheDoctor
1
@TheDoctor Spójrz na moją zaktualizowaną odpowiedź: D
Maxime Lorant
1

Python 3

Gwarantujemy generowanie gramatyki! (Zazwyczaj.)

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)

Aby było idealnie gramatyczne, usuń podkreślenie z wordregex. Zapobiegnie to wprowadzaniu wielu słów, które prowadzą do złych zdań, takich jak „Spakujemy cię”.

Przykładowy przebieg:

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?

Ulubione dotychczasowe wyniki:

They you her.

Sprawdź: http://en.wiktionary.org/wiki/you#Verb .

DLosc
źródło
0

Pyton

Wynik:

$ 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)

Użyłem tutaj listy słów Znajdź słowa zawierające każdą samogłoskę

Można dodać więcej reguł. Na przykład, jeśli słowo kończące się na „ness” i słowo istnieje również w zestawie bez przyrostka, to jest to rzeczownik.

Kod źródłowy:

#!/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
czatować
źródło
3
Czy naprawdę mam do czynienia z Pythonem i angielskim, czy wypisujesz 3 rzeczowniki zamiast 2 rzeczowników i czasownika?
ace_HongKongIndependence
@ace Ups, postanowiłem naprawić kod w ostatnich minutach :-(
yegle
0

Grzmotnąć

Próbuje uruchomić program, który istnieje, ale nie jest zainstalowany (w 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'
użytkownik80551
źródło
W różnych dystrybucjach daje inne zdanie.
TheDoctor
Dlatego powiedziałem w LM13
user80551
0

Python 3

Kolejne ujęcie w Zen of Python , zainspirowane odpowiedzią Maxime'a .

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
źródło
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
źródło
4
Proszę podać, który to język.
Rodolfo Dias,
1
@RodolfoDias Jestem pewien, że to Javascript ... ale nie jestem pewien.
TheDoctor,