Genera una frase comprensibile


55

Problema:

Genera una frase che può essere letta e compresa. Deve contenere un soggetto, un verbo e un oggetto e i tempi e i plurali devono corrispondere. Il programma deve anche essere in grado di generare diverse frasi diverse per qualificarsi.

Regole:

  • Non è consentito codificare le frasi in modo rigido, né leggerle direttamente da un file (ti sto guardando, non-carne)
  • Puoi avere un numero qualsiasi di elenchi di parole
  • Invia una frase di esempio o 2 che sono stati generati dal tuo programma
  • È accettata qualsiasi lingua
  • È un , quindi vince la risposta più votata

7
Penso che sia chiaro da alcune delle risposte ( MatLab ti sto guardando) che dovresti modificare le regole in modo tale che il data mining non sia autorizzato a estrarre parole consecutive da qualsiasi fonte.
Carl Witthoft,

Mentre io sono uno smartass: dal momento che è puramente un concorso di popolarità, qualcuno dovrebbe semplicemente pubblicare un jpg HotModelBikini. Otterrà più voti di ogni altra cosa.
Carl Witthoft,

7
Valuterò chiunque utilizzi ripetizioni di "bufalo" o "pesce" come frasi di esempio!

7
La maggior parte delle risposte qui estrae frasi valide e complete da fonti di testo o genera output che non soddisfano i criteri. Per me, entrambi gli approcci sembrano contrari allo spirito della domanda! Se qualcuno vuole davvero stupire, potrei suggerire un programma che inizia con una serie di strutture di frasi valide come [Adjective] [pl. noun] [verb] [adjective] [pl. noun]e estrae da un dizionario reale (magari utilizzando una delle API del dizionario disponibili là fuori) per riempire gli spazi vuoti? Lo scriverei da solo se avessi qualche minuto da perdere! :( Dopo tutto ...Lazy Developers Write Lousy Programs.
Brian Lacy,

1
Gli elenchi di parole di @Pureferret sarebbero elenchi di singole parole. La codifica rigida sarebbe un elenco di frasi complete. Con gli elenchi di parole, in genere è necessario un po 'di logica nel programma per mettere insieme una frase completa. Con frasi codificate, in pratica hai solo bisogno di una dichiarazione stampata.
8

Risposte:


87

bash

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

Requisiti: sorgente del kernel Linux installata in / usr / src

Questo estrae i commenti casuali dal sorgente del kernel. Se le frasi siano effettivamente comprensibili è aperto al dibattito.

Esempi di output effettivo:

  • 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

12
Buona! Dovresti estrarli tutti e inviarlo come fortunedatabase ufficiale .
Jason C,

18
"???" miglior commento di sempre
Ray

4
Non viene violata la prima regola "né li legge direttamente da un file"?
kuldeep.kamboj,

6
Direi che cercare nel codice sorgente del sistema e filtrare il testo dai commenti non conta davvero come "leggere direttamente".
Rivolta il

7
e Slave Overflow. bel nome per un sito web SE
TheDoctor,

95

Matlab

why

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

[Questa è una delle uova di Pasqua di Matlab]

EDIT: puoi vedere il codice di questa funzione qui: why.m



8
Il secondo esempio non è una frase. È una frase infinita.
mercoledì

2
Il must delle risposte qui produce non solo frasi (guarda le altre risposte più votate per esempio). L'attività non dice che deve creare solo frasi, dice che deve essere in grado di produrre frasi.
Eliseo

51

PHP

Dato abbastanza tempo, questo produrrà tutta la letteratura, passato, presente e futuro. Le regole non menzionano che nessun altro testo può essere prodotto.

La stringa 'TOS...'fornisce una frequenza di scala logaritmica delle lettere per abbinare meglio l'inglese. Questo è usato per generare una stringa più grande con le frequenze approssimative delle lettere relative.

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

Eseguendolo, ho scoperto gemme letterarie come:

  • GO NOW- Tu come soggetto è implicito.
  • IM AOK - Sto bene
  • IM FDR - Sono F (ranklin) D (eleano) R (oosevelt)

Inoltre, numerose invettive per esprimere concisamente il dispiacere per la situazione attuale. [Alcune lettere sono state redatte.]

  • F**K
  • S**T

Inoltre, quanto segue utilizza il ridimensionamento ottimizzato:

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

60
Perché un gruppo di scimmie potrebbe fare lo stesso!
Tim S.

11
Mi piacciono! Ora crea un programma che elabori le lettere che ne escono e trova frasi comprensibili! :)
TheDoctor,

2
+1 - ci sono possibilità di automatizzare la parte da scoprire? Apparentemente il compito era produrre * una * (?) Frase. A proposito: quanto tempo hai trascorso;)
Wolf

20
Come sei arrivato F**Ke S**Tfornito non c'è *in 'ABCDEFGHIJKMLNOPQRSTUVWXYZ '?
glglgl,

3
@Ypnypn - La 'TOS...'stringa rappresenta la frequenza di ogni lettera in una scala logaritmica. Quindi Aha frequenza T, Bha frequenza O. Jha la frequenza più bassa Ache si traduce in 0, di cui il registro inverso è 1. L'ultimo carattere è lo spazio, che ha frequenza Zo giro (exp (25 / 3.976)) = 538, quindi gli spazi si verificano 538 volte più spesso di J. Ho solo pensato che potesse dare una svolta al problema della scimmia da macchina da scrivere .

42

C

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

Esempio di output:

Il software ha causato l'interruzione della connessione
È necessario riavviare la chiamata di sistema interrotta

Ci sono anche molti output di frasi valide che non hanno soggetto, verbo e oggetto:

Il timer è scaduto Il
file esiste


come e quando termina? (sì, ma non capisco perché)
phil294

1
@Blauhirn la condizione di terminazione del ciclo diventa --ifalsa quando i(una variabile di tipo charcon valore iniziale 0) raggiunge nuovamente 0. Se charè senza segno (ad esempio ARM), iandrà immediatamente al suo valore più grande (in genere 255) e conterà fino a 0. Se charè firmato (la maggior parte dei sistemi Intel) il comportamento è strettamente definito, ma di solito una volta raggiunto il suo valore minimo ( in genere -128) si avvolgerà al massimo (in genere 127) e conterà fino a 0. Quindi il programma in genere stampa 256 righe in totale.
ecatmur,

37

Giava

Estrae la frase introduttiva da un articolo di Wikipedia casuale:

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

A volte sei sfortunato; Cerco di minimizzare questo impostando una lunghezza minima della frase e filtrando le frasi che terminano con ":" (tutte le pagine di chiarimento iniziano in quel modo) o contengono un "?" (sembrano esserci molti articoli con informazioni sconosciute irrisolte contrassegnate da punti interrogativi). I confini della frase sono un periodo seguito da uno spazio bianco seguito da un numero o una lettera maiuscola.

Filtra anche il testo tra parentesi (il risultato è ancora una frase valida) per provare a rimuovere alcuni punti che non sono i limiti di frase. Filtra parentesi quadre per rimuovere i numeri di citazione della fonte. Esempi:

  • Idle Cure era una rock band dell'arena di Long Beach, in California.
  • L'autofocalizzazione è un processo ottico non lineare indotto dalla variazione dell'indice di rifrazione dei materiali esposti a radiazioni elettromagnetiche intense.
  • TB10Cs4H3 è un membro della classe simile a H / ACA di molecola di RNA non codificante che guida i siti di modifica delle uridine in pseudouridine di RNA del substrato.
  • Il Ram selvatico a sei teste nella mitologia sumera era uno degli eroi uccisi da Ninurta, dio protettore di Lagash, nell'antico Iraq.
  • Sugar Daddy è un termine gergale per un uomo che si offre di sostenere una donna o un uomo tipicamente più giovane dopo aver stabilito una relazione che di solito è sessuale.
  • Old Bethel United Methodist Church si trova in 222 Calhoun St., Charleston, South Carolina.
  • Douglas Geers è un compositore americano.

Se noti problemi di grammatica, beh, è ​​colpa tua se non sei un diligente editor di Wikipedia! ;-)


4
C'è sicuramente una differenza tra "valido" e "comprensibile". Ho delle pseudouridine di substrato RNA per te proprio qui, piccola.
Jason C,

1
L'ho preso la prima volta che l'ho eseguito: Echinolittorina africana / Litorina africana Philippi, 1847 / Litorina decollata Philippi, 1847 / Littorina africana / Littorina perplexa Turton, 1932 / Nodilittorina africana./ Sembra che ci siano alcune pagine Wiki che dovresti escludere dalla tua ricerca! ;) Haha! OMG, la seconda volta che l'ho eseguito, ha restituito una riga dalla pagina Wiki di Mikhail Gorbachev. Chi condivide il mio nome. Abbastanza strano.
mikhailcazi,

2
Il '/' non era effettivamente lì! Haha: PI lo ha usato per rappresentare nuove linee. Forse avrei dovuto usare \ n. Viene da qui: en.wikipedia.org/wiki/Afrolittorina_africana . La tabella a destra, sotto sinonimi :) Comunque, non è stata una brutta impressione quindi non preoccuparti, perché quella cosa di Mikhail Gorbachev era piuttosto bella. E tutte le frasi dopo erano normali.
mikhailcazi,

2
Potresti trovare questa risposta di Fisica a un recente e interessante collaboratore di uno di questi articoli.
EP

2
Può essere un aspetto comune ma non intuitivo della probabilità: eventi su una volta su un milione possono essere abbastanza comuni in un mondo con miliardi di persone. Detto questo, non sono sicuro di cosa direbbe un'analisi formale. Sono stato anche abbastanza sorpreso! Puoi anche notare che non è coinvolto nessun "altro ragazzo".
EP

34

Soooo ... Dato che questo è , mi sono divertito un po 'con evale con le funzioni. Fondamentalmente generi un numero casuale e quindi eseguo una funzione casuale basata su quel numero (in faccia switch,!) Tramite eval.

PHP, ~ 9k output validi

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

?>

Alcune uscite ...

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!

@ nyuszika7h, PHP_EOLè sempre e solo uguale \no \r\n, a seconda del sistema operativo, ma mai <br>o simile.
timmyRS

@timmyRS Sì, hai ragione, questo è un vecchio commento, non so perché l'ho scritto in quel momento.
nyuszika7h

33

Progetto PHP + Gutenberg

Ho scritto uno script PHP che trasforma un documento di testo semplice in un insieme di parole bigram , che poi utilizza per generare frasi casuali. Ecco alcuni dei migliori esempi che ha generato dall'intera versione in testo semplice del discorso "Give Me Liberty or Give Me Death" di Patrick Henry , incluso il progetto Gutenberg:

  • Il progetto Gutenberg Etext di nazioni e schiavitù!

  • Ci scusiamo per il 200 ° anniversario di questa stampa piccola!

  • NON AVETE ALTRE GARANZIE DI ALCUN DANNO GENERE, ESPRESSO O INCIDENTALE, Ma per me, morte!

Puoi provarlo tu stesso qui. Aggiorna la pagina per un nuovo gruppo di frasi.

Se si desidera eseguire il codice sorgente da soli, non dimenticare di caricare $src_textcon il testo normale scelto.

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

+10 Questo inchioda davvero lo spirito della sfida! Non riesco a trovarlo ora, ma c'era un generatore di frasi online basato su Google che funzionava in modo simile, ma i bigram (o opzionalmente n-grammi più grandi) sono stati derivati ​​dai risultati di ricerca di Google cercando una parola e osservando ciò che l'ha seguito nei frammenti di anteprima dei risultati della ricerca. Forse lo ricrearò e lo pubblicherò qui.
Jason C,

Che ne dici di questo! "Signore, scopriamo che sono stati lieti di migliorare il concorso." O questo! "Ci dicono un rimborso di un terribile momento per migliorare la parte di Etext 6 Data dell'ultimo aggiornamento: 5 maggio 2005
Rilasciato

1
But for me, death!: DI desidera che tutte le licenze / accordi siano conclusi con la stessa fermezza.
Navin,

Haha, "Rilasciato ufficialmente solo per le nostre battaglie".
Jason C,

1
Non ho ottenuto nulla." :(
TheNumberOne

29

Pitone

Questa voce seleziona le parole da tutto il dizionario di sistema. Sfrutta il fatto che puoi trasformare la maggior parte dei nomi in verbi e viceversa. Utilizza alcune euristiche per classificare le parole ed evitare evidenti impossibilità.

Produce alcune dichiarazioni quasi sane:

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

Molti pazzi:

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

E un sacco di roba che suona come Monty Python che crea insinuazioni oscene:

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.

La versione 3 è stata modificata per accettare qualsiasi file di testo come 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.

Codice (versione 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+'.'

3
Le frasi di esempio mi fanno ridere così forte, sto piangendo! xD
mikhailcazi,

cat FILE | COMMAND? UUOC ;)
nyuszika7h,

Grazie @ nyuszika7h, ho imparato qualcosa oggi. Rompere un'abitudine così vecchia può essere difficile però ...
AShelly,

1
This smoke toasted some nonresidents.. WOAH.
phil294,

25

bash

Ispirato dalla risposta di Matlab. Presuppone che tu abbia aptitudeinstallato.

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

Possibili risultati (screenshot di questo articolo di Wikipedia)

inserisci qui la descrizione dell'immagine


7
Non credo . /----\ -------/ \ / \ / | -----------------/ --------\ ----------------------------------------------sia una frase valida.
svick,

1
@svick you winpuò essere una frase (l'oggetto "l'argomento" è implicito). E anche se non lo è, la domanda non proibisce i casi in cui l'output non è valido.
ace_HongKongIndipendenza

23

Pitone:

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

Campioni:

  • Bufalo Bufalo Bufalo.
  • Bufalo Bufalo Bufalo Bufalo Bufalo Bufalo Bufalo Bufalo Bufalo.

Sfortunatamente, ha un po 'scarsa gestione della punteggiatura e delle maiuscole, ma di nuovo quelle non sono state elencate come requisiti.

Inoltre, ecco un riferimento.


3
Non aggiungere spazi ai letterali bufali; invece usa ' '.join(l). Questo si libererà dello spazio finale. È quindi possibile semplicemente aggiungere un punto.
Blacklight Shining

@BlacklightShining Aggiornato. Grazie per il suggerimento
8

Prego. E +1 per il bufalo. :)
Blacklight Shining


1
Espresso con itertools ,print " ".join(takewhile(lambda _: randint(0, 5), repeat("buffalo"))).capitalize() + "."
nmclean,

16

Rust + Toki Pona

Si accetta qualsiasi lingua, quindi ho scritto un programma in Rust che genera alcune frasi in Toki Pona .

Toki Pona è un tentativo di creare un linguaggio naturale minimale e ha una grammatica super semplice e regolare. Questa è una proprietà molto utile per questo concorso!

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

Non parlo Toki Pona, ma ho trovato la sintassi di Toki Pona come un insieme di regole BNF su Wikipedia. Ho creato una struttura o enum per ogni regola BNF e le ho annotate deriving(Rand), il che mi dà un modo per generare una Phrasestruttura casuale gratuitamente! Quindi, ho implementato ToStrper ciascuna di queste strutture per convertirle in una stringa.

Ho lasciato intenzionalmente i nomi delle strutture in francese, perché le regole BNF che ho trovato sono in francese, e anche perché reinfocano la natura multilingue della mia presentazione!

Output di esempio

Alcuni output e le loro traduzioni, che ho fatto sulla base delle regole BNF e di un dizionario Toki Pona . Sono sicuro che queste traduzioni siano per lo più sbagliate, ma Toki Pona in realtà lascia molto spazio all'interpretazione di una frase.

nasin mi tawa la jan li jaki

Durante il mio viaggio, qualcuno ha inquinato

monsi li jaki li jan ike musi

Il culo è sporco ed è una persona cattiva divertente

sina li tawa ale jelo e kili tawa e insa

Hai spostato il frutto e il centro nell'universo giallo

Problemi

  • Non controllo se un verbo è transitivo o meno, quindi alcune frasi sono grammaticalmente errate.
  • Alcune strutture sono ricorsive e quando una regola può essere ripetuta scelgo casualmente di produrre 0, 1 o 2 elementi. Questo può portare a frasi lunghe generate da veeeeeery, contenenti migliaia di parole ...
  • Non riesco davvero a verificare la validità dell'output, mi affido completamente alla sintassi BNF, al dizionario e alle mie ipotesi selvagge :)

1
sina li tawa ale jelo e kili tawa e insa == "Hai spostato il frutto e il centro nell'universo giallo" Abbastanza buono per una macchina, di solito solo gli utenti avanzati di tp possono usare costruzioni trasformative.
Matthew Martedì

1
monsi li jaki li jan ike musi == Il culo (culo? come in coglione?) è sporco ed è una persona cattiva divertente.
Matthew Martedì

1
Ehi, grazie per i tuoi commenti, @MatthewMartin! Di certo non mi aspettavo che un oratore di Toki Pona potesse vedere la mia proposta, ma sono felice di sapere che queste sentenze non sono completamente incomprensibili :)
Barjak,

Suggerimento: non è un codice golf.
nyuszika7h,

1
@ nyuszika7h Non sono sicuro di quale sia lo scopo del tuo commento. In effetti, non è un codice golf, in quanto è un concorso di popolarità.
Barjak,

14

Pitone

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!

7
Potresti argomentare che import antigravityporta all'output I LEARNED IT LAST NIGHT! EVERYTHING IS SO SIMPLE!? : D
ace_HongKongIndipendenza,

Indubbiamente sì.
Renae Lider,

14

Prolog

Usa il backtracking di prolog e una grammatica generativa che si avvicina alla grammatica inglese per generare tutte le frasi possibili.

Questa versione ha un vocabolario e una struttura delle frasi abbastanza limitati, ma dovrebbe essere abbastanza facile da estendere.

Il codice:

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

Esegui questa query:

sentence(L).

per generare tutte le frasi possibili in questa lingua.

Alcuni output di esempio:

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: consenti clausole subordinate agli oggetti).


1
Qualche esempio di output di frasi?
TheDoctor,

Sì, ho inserito alcuni esempi nella risposta. In totale genera 2520 uscite, quindi non posso pubblicarle tutte ...
chrisd,

11

Pitone

Come sai, puoi fare qualsiasi cosa in Python con poche imports. Questo semplice compito può essere realizzato con questo script Python a 2 righe.

import random

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

Il numero di frasi generate da questo script è enorme: 10^12frasi diverse. Se leggere una sentece richiede circa 0,5 secondi, la lettura di tutte richiederà più di 15000 anni!

Alcune frasi di esempio:

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

Eppure tutte le frasi generate contengono un soggetto, un verbo e un oggetto.

AGGIORNARE:

Ho ricevuto alcune critiche su alcune parole sofisticate che questo complesso strumento potrebbe produrre. Ecco una versione leggermente più lunga che dovrebbe essere in accordo con la maggior parte degli elenchi di parole.

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

Ecco alcune frasi di esempio:

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

Non riesco a trovare alcune delle tue parole nel mio dizionario
Dr. belisarius,

5
Ho adattato il mio software per adattarlo meglio al tuo dizionario scadente.
Antonio Ragagnin,

2
Ok. Tra 15000 anni
posterò

10

Giocare con il dizionario interno 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

Sei fortunato, diciamo, il 70% delle volte. Genera cose come:

un circuito elettrico amigdaloide
laggiù Parkia non era restrittivo sebbene
lacera la sua società longanime
Doctor of Education risposta incomprensibile al
piccolo teatro musicale del kibbutz contro Giulio Cesare e
una sitta di Tai
falciare nel centro sportivo contro la tua negligenza
i detergenti estrinseci richiesti
senza stregone
negro questi vena pectoralis di fronte alla mia Latria trofeo moglie investitori di tendenza marroni
quale campo di fuoco portatile per l'uomo
umbra affascinante in cui la mia risposta
un altro detriti a vite tempesta inodore aslant aral Sea complesso waffle
per piacere professato metallo tipo mongoloide

ma a volte:

la mia adozione almeno la battaglia di Lutzen avrebbe attirato denaro mentre Hejira della mannaia
nove generi di subduzione shiner comuni Seiurus scaldavano il suo pubblico

Vabbè, il suo uso dell'inglese è migliore del mio.


8

VBA / Excel

[modifica 2]

Gli abbiamo insegnato come coniugare i verbi, gli esempi seguenti sono semplici tempi passati:

La moderata cocaina selvatica è scivolata al passo con la storica decisione istantanea. Il capitolo sulla sicurezza regionale scattò all'interno di numerose entità casuali. Il dominio di destra giallo rimosso dietro il genere magnetico fragile. L'inquinamento fatale fisico iniziò oltre la povera sensazione di morte. Il coraggioso teatro cognitivo è andato in primo piano nella fragile letteratura consapevole. L'output convenzionale convenzionale ha resistito lontano dal sito immunitario preferito. Il gemello economico fisso riconosciuto dalla cattiva necessità umana.

Segue il codice pertinente, escludendo una serie di noiose funzioni ausiliarie di analisi e loop. Le parti principali che mancano sono i vari elenchi di parole (per parti del discorso) che fanno pluralizzazione, tempi verbali, coniugazioni, ecc.

Tutte le parole radice vengono scelte casualmente, ma le costringo a essere disposte in un particolare schema di frasi:

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

... che è quello che ho usato per generare l'output sopra. Segue la forma generale di "La rapida volpe rossa saltò sul pigro cane marrone".

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

[inizia il post originale]

Ancora in fase di elaborazione, è necessario aggiungere la logica per i tempi e la pluralizzazione di nomi / verbi, vale a dire:

Il tuo viaggio medio è la nostra presunta dose né un aumento della temperatura oltre il mio pomodoro.

... che è analizzabile, ma non ha molto senso.

La programmazione consente al loro pescatore sporco di gran lunga il nostro cast di maiale invece nessuna frase.

Giusto. Non proprio una frase, ma meglio di alcuni messaggi di errore JavaScript.

Il suo appello solleva ogni domanda dal vivo che la mia signora delinea il suo inglese.

La routine innuendo è quasi di prim'ordine anche se ...

Codice da seguire anon. Questo concorso ha una scadenza?

[modifica 1]

Codice che ha generato quanto sopra.

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

5
Dov'è il tuo codice?
ace_HongKongIndipendenza,

Vedi la mia modifica per il codice.
Brandon R. Gates,

6

Perl 5

OK, il coraggio del programma è proprio questo:

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

È fondamentalmente un motore "madlib". Per generare effettivamente frasi interessanti, è necessario popolare %padalcuni dati. Ecco un esempio %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',
  ],
);

Ecco alcuni esempi della saggezza che ho scoperto da questo %pad. Queste frasi non sono state modificate per lunghezza, punteggiatura, grammatica, ecc. Anche se ne ho selezionate alcune non interessanti e ho riorganizzato l'ordine in cui appaiono le frasi: non sono più nell'ordine in cui sono state generate, ma invece sto cercando di usali per raccontare una storia: una storia che spero possa trovare sia commovente che stimolante.

  • Le ragnatele sono corte.
  • Le ragnatele affascinano regolarmente.
  • Le scimmie corte sono scintillanti, ma le ragnatele bevono avidamente.
  • Scimmie scintillanti (ma maleodoranti) seguivano il piccolo gorilla (ancora scintillante).
  • La cima del Monte Everest ha accolto con favore lo stegosauro altamente decorato.
  • Non solo la vetta del Monte Everest è costosa, ma anche il cast della televisione "Glee" ha seguito il gorilla scintillante.
  • Il cast della televisione "Glee" ricorda la cassetta delle lettere lilla.
  • La costosa cassetta delle lettere è alta e il costoso stegosauro salta Chuck Norris, eppure le scarpe verdi hanno saltato il panino con insalata di manzo.
  • Il panino con insalata di manzo adorava Chuck Norris.
  • Milioni di anguille scintillanti sono verdi (eppure spettrali).

Ora, se potessi popolare il pad programmaticamente
Pureferret,

Il popolamento del pad a livello di codice non è una vera sfida. Basta raschiare wiktionary o qualcosa del genere. Ciò non darebbe frasi così divertenti.
pensa al

Non è una vera sfida, ma penso che sia una parte divertente.
Pureferret,

5

Ms Word

Non sono sicuro che questo sia accettabile, ma dato che lo è html, penso che dovrebbe essere accettabile.

 =rand(1,1)

Esempi di frasi:

Nella scheda Inserisci, le gallerie includono elementi progettati per coordinarsi con l'aspetto generale del documento.

È possibile utilizzare queste gallerie per inserire tabelle, intestazioni, piè di pagina, elenchi, copertine e altri elementi costitutivi del documento.

puoi anche specificare un numero qualsiasi di frasi e paragrafi.


4

Un lavoro in corso con JSoup e 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);
        }
    }

}

Problemi:

  • Le frasi sono troppo semplici
  • Occasionalmente 404s (senza una buona maneggevolezza!)
  • Genera solo una frase alla volta
  • Usa una custodia!

Output di esempio:

Popoloca punge i fagioli rampicanti.
Tropico del Capricorno illumina i corpetti.
Pechino sinonimo di federe.
Chukchis inculturò influenzando.


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

In questo modo vengono recuperate le 30 ricerche google più di tendenza, viene eseguita una ricerca "Mi sento fortunato", quindi viene visualizzata una frase casuale da quella pagina con almeno 3 parole.

Esempi:

"Era considerata una delle medaglie preferite nell'evento."

"Kate si è diplomata al liceo un anno prima."

"15 aprile 2014, per promuovere il rispetto della politica sulle biografie dei viventi."

"A nome di Bryan, noi, la sua famiglia, vorremmo ringraziare tutti per lo sfogo di amore, preghiere e sostegno."

"Questo articolo parla del giocatore di basket americano."

"Siamo spiacenti, il tuo browser ha JavaScript disabilitato o non ha alcun lettore supportato."


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

produzione:

Genera una frase che può essere letta e compresa


Utilizzare gli URI di condivisione di Stack Exchange (ad es. /q/21571Invece di /questions/21571/generate-an-understandable-sentence).
Blacklight Shining

2
Dal momento che questo non è il golf del codice, le interruzioni di riga per la leggibilità sarebbero belle.
nyuszika7h,

2

Shell Scripting

Questo script mostrerà sempre il titolo della prima domanda che si trova attualmente in cima a questo sito. La mia ipotesi è che il titolo della domanda sarà sempre leggibile dall'uomo. E cambierà dinamicamente. Quindi ogni volta che arriva una nuova domanda e quando lo script viene eseguito, darà il titolo dell'ultima domanda.

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

Uscita di prova 1

Find words containing every vowel

Uscita prova 2

Hello World 0.0!

MODIFICARE

Non utilizzare alcun file. Senza file, posso usare lo script seguente.

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

Produzione

Generate an understandable sentence

1
né li sta leggendo direttamente da un file ...
rafaelcastrocouto,

Ho apportato le modifiche per non utilizzare un file. Ora ha usato solo le variabili. Che ne dici di questo?
Ramesh,

2
rimosso il voto verso il basso!
rafaelcastrocouto,

2

JavaScript (ES6)

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

Eseguendolo nella console produce

foo is not defined
null has no properties
radix must be an integer at least 2 and no greater than 36

Ancora più breve:t='';for(f of [_=>foo,_=>null.a,_=>0..toString(0)])try{f()}catch(e){t+=e.message+'\n'}t
Spazzolino da denti

2

Ancora un altro script di Python

La risposta dell'utente3058846 non è male, ma mostra ogni frase, ogni volta. Qui, propongo uno script che produce una frase casuale dallo Zen di 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))

In una riga, per gli appassionati di :

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

Esempi:

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


Un altro modo divertente in Python

Grazie a @TheDoctor riversa l'idea :-) Disattiva l'output di importazione e gioca con il dict pseudo-crittografato nel modulo.

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

È generalmente una cattiva pratica da usare shell=True. Anche se in questo caso non è insicuro, dato che non stai prendendo l'input dell'utente, opterei per subprocess.Popen(('python', '-c', 'import this')).
nyuszika7h,

Sapevi che se puoi mettere a tacere la poesia di import this, c'è una variabile nel modulo thische contiene tutto il testo, ma crittografato. C'è anche un dizionario per decrittografarlo.
TheDoctor,

1
@TheDoctor Guarda la mia risposta aggiornata: D
Maxime Lorant,

1

Python 3

Garantito per generare output grammaticale! (Generalmente.)

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)

Per renderlo perfettamente grammaticale, eliminare il carattere di sottolineatura da wordregex. Ciò impedirà l'inserimento di più parole che portano a frasi sbagliate come "Ti comprimiamo."

Esecuzione di esempio:

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?

Uscita preferita finora:

They you her.

Cerca: http://en.wiktionary.org/wiki/you#Verb .


0

Pitone

Risultato:

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

Ho usato l'elenco delle parole da qui Trova le parole che contengono ogni vocale

Alcune altre regole possono essere aggiunte. Ad esempio, se una parola che termina con "ness" e la parola esiste anche in set senza il suffisso, allora è un sostantivo.

Codice sorgente:

#!/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

3
Faccio davvero schifo in Python e in inglese, oppure stai producendo 3 sostantivi invece di 2 sostantivi e un verbo?
ace_HongKongIndipendenza,

@ace Oops, ho deciso di correggere il codice negli ultimi minuti :-(
yegle

0

bash

Cercare di eseguire un programma esistente ma non installato fornisce questo (in 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'

In diverse distro, ti dà una frase diversa.
TheDoctor,

Ecco perché ho detto in LM13
user80551 il

0

Python 3

Un'altra interpretazione di The Zen of Python , ispirata alla risposta di 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))

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

4
Si prega di indicare quale lingua è.
Rodolfo Dias,

1
@ RodolfoDias Sono abbastanza sicuro che questo sia Javascript ... non sono sicuro però.
TheDoctor
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.