Generar una oración comprensible.

55

Problema:

Genere una oración que pueda leerse y entenderse. Debe contener un sujeto, verbo y objeto, y los tiempos verbales y plurales deben coincidir. El programa también debe ser capaz de generar varias oraciones diferentes para calificar.

Reglas:

  • No está permitido codificar las oraciones, y tampoco leerlas directamente de un archivo (te estoy mirando, sin carne)
  • Puedes tener cualquier cantidad de listas de palabras
  • Envíe una oración de ejemplo o 2 que haya generado su programa
  • Cualquier idioma es aceptado
  • Es un , por lo que gana la respuesta más votada
TheDoctor
fuente
77
Creo que está claro a partir de algunas de las respuestas ( MatLab te estoy mirando) que debes modificar las reglas de modo que la minería de datos no pueda extraer palabras consecutivas de ninguna fuente.
Carl Witthoft
Si bien estoy siendo inteligente: dado que es puramente un concurso de popularidad, alguien debería publicar un jpg de HotModelBikini. Eso obtendrá más votos que cualquier otra cosa.
Carl Witthoft
77
¡Votaré a cualquiera que use repeticiones de "búfalo" o "pez" como oraciones de muestra!
77
La mayoría de las respuestas aquí son oraciones válidas y completas de fuentes de texto o generan resultados que no cumplen con los criterios. ¡Para mí, ambos enfoques parecen estar en contra del espíritu de la pregunta! Si alguien realmente quiere impresionar, ¿podría sugerir un programa que comience con un conjunto de estructuras de oraciones válidas como [Adjective] [pl. noun] [verb] [adjective] [pl. noun]y que extraiga de un diccionario real (tal vez usando una de las API de diccionario disponibles) para completar los espacios en blanco? ¡Lo escribiría yo mismo si tuviera unos minutos de sobra! :( Después de todo ...Lazy Developers Write Lousy Programs.
Brian Lacy
1
@Pureferret Las listas de palabras serían listas de palabras individuales. La codificación rígida sería una lista de oraciones completas. Con las listas de palabras, normalmente necesitarías algo de lógica en el programa para armar una oración completa. Con oraciones codificadas, básicamente solo necesita una declaración impresa.
8bittree

Respuestas:

87

Golpetazo

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

Requisitos: fuente del kernel de Linux instalada en / usr / src

Esto extrae comentarios aleatorios de la fuente del núcleo. Si las oraciones son realmente comprensibles está abierto a debate.

Ejemplos de salida real:

  • 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
Alboroto
fuente
12
Bueno uno! Debe extraerlos todos y enviarlos como una fortunebase de datos oficial .
Jason C
18
"???" mejor comentario
Ray
44
¿No se viola la primera regla 'ni leerlos directamente de un archivo'?
kuldeep.kamboj
66
Yo diría que buscar a través del código fuente del sistema y filtrar el texto de los comentarios realmente no cuenta como "leer directamente".
Disturbios
77
y Slave Overflow. buen nombre para un sitio web de SE
TheDoctor
95

Matlab

why

ejemplo de salidas:

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

[Este es uno de los huevos de Pascua de Matlab]

EDITAR: puede ver el código de esta función aquí: why.m

Elíseo
fuente
8
El segundo ejemplo no es una oración. Es una frase infinitiva.
wchargin
2
La mayoría de las respuestas aquí producen no solo oraciones (mire las otras respuestas altamente votadas, por ejemplo). La tarea no dice que debe crear solo oraciones, dice que debe ser capaz de producir oraciones.
Elisha
51

PHP

Con suficiente tiempo, esto producirá toda la literatura, pasada, presente y futura. Las reglas no mencionaron que no se puede producir ningún otro texto.

La cadena 'TOS...'proporciona una frecuencia de escala logarítmica de las letras para que coincida más estrechamente con el inglés. Esto se utiliza para generar una cadena más grande con las frecuencias de letras relativas aproximadas.

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

Al ejecutarlo, he descubierto gemas literarias como:

  • GO NOW- Usted como sujeto está implícito.
  • IM AOK - Estoy bien
  • IM FDR - Soy F (ranklin) D (eleano) R (oosevelt)

Además, numerosas invectivas para expresar de manera concisa el descontento con la situación actual. [Algunas cartas redactadas]

  • F**K
  • S**T

Además, lo siguiente usando la escala ajustada:

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

fuente
6060
¡Por qué un grupo de monos podría hacer lo mismo!
Tim S.
11
¡Me gusta! ¡Ahora haga un programa que procese las letras que salen de eso y encuentre oraciones comprensibles! :)
TheDoctor
2
+1: ¿alguna posibilidad de automatizar la parte de descubrimiento? La tarea aparentemente era producir * una * oración (?). Por cierto: cuánto tiempo pasaste;)
Wolf
20
¿Cómo llegaste F**Ky S**Tsiempre que no exista *en 'ABCDEFGHIJKMLNOPQRSTUVWXYZ '?
glglgl
3
@Ypnypn: la 'TOS...'cadena representa la frecuencia de cada letra en una escala logarítmica. Entonces Atiene frecuencia T, Btiene frecuencia O. Jtiene la frecuencia más baja Aque se traduce en 0, de los cuales el registro inverso es 1. El último carácter es el espacio, que tiene frecuencia Z, o redondo (exp (25 / 3.976)) = 538, por lo que los espacios ocurren 538 veces más a menudo que J. Solo pensé que le daba un giro especial al problema de la máquina de escribir .
42

C

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

Salida de ejemplo:

El software provocó la cancelación de la conexión.
Se debe reiniciar la llamada interrumpida

También hay muchas oraciones válidas que no tienen un sujeto, verbo y objeto:

El temporizador expiró. El
archivo existe

ecatmur
fuente
¿Cómo y cuándo termina esto? (lo hace, pero no entiendo por qué)
phil294
1
@Blauhirn la condición de terminación de bucle se --ievalúa como falsa cuando i(una variable de tipo charcon valor inicial 0) llega a 0 nuevamente. Si charno está firmado (por ejemplo, ARM), se iajustará inmediatamente a su valor más grande (típicamente 255) y contará hasta 0. Si charestá firmado (la mayoría de los sistemas Intel) el comportamiento es estrictamente indefinido, pero generalmente una vez que alcanza su valor mínimo ( típicamente -128) se ajustará a su máximo (típicamente 127) y contará hasta 0. Entonces el programa típicamente imprimirá 256 líneas en total.
ecatmur
37

Java

Extrae la oración de introducción de un artículo aleatorio de Wikipedia:

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 veces tienes mala suerte; Intento minimizar esto estableciendo una longitud mínima de oración y filtrando las oraciones que terminan con ":" (todas las páginas de desambiguación comienzan de esa manera) o contienen un "?" (Parece que hay muchos artículos con información desconocida no resuelta marcada con signos de interrogación). Los límites de las oraciones son un período seguido de espacios en blanco seguidos de un número o letra mayúscula.

También filtro el texto entre paréntesis (el resultado sigue siendo una oración válida) para intentar eliminar algunos puntos que no son límites de oración. Filtraré llaves cuadradas para eliminar los números de citas de origen. Ejemplos:

  • Idle Cure fue una banda de arena rock de Long Beach, California.
  • El autoenfoque es un proceso óptico no lineal inducido por el cambio en el índice de refracción de los materiales expuestos a radiación electromagnética intensa.
  • TB10Cs4H3 es un miembro de la clase H / ACA de la molécula de ARN no codificante que guía los sitios de modificación de uridinas a pseudouridinas de sustratos de ARN.
  • El carnero salvaje de seis cabezas en la mitología sumeria fue uno de los héroes asesinados por Ninurta, dios patrón de Lagash, en el antiguo Iraq.
  • Sugar Daddy es un término de argot para un hombre que ofrece apoyo a una mujer u hombre típicamente más joven después de establecer una relación que generalmente es sexual.
  • La Iglesia Metodista Unida Old Bethel está ubicada en 222 Calhoun St., Charleston, Carolina del Sur.
  • Douglas Geers es un compositor estadounidense.

Si nota algún problema de gramática, ¡es su culpa por no ser un editor diligente de Wikipedia! ;-)

Jason C
fuente
44
Definitivamente hay una diferencia entre "válido" y "comprensible". Aquí tengo algunas pseudouridinas de ARN de sustrato, bebé.
Jason C
1
Obtuve esto la primera vez que lo ejecuté: Echinolittorina africana / Litorina africana Philippi, 1847 / Litorina decollata Philippi, 1847 / Littorina africana / Littorina perplexa Turton, 1932 / Nodilittorina africana./ Parece que hay algunas páginas Wiki que debes excluir de tu ¡buscar! ;) ¡Jaja! OMG, la segunda vez que lo ejecuté, me devolvió una línea de la página Wiki de Mikhail Gorbachev. Quien comparte mi primer nombre. Bastante raro.
mikhailcazi
2
¡El '/' no estaba realmente allí! Jaja: PI lo usó para representar nuevas líneas. Tal vez debería haber usado \ n. Es de aquí: en.wikipedia.org/wiki/Afrolittorina_africana . La tabla de la derecha, bajo sinónimos :) De todos modos, no fue una mala impresión, así que no te preocupes, porque esa cosa de Mikhail Gorbachev era genial. Y todas las oraciones después de eso fueron normales.
mikhailcazi
2
Puede encontrar esta respuesta de Física como un co-usuario reciente e interesante de uno de esos artículos.
EP
2
Puede ser un aspecto de probabilidad común pero muy poco intuitivo: los eventos que ocurren una vez en un millón pueden ser bastante comunes en un mundo con miles de millones de personas. Dicho esto, no estoy seguro de lo que diría un análisis formal. ¡También me sorprendió bastante! También puede notar que no hay ningún "otro tipo" involucrado.
EP
34

Soooo ... Dado que este es , me divertí un poco con evaly con las funciones. Básicamente, genero un número aleatorio y luego ejecuto una función aleatoria basada en ese número (en su cara switch,!) A través de eval.

PHP, ~ 9k salidas válidas

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

?>

Algunas salidas ...

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
fuente
@ nyuszika7h, PHP_EOLsolo es igual \no \r\n, dependiendo del sistema operativo, pero nunca <br>o similar.
timmyRS
@timmyRS Sí, tienes razón, este es un viejo comentario, no sé por qué escribí eso en ese momento.
nyuszika7h
33

PHP + Proyecto Gutenberg

Escribí un script PHP que convierte un documento de texto plano en un conjunto de bigrams de palabras , que luego usa para generar oraciones aleatorias. Estos son algunos de los mejores ejemplos que generó a partir de la versión en texto plano del discurso "Give Me Liberty Or Give Me Death" de Patrick Henry , incluida la letra pequeña del Proyecto Gutenberg:

  • El Proyecto Gutenberg Etext of nation, and esclavery!

  • ¡Pedimos disculpas por el bicentenario de esta letra pequeña!

  • NO TIENE NINGUNA OTRA GARANTÍA DE NINGÚN TIPO, EXPRESO O DAÑO INCIDENTAL, ¡Pero para mí, la muerte!

Puedes probarlo tú mismo aquí. Actualice la página para un nuevo lote de oraciones.

Si desea ejecutar el código fuente usted mismo, no olvide cargar $src_textcon el texto sin formato elegido.

<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>
ossifrage aprensivo
fuente
+10 ¡Este realmente clava el espíritu del desafío! No puedo encontrarlo ahora, pero solía haber un generador de oraciones en línea basado en Google que funcionaba de manera similar, pero los bigrams (u opcionalmente n-gramos más grandes) se derivaron de los resultados de búsqueda de Google buscando una palabra y observando lo que siguió en los fragmentos de vista previa de resultados de búsqueda. Tal vez lo recrearé y lo publicaré aquí.
Jason C
¡Que tal este! "Señor, encontramos cuáles se han complacido en mejorar el concurso". ¡O este! "Nos dicen un reembolso de un momento horrible para mejorar la parte de Etext 6 Fecha de la última actualización: 5 de mayo de 2005
Publicado oficialmente
1
But for me, death!: DI deseo que todas las licencias / acuerdos terminen tan fuertemente.
Navin
Jaja: "Lanzado oficialmente solo para nuestras batallas".
Jason C
1
No tengo nada." :(
TheNumberOne
29

Pitón

Esta entrada selecciona palabras de todo el diccionario del sistema. Aprovecha el hecho de que puedes convertir la mayoría de los sustantivos en verbos y viceversa. Utiliza algunas heurísticas para clasificar palabras y evitar imposibilidades obvias.

Produce algunas declaraciones casi sensatas:

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

Muchos locos:

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

Y muchas cosas que suenan a Monty Python haciendo insinuaciones lascivas:

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 versión 3 se ha modificado para tomar cualquier archivo de texto como entrada:

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

Código (versión 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
fuente
3
¡Las oraciones de ejemplo me hacen reír tanto que estoy llorando! xD
mikhailcazi
cat FILE | COMMAND? UUOC ;)
nyuszika7h
Gracias @ nyuszika7h, hoy aprendí algo. Rompiendo un hábito que puede ser de edad aunque difícil ...
AShelly
1
This smoke toasted some nonresidents.. WOAH.
phil294
25

Golpetazo

Inspirado por la respuesta de Matlab. Asume que has aptitudeinstalado.

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

Posibles resultados (captura de pantalla de este artículo de Wikipedia)

ingrese la descripción de la imagen aquí

ace_HongKongIndependence
fuente
77
No creo que . /----\ -------/ \ / \ / | -----------------/ --------\ ----------------------------------------------sea ​​una oración válida.
svick
1
@svick you winpuede ser una oración (el objeto "el argumento" está implícito). E incluso si no lo es, la pregunta no prohíbe los casos en que la salida no sea válida.
ace_HongKongIndependence
23

Pitón:

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

Muestras:

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

Desafortunadamente, tiene un manejo deficiente de la puntuación y la capitalización, pero, de nuevo, esos no se enumeraron como requisitos.

Además, aquí hay una referencia.

8bittree
fuente
3
No agregue espacios a los literales de búfalo; en lugar de usar ' '.join(l). Eso eliminará el espacio posterior. Luego puede agregar un punto.
Blacklight Shining
@BlacklightShining lo actualizó. Gracias por la sugerencia.
8bittree
De nada. Y +1 para búfalo. :)
Blacklight Shining
1
Expresado con itertools ,print " ".join(takewhile(lambda _: randint(0, 5), repeat("buffalo"))).capitalize() + "."
nmclean
16

Moho + Toki Pona

Se acepta cualquier idioma, así que escribí un programa en Rust que genera algunas oraciones en Toki Pona .

Toki Pona es un intento de crear un lenguaje natural mínimo, y tiene una gramática súper simple y regular. ¡Esa es una propiedad muy útil para este concurso!

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

No hablo Toki Pona, pero encontré la sintaxis de Toki Pona como un conjunto de reglas de BNF en Wikipedia. Creé una estructura o enumeración para cada regla BNF, y las anoté con deriving(Rand), lo que me da una forma de generar una Phraseestructura aleatoria de forma gratuita. Luego, implementé ToStrpara cada una de estas estructuras para convertirlas en una cadena.

Intencionalmente dejé los nombres de las estructuras en francés, porque las reglas de BNF que encontré están en francés, ¡y también porque refuerza la naturaleza multilingüe de mi presentación!

Resultados de muestra

Algunas salidas y sus traducciones, que hice en base a las reglas de BNF y un diccionario Toki Pona . Estoy seguro de que estas traducciones son en su mayoría incorrectas, pero Toki Pona en realidad deja mucho espacio para la interpretación de una oración.

nasin mi tawa la jan li jaki

Durante mi viaje, alguien contaminó

monsi li jaki li jan ike musi

El trasero está sucio y es una mala persona graciosa

sina li tawa ale jelo e kili tawa e insa

Moviste la fruta y el centro al universo amarillo

Cuestiones

  • No verifico si un verbo es transitivo o no, por lo tanto, algunas oraciones son gramaticalmente incorrectas.
  • Algunas estructuras son recursivas, y cuando una regla puede repetirse, elijo aleatoriamente generar 0, 1 o 2 elementos. Esto puede conducir a oraciones muuuy largas generadas, que contienen miles de palabras ...
  • Realmente no puedo verificar la validez de la salida, confío completamente en la sintaxis BNF, el diccionario y mis propias conjeturas salvajes :)
barjak
fuente
1
sina li tawa ale jelo e kili tawa e insa == "Moviste la fruta y el centro al universo amarillo" Bastante bueno para una máquina, por lo general solo los usuarios avanzados de tp pueden usar construcciones transformadoras.
MatthewMartin
1
monsi li jaki li jan ike musi == El trasero (¿culo? ¿como en idiota?) está sucio y es una mala persona graciosa.
MatthewMartin
1
¡Hola, gracias por tus comentarios, @MatthewMartin! Ciertamente no esperaba que un orador de Toki Pona viera mi presentación, pero me alegra saber que estas sentencias no son un completo galimatías :)
barjak
Sugerencia: no es un código de golf.
nyuszika7h
1
@ nyuszika7h No estoy seguro de cuál es el propósito de tu comentario. De hecho, no es un código de golf, ya que es un concurso de popularidad.
barjak
14

Pitón

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
fuente
77
¿Podría argumentar que eso import antigravityconduce a la salida I LEARNED IT LAST NIGHT! EVERYTHING IS SO SIMPLE!? : D
ace_HongKongIndependence
Indudablemente sí.
Renae Lider
14

Prólogo

Use el backtracking del prólogo y una gramática generativa que se aproxima a la gramática inglesa para generar todas las oraciones posibles.

Esta versión tiene un vocabulario y una estructura de oraciones bastante limitados, pero debería ser bastante fácil de ampliar.

El código:

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

Ejecute esta consulta:

sentence(L).

para generar todas las oraciones posibles en este idioma.

Algunas salidas de muestra:

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

(EDITAR: Permitir objetos subordinados cláusulas).

chrisd
fuente
1
¿Algún ejemplo de salida de oración?
TheDoctor
Sí, pongo algunas muestras en la respuesta. Genera 2520 salidas en total, aunque por lo que no las puedo publicar todo ...
Chrisd
11

Pitón

Como sabes, puedes hacer cualquier cosa en Python con pocos imports. Esta tarea simple se puede lograr con este script python de 2 líneas.

import random

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

La cantidad de oraciones generadas por este script es enorme: 10^12diferentes oraciones. Si leer una sentencia te lleva ~ 0.5 segundos, ¡leerlas todas llevará más de 15000 años!

Algunas oraciones de muestra:

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

Sin embargo, todas las oraciones generadas contienen un sujeto, un verbo y un objeto.

ACTUALIZAR:

Recibí algunas críticas sobre algunas palabras sofisticadas que esta herramienta compleja puede producir. Aquí hay una versión un poco más larga que debe estar de acuerdo con la mayoría de las listas de palabras.

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

Aquí hay algunas oraciones de muestra:

  • 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
fuente
No encuentro algunas de sus palabras en mi diccionario
Dr. belisarius
55
Ajusté mi software para que se ajuste mejor a tu pobre diccionario.
Antonio Ragagnin
2
Okay. En 15000 años publicaré para certificar que los he encontrado a todos
Dr. belisarius
10

Jugando con el diccionario interno de 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

Tienes suerte, digamos, el 70% del tiempo. Genera cosas como:

un circuito eléctrico amigdaloide
allá Parkia era irrestricto, aunque
su sociedad larga y dura era una
respuesta ininteligible al
pequeño teatro musical de Kibbutz contra Julius Caesar y
un tajamazo tailandés
en el centro deportivo contra tu niggardiness
los detergentes extrínsecos requeridos
sin el hechicero necromántico
estas venas pectorales frente a mi vena pectoralis trofeo esposa inversionistas
que marcan tendencia marrón qué campo de fuego portátil para hombres
umbra encantadoramente con lo cual respondo
otra tormenta de escombros suelta tormenta sin olor aslant Affle Sea complejo gofre
para el placer profeso metal tipo mongoloide

pero a veces:

la adopción de la mina por lo menos la batalla de Lutzen sacaría provecho de dinero durante los momentos en que Hejira de la cuchilla, el
género de subducción de nueve brillos comunes, Seiurus, conmovió a su audiencia

Bueno, su uso del inglés es mejor que el mío.

Dr. belisario
fuente
8

VBA / Excel

[editar 2]

Le enseñé cómo conjugar verbos, los ejemplos a continuación son simples en pasado:

La cocaína salvaje moderada se deslizó al frente de la histórica decisión instantánea. El capítulo seguro regional encajó dentro de la numerosa entidad aleatoria. El dominio derecho amarillo eliminado detrás del género frágil magnético. La contaminación física fatal comenzó más allá de la sensación de muerte. El valiente teatro cognitivo pasó al frente de la frágil literatura consciente. El rendimiento real convencional resistió lejos del sitio inmune favorito. El gemelo económico fijo reconocido por la malvada necesidad humana.

El código relevante sigue, excluyendo un montón de aburridas funciones auxiliares de análisis y bucle. Las partes principales que faltan son las diversas listas de palabras (por partes del discurso) que hacen la pluralización, tiempos verbales, conjugaciones, etc.

Todas las raíces de las palabras se seleccionan al azar, pero las obligo a organizarlas en un patrón de oración en particular:

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

... que es lo que solía generar la salida anterior. Sigue la forma general de, "El rápido zorro rojo saltó sobre el perezoso perro marrón".

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

[comenzar publicación original]

Aún es un trabajo en progreso, es necesario agregar lógica para tiempos verbales y pluralización de sustantivo / verbo, a saber:

Su viaje promedio es nuestra supuesta dosis ni un aumento de temperatura más allá de mi tomate.

... que se puede analizar, pero no tiene mucho sentido.

La programación permite a su pescador sucio lejos de nuestro elenco de cerdo en lugar de ninguna oración.

Derecha. No es realmente una oración, pero es mejor que algunos mensajes de error de JavaScript.

Su atractivo levanta todas las preguntas en vivo que mi señora resume sobre su inglés.

La rutina de insinuaciones es casi de primera categoría aunque ...

Código para seguir anon. ¿Este concurso tiene una fecha límite?

[editar 1]

Código que generó lo anterior.

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
fuente
55
¿Dónde está tu código?
ace_HongKongIndependence
Vea mi edición para el código.
Brandon R. Gates
6

Perl 5

OK, las entrañas del programa son solo esto:

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

Básicamente es un motor "madlib". Para generar oraciones interesantes, debe completar %padalgunos datos. Aquí hay un ejemplo %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',
  ],
);

Aquí hay algunas muestras de la sabiduría que descubrí de eso %pad. Estas oraciones no han sido editadas por longitud, puntuación, gramática, etc., aunque he seleccionado algunas que no son interesantes y he reorganizado el orden en que aparecen las oraciones: ya no están en el orden en que se generaron, sino que estoy tratando de úselos para contar una historia: una historia que espero que encuentre conmovedora y estimulante.

  • Las telas de araña son cortas.
  • Las telarañas fascinan regularmente.
  • Los monos cortos son brillantes, pero las telas de araña beben con avidez.
  • Monos chispeantes (pero malolientes) siguieron al gorila pequeño (pero chispeante).
  • La cumbre del Monte Everest dio la bienvenida al estegosaurio altamente decorado.
  • No solo la cumbre del Monte Everest es costosa, sino que también el elenco de "Glee" de la televisión siguió al gorila brillante.
  • El elenco de "Glee" de la televisión se asemeja al buzón lila.
  • El costoso buzón es alto, y el costoso estegosaurio salta sobre Chuck Norris, pero los zapatos verdes saltaron el sándwich de ensalada de carne.
  • El sándwich de ensalada de carne le encantó Chuck Norris.
  • Millones de anguilas brillantes son verdes (pero fantasmales).
tobyink
fuente
Ahora si pudieras rellenar el pad programáticamente
Pureferret
Rellenar la plataforma programáticamente no es un gran desafío. Solo raspa wiktionary o algo así. Sin embargo, eso no daría frases tan divertidas.
tobyink
No es un gran desafío, pero creo que es una parte divertida.
Pureferret
5

MS Word

No estoy seguro de si esto es aceptable, pero como html lo es, creo que también debería ser aceptable.

 =rand(1,1)

Ejemplos de oraciones:

En la pestaña Insertar, las galerías incluyen elementos diseñados para coordinarse con el aspecto general de su documento.

Puede usar estas galerías para insertar tablas, encabezados, pies de página, listas, portadas y otros bloques de construcción de documentos.

También puede especificar cualquier número de oraciones y párrafos.

Mhmd
fuente
4

Un trabajo en progreso usando JSoup y 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);
        }
    }

}

Cuestiones:

  • Las oraciones son muy simples
  • Ocasionalmente 404s (¡sin buen manejo!)
  • Solo genera una oración a la vez
  • Utiliza una caja de interruptor!

Resultados de muestra:

Popoloca prickethes judías verdes.
El trópico de Capricornio irradia cuerpos.
Beijing sinoniza las cajas de almohadas.
Chukchis enculturados influyendo.

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

Esto busca las 30 búsquedas de Google más populares, realiza una búsqueda "Me siento afortunado" y luego muestra una oración aleatoria de esa página con al menos 3 palabras.

Ejemplos:

"Fue considerada una medalla favorita en el evento".

"Kate se graduó de la escuela secundaria un año antes".

"15 de abril de 2014, para promover el cumplimiento de la política sobre biografías de personas vivas".

"En nombre de Bryan, nosotros, su familia, queremos agradecer a todos por la efusión de amor, oraciones y apoyo".

"Este artículo es sobre el jugador de baloncesto estadounidense".

"Lo sentimos, su navegador tiene JavaScript deshabilitado o no tiene ningún reproductor compatible".

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

salida:

Generar una oración que se pueda leer y comprender.

eqzx
fuente
Utilice los URI compartidos de Stack Exchange (por ejemplo, en /q/21571lugar de /questions/21571/generate-an-understandable-sentence).
Blacklight Shining
2
Como esto no es código golf, los saltos de línea para facilitar la lectura serían buenos.
nyuszika7h
2

Shell Scripting

Este script siempre mostrará el título de la primera pregunta que se encuentra actualmente en la parte superior de este sitio. Mi suposición es que el título de la pregunta siempre será legible para los humanos. Y cambiará dinámicamente. Entonces, cada vez que surge una nueva pregunta y cuando se ejecuta el script, le dará el título de la última pregunta.

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

Prueba 1 salida

Find words containing every vowel

Prueba 2 de salida

Hello World 0.0!

EDITAR

No estoy usando ningún archivo. Sin archivos, puedo usar el siguiente script.

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

Salida

Generate an understandable sentence
Ramesh
fuente
1
ni los lee directamente de un archivo ...
rafaelcastrocouto
He realizado los cambios para no usar un archivo. Ahora, solo usó las variables. ¿Que tal este?
Ramesh
2
eliminado voto abajo!
rafaelcastrocouto
2

JavaScript (ES6)

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

Ejecutarlo en la consola produce

foo is not defined
null has no properties
radix must be an integer at least 2 and no greater than 36
Oriol
fuente
Aún más corto:t='';for(f of [_=>foo,_=>null.a,_=>0..toString(0)])try{f()}catch(e){t+=e.message+'\n'}t
Cepillo de dientes
2

Otro script de Python

La respuesta de user3058846 no es mala, pero muestra todas las oraciones, siempre. Aquí, propongo un script que genera una oración aleatoria del Zen de 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))

En una línea, para fanáticos del de :

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

Ejemplos:

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


Otra forma divertida en Python

Gracias a @TheDoctor vierta la idea :-) Silencie la salida de importación y luego juegue con el dict seudo-encriptado en el módulo.

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
fuente
Generalmente es una mala práctica usar shell=True. Aunque no es inseguro en este caso, ya que no está tomando la entrada del usuario, optaría por subprocess.Popen(('python', '-c', 'import this')).
nyuszika7h
¿Sabía que si puede silenciar el poema de import this, hay una variable en el módulo thisque contiene todo el texto, pero encriptada? También hay un diccionario para descifrarlo.
TheDoctor
1
@TheDoctor Mira mi respuesta actualizada: D
Maxime Lorant
1

Python 3

¡Garantizado para generar resultados gramaticales! (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)

Para hacerlo perfectamente gramatical, elimine el guión bajo de wordregex. Esto no permitirá las entradas de varias palabras que conducen a oraciones incorrectas como "Te damos la vuelta".

Ejecución de muestra:

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?

Salida favorita hasta ahora:

They you her.

Búscalo: http://en.wiktionary.org/wiki/you#Verb .

DLosc
fuente
0

Pitón

Resultado:

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

Usé la lista de palabras de aquí. Encuentra palabras que contengan todas las vocales.

Se pueden agregar algunas reglas más. Por ejemplo, si una palabra que termina con "ness" y la palabra también existe en conjunto sin el sufijo, entonces es un sustantivo.

Código fuente:

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

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

import random                     

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

    for word in whole_words_set:
        if word.endswith('ment'):
            noun.add(word)
        elif word.endswith('ing'):
            if word[:-3] in whole_words_set:
                verb.add(word[:-3])
            elif word[:-3]+"e" in whole_words_set:
                verb.add(word[:-3]+"e")
    noun_list = list(noun)
    verb_list = list(verb)
    while True:                   
        sentence = "%s %s %s" % (random.choice(noun_list),
                                 random.choice(verb_list),
                                 random.choice(noun_list))                                                                                           
        print(sentence)
        if input("Produce more? (Y/N)").lower() == "n":
            break
yegle
fuente
3
¿Realmente soy un asco en Python y en inglés, o estás generando 3 sustantivos en lugar de 2 sustantivos y un verbo?
ace_HongKongIndependence
@ace Vaya, decidí arreglar el código en los últimos minutos :-(
yegle
0

Golpetazo

Intentar ejecutar un programa que existe pero que no está instalado da esto (en 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'
usuario80551
fuente
En diferentes distribuciones, te da una oración diferente.
TheDoctor
Es por eso que dije en LM13
user80551
0

Python 3

Otra versión de The Zen of Python , inspirada en la respuesta de Maxime .

import codecs
import os
import sys
import random

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

import this

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

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

print(random.choice(zen))
nyuszika7h
fuente
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
fuente
44
Indique qué idioma es este.
Rodolfo Dias
1
@RodolfoDias Estoy bastante seguro de que esto es Javascript ... aunque no estoy seguro.
TheDoctor