Gere uma frase compreensível


55

Problema:

Gere uma frase que possa ser lida e compreendida. Ele deve conter um sujeito, verbo e objeto, e tempos e plurais devem corresponder. O programa também deve ser capaz de gerar várias frases diferentes para se qualificar.

Regras:

  • Codificar as frases não é permitido e nem as lê diretamente de um arquivo (estou olhando para você, uneatemeat)
  • Você pode ter qualquer número de listas de palavras
  • Envie uma sentença de exemplo ou 2 que foram geradas pelo seu programa
  • Qualquer idioma é aceito
  • É um , então a resposta mais votada vence

7
Eu acho que está claro em algumas respostas ( MatLab , estou olhando para você) que você deve modificar as regras para que a mineração de dados não tenha permissão para extrair palavras consecutivas de qualquer fonte.
Carl Witthoft

Enquanto estou sendo espertinho: como é puramente um concurso de popularidade, alguém deve postar um jpg do HotModelBikini. Isso terá mais votos do que qualquer coisa.
Carl Witthoft

7
Eu votarei em qualquer pessoa que use repetições de "búfalo" ou "peixe" como frases de exemplo!

7
A maioria das respostas aqui contém frases válidas e completas de fontes de texto ou gera resultados que não atendem aos critérios. Para mim, ambas as abordagens parecem contrárias ao espírito da questão! Se alguém realmente quer impressionar, posso sugerir um programa que comece com um conjunto de estruturas de frases válidas como [Adjective] [pl. noun] [verb] [adjective] [pl. noun]e extrai de um dicionário real (talvez usando uma das APIs de dicionário disponíveis lá fora) para preencher os espaços em branco? Eu mesmo escreveria se tivesse alguns minutos de sobra! :( Afinal ...Lazy Developers Write Lousy Programs.
Brian Lacy

11
As listas de palavras do @Pureferret seriam listas de palavras individuais. Codificação embutida seria uma lista de frases completas. Com listas de palavras, você normalmente precisaria de alguma lógica no programa para reunir uma frase completa. Com frases codificadas, basicamente você só precisa de uma declaração impressa.
8bittree

Respostas:


87

Bater

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

Requisitos: fonte do kernel do linux instalada em / usr / src

Isso extrai comentários aleatórios da fonte do kernel. Se as sentenças são realmente compreensíveis está aberto a debate.

Exemplos de saída 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

12
Um bom! Você deve puxar todos eles e enviá-lo como um fortunebanco de dados oficial .
Jason C

18
"???" melhor comentário de sempre
Ray

4
A primeira regra não é violada? A leitura direta de um arquivo não é violada?
precisa saber é o seguinte

6
Eu diria que pesquisar no código fonte do sistema e filtrar o texto dos comentários não conta realmente como "lendo diretamente".
Distúrbios

7
e Slave Overflow. bom nome para um site SE
TheDoctor 22/02

95

Matlab

why

exemplo de saídas:

>> 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 é um dos ovos de páscoa do Matlab]

EDIT: você pode ver o código desta função aqui: why.m



8
O segundo exemplo não é uma frase. É uma frase infinitiva.
Wchargin

2
As respostas obrigatórias aqui produzem não apenas sentenças (veja as outras respostas mais votadas, por exemplo). A tarefa não diz que deve criar apenas frases, diz que deve ser capaz de produzir frases.
Eliseu

51

PHP

Com tempo suficiente, isso produzirá toda a literatura, passado, presente e futuro. As regras não mencionaram que nenhum outro texto possa ser produzido.

A string 'TOS...'fornece uma frequência de escala logarítmica das letras para corresponder melhor ao inglês. Isso é usado para gerar uma string maior com as frequências relativas aproximadas das letras.

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

Ao executá-lo, descobri jóias literárias como:

  • GO NOW- Você como sujeito está implícito.
  • IM AOK - Eu estou bem
  • IM FDR - Sou F (ranklin) D (eleano) R (oosevelt)

Além disso, numerosos invectivos para expressar de forma concisa o descontentamento com a situação atual. [Algumas cartas foram editadas.]

  • F**K
  • S**T

Além disso, use o escalonamento de ajuste fino a seguir:

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

60
Ora, um bando de macacos poderia fazer o mesmo!
Tim S.

11
Eu gosto! Agora faça um programa que processe as letras que saem disso e encontre frases compreensíveis! :)
TheDoctor

2
+1 - alguma chance de automatizar a parte de descoberta? A tarefa era aparentemente produzir * uma * (?) Sentença. BTW: quanto tempo você gastou;)
Wolf

20
Como você conseguiu F**Ke S**Tdesde que não haja *em 'ABCDEFGHIJKMLNOPQRSTUVWXYZ '?
glglgl

3
@Ypnypn - A 'TOS...'string representa a frequência de cada letra em uma escala logarítmica. Então Atem frequência T, Btem frequência O. Jtem a frequência mais baixa Aque se traduz em 0, cujo log inverso é 1. O último caractere é o espaço, que possui frequência Zou arredondamento (exp (25 / 3.976)) = 538, portanto, os espaços ocorrem 538 vezes mais frequentemente J. Só pensei em dar uma guinada no problema do macaco na máquina de escrever .

42

C

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

Exemplo de saída:


Interrupção de conexão causada por software Chamada interrompida do sistema deve ser reiniciada

Também existem muitas frases válidas que não têm assunto, verbo e objeto:

O temporizador expirou O
arquivo existe


como e quando isso termina? (ele faz, mas eu não entendo porque)
phil294

11
@Blauhirn a condição de finalização do loop é --iavaliada como falsa quando i(uma variável do tipo charcom valor inicial 0) atinge 0 novamente. Se charnão estiver assinado (por exemplo, ARM), iretornará imediatamente ao seu maior valor (normalmente 255) e contará até 0. Se charfor assinado (na maioria dos sistemas Intel), o comportamento é estritamente indefinido, mas geralmente quando atinge seu valor mínimo ( tipicamente -128), ele será limitado ao máximo (normalmente 127) e contado até 0. Portanto, o programa normalmente imprimirá 256 linhas no total.
ecatmur

37

Java

Retira a frase de introdução de um artigo aleatório da 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 + ".");
    }
}

Às vezes você fica azarado; Tento minimizar isso definindo um tamanho mínimo de frase e filtrando as frases que terminam com ":" (todas as páginas de desambiguação começam dessa maneira) ou contêm um "?" (parece haver muitos artigos com informações desconhecidas não resolvidas marcadas por pontos de interrogação). Os limites das frases são um período seguido de espaço em branco seguido de um número ou letra maiúscula.

Também filtro o texto entre parênteses (o resultado ainda é uma sentença válida) para tentar remover alguns períodos que não são limites de sentença. Eu filtrei colchetes para remover os números de referência de origem. Exemplos:

  • Idle Cure era uma banda de rock de Long Beach, Califórnia.
  • A autofoco é um processo óptico não linear induzido pela mudança no índice de refração de materiais expostos a intensa radiação eletromagnética.
  • O TB10Cs4H3 é um membro da classe H / ACA de molécula de RNA não codificante que guia os locais de modificação de uridinas em pseudouridinas de RNAs de substrato.
  • O Carneiro Selvagem de seis cabeças na mitologia suméria foi um dos heróis mortos por Ninurta, deus padroeiro de Lagash, no antigo Iraque.
  • Sugar daddy é uma gíria para um homem que oferece apoio a uma mulher ou homem tipicamente mais jovem depois de estabelecer um relacionamento que geralmente é sexual.
  • Old Bethel United Methodist Church está localizada em 222 Calhoun St., Charleston, Carolina do Sul.
  • Douglas Geers é um compositor americano.

Se você notar algum problema gramatical, a culpa é sua por não ser um editor diligente da Wikipedia! ;-)


4
Definitivamente, há uma diferença entre "válido" e "compreensível". Eu tenho alguns pseudouridinos de RNA de substrato para você aqui, querida.
Jason C

11
Comprei isso na primeira vez em que o executei: Echinolittorina africana / Litorina africana Philippi, 1847 / Litorina decollata Philippi, 1847 / Littorina africana / Littorina perplexa Turton, 1932 / Nodilittorina africana./ Parece que há algumas páginas do Wiki que você deve excluir procurar! ;) Haha! OMG, na segunda vez que o executei, ele retornou uma linha da página Wiki de Mikhail Gorbachev. Quem compartilha meu primeiro nome. Muito esquisito.
Mikhailcazi

2
Os '/' não estavam realmente lá! Haha: o PI usou-o para representar novas linhas. Talvez eu devesse ter usado \ n. É daqui: en.wikipedia.org/wiki/Afrolittorina_africana . A mesa à direita, com sinônimos :) De qualquer forma, não foi uma má impressão, então não se preocupe, porque aquela coisa de Mikhail Gorbachev foi bem legal. E todas as frases depois disso eram normais.
Mikhailcazi

2
Você pode achar que essa resposta da Física é um co-usuário interessante e recente de um desses artigos.
EP

2
Pode ser um aspecto comum, mas pouco intuitivo, da probabilidade: os eventos de uma vez em um milhão podem ser bastante comuns em um mundo com bilhões de pessoas. Dito isto, não tenho certeza do que diria uma análise formal. Eu também fiquei bastante surpreso! Você pode notar também que não há 'outro cara' envolvido.
EP

34

Soooo ... Como esse é , eu me diverti um pouco com evale com funções. Basicamente, eu gero um número aleatório e, em seguida, executo uma função aleatória com base nesse número (na sua cara switch,!) Via eval.

PHP, ~ 9k saídas 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."();");

?>

Algumas saídas ...

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 igual \nou \r\n, dependendo do sistema operacional, mas nunca é <br>semelhante.
timmyRS 5/04

@timmyRS Sim, você está certo, este é um comentário antigo, não sei por que escrevi isso na época.
nyuszika7h

33

Projeto PHP + Gutenberg

Eu escrevi um script PHP que transforma um documento de texto sem formatação em um conjunto de bigrams de palavras , que ele usa para gerar sentenças aleatórias. Aqui estão alguns dos melhores exemplos que ele gerou da versão em texto sem formatação do discurso "Give Me Liberty Or Give Me Death" de Patrick Henry , incluindo as letras pequenas do Project Gutenberg:

  • O Projeto Gutenberg Texto das nações e escravidão!

  • Pedimos desculpas pelo 200º aniversário desta versão impressa!

  • VOCÊ NÃO TEM GARANTIAS DE QUALQUER TIPO, DANOS EXPRESSOS OU INCIDENTAIS, Mas para mim, a morte!

Você pode experimentá-lo aqui. Atualize a página para um novo lote de frases.

Se você deseja executar o código fonte, não se esqueça de carregar $src_texto texto sem formatação escolhido.

<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 Este realmente prega o espírito do desafio! Não consigo encontrá-lo agora, mas costumava haver um gerador de frases on-line baseado no Google que funcionava de maneira semelhante, mas os bigrams (ou opcionalmente n-gramas maiores) foram derivados dos resultados de pesquisa do Google pesquisando uma palavra e observando o que se seguiu nos snippets de visualização dos resultados da pesquisa. Talvez eu o recrie e publique aqui.
Jason C

Que tal este! "Senhor, descobrimos quais tiveram o prazer de melhorar o concurso." Ou este! "Eles nos dizem um reembolso de um momento terrível para melhorar a parte do Etext 6 Data da última atualização: 5 de maio de 2005 Lançada oficialmente apenas para as nossas batalhas."
Hosch250

11
But for me, death!: Deseja que todas as licenças / contratos sejam encerrados com tanta força.
Navin

Haha, "Oficialmente lançado apenas para as nossas batalhas."
Jason C

11
Eu Não tenho nada." :(
TheNumberOne 23/03

29

Pitão

Esta entrada seleciona palavras de todo o dicionário do sistema. Aproveita o fato de que você pode transformar a maioria dos substantivos em verbos e vice-versa. Ele usa algumas heurísticas para classificar palavras e evitar impossibilidades óbvias.

Produz algumas declarações quase sensatas:

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

Muitos loucos:

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

E muitas coisas que parecem Monty Python fazendo insinuações obscenas:

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.

A versão 3 foi modificada para receber qualquer arquivo 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 (versão 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
Os exemplos de frases estão me fazendo rir tanto que estou chorando! xD
mikhailcazi

cat FILE | COMMAND? UUOC ;)
nyuszika7h

Obrigado @ nyuszika7h, eu aprendi algo hoje. Quebrar um hábito que os velhos podem ser difíceis ...
AShelly:

11
This smoke toasted some nonresidents.. WOAH.
phil294

25

Bater

Inspirado pela resposta do Matlab. Supõe que você aptitudeinstalou.

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

Possíveis saídas (captura de tela deste artigo da wikipedia)

insira a descrição da imagem aqui


7
Eu não acho que . /----\ -------/ \ / \ / | -----------------/ --------\ ----------------------------------------------seja uma frase válida.
svick

11
@svick you winpode ser uma frase (o objeto "o argumento" está implícito). E mesmo que não seja, a questão não proíbe casos em que a saída não é válida.
ace_HongKongIndependence

23

Pitão:

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

Amostras:

  • Búfalo Búfalo.
  • Búfalo de búfalo búfalo de búfalo búfalo de búfalo.

Infelizmente, ele tem um pouco de manipulação inadequada de pontuação e capitalização, mas, novamente, esses não foram listados como requisitos.

Além disso, aqui está uma referência.


3
Não adicione espaços aos literais de búfalo; em vez disso, use ' '.join(l). Isso vai se livrar do espaço à direita. Você pode simplesmente acrescentar um período.
Blacklight Shining

@BlacklightShining Atualizou. Obrigado pela sugestão.
8bittree

De nada. E +1 para búfalo. :)
Blacklight Shining


11
Expressado com itertools ,print " ".join(takewhile(lambda _: randint(0, 5), repeat("buffalo"))).capitalize() + "."
nmclean 27/02

16

Ferrugem + Toki Pona

Como qualquer idioma é aceito, escrevi um programa em Rust que gera algumas frases em Toki Pona .

O Toki Pona é uma tentativa de criar uma linguagem natural mínima e possui uma gramática super simples e regular. Essa é uma propriedade muito ú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);
}

Não falo Toki Pona, mas achei a sintaxe do Toki Pona como um conjunto de regras da BNF na Wikipedia. Criei uma estrutura ou enumeração para cada regra do BNF e as anotei deriving(Rand), o que me permite gerar uma Phraseestrutura aleatória gratuitamente! Em seguida, implementei ToStrpara cada uma dessas estruturas para convertê-las em uma sequência.

Eu intencionalmente deixei os nomes da estrutura em francês, porque as regras da BNF que encontrei são em francês e também porque ela reinfoca a natureza multilíngue da minha submissão!

Saídas de amostra

Algumas saídas e suas traduções, que eu fiz com base nas regras do BNF e no dicionário Toki Pona . Tenho certeza de que essas traduções estão erradas, mas o Toki Pona realmente deixa muito espaço para a interpretação de uma frase.

nasin mi tawa la jan li jaki

Enquanto estava na minha viagem, alguém poluiu

monsi li jaki li jan ike musi

A bunda está suja e é uma pessoa engraçada e ruim

sina li tawa ale jelo e kili tawa e insa

Você mudou a fruta e o centro para o universo amarelo

Problemas

  • Não verifico se um verbo é transitivo ou não, portanto, algumas frases estão gramaticalmente incorretas.
  • Algumas estruturas são recursivas e, quando uma regra pode ser repetida, escolho aleatoriamente a saída de 0, 1 ou 2 elementos. Isso pode levar a sentenças muito geradas, contendo milhares de palavras ...
  • Eu realmente não posso verificar a validade da saída, confio inteiramente na sintaxe do BNF, no dicionário e em minhas próprias suposições :)

11
sina li tawa ale jelo e kili tawa e insa == "Você moveu a fruta e o centro para o universo amarelo" Muito bom para uma máquina, geralmente apenas usuários avançados de TP podem usar construções transformadoras.
MatthewMartin

11
monsi li jaki li jan ike musi == O bumbum (bunda? como em idiota?) está sujo e é uma pessoa engraçada e ruim.
MatthewMartin

11
Ei, obrigado por seus comentários, @MatthewMartin! Eu certamente não esperava um alto-falante Toki Pona para ver minha submissão, mas estou contente de saber que estes senteces são rabiscos não completa :)
Barjak

Dica: não é um código de golfe.
nyuszika7h

11
@ nyuszika7h Não sei ao certo qual é o objetivo do seu comentário. Na verdade, não é um código de golfe, pois é um concurso de popularidade.
Barjak

14

Pitão

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
Você poderia argumentar que import antigravityleva à saída I LEARNED IT LAST NIGHT! EVERYTHING IS SO SIMPLE!? : D
ace_HongKongIndependence

Sem dúvida sim.
Renae Lider

14

Prolog

Use o retorno do prólogo e uma gramática generativa aproximando a gramática inglesa para gerar todas as frases possíveis.

Esta versão possui um vocabulário e uma estrutura de frases bastante limitados, mas deve ser bem fácil de estender.

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

Execute esta consulta:

sentence(L).

para gerar todas as frases possíveis nesse idioma.

Algumas saídas de amostra:

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: Permitir cláusulas subordinadas a objetos).


11
Algum exemplo de saída de sentença?
TheDoctor 22/02

Sim, eu coloquei algumas amostras na resposta. Ele gera 2520 saídas no total, embora isso não posso postar todos eles ...
Chrisd

11

Pitão

Como você sabe, você pode fazer qualquer coisa em python com poucos imports. Essa tarefa simples pode ser realizada com este script python de 2 linhas.

import random

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

O número de sentenças geradas por esse script é enorme: 10^12sentenças diferentes. Se a leitura de uma sentença leva aproximadamente 0,5 segundos, a leitura de todas leva mais de 15000 anos!

Algumas frases de exemplo:

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

No entanto, todas as sentenças geradas contêm um sujeito, um verbo e um objeto.

ATUALIZAR:

Recebi algumas críticas sobre algumas palavras sofisticadas que essa ferramenta complexa pode produzir. Aqui está uma versão um pouco mais longa que deve estar de acordo com a maioria das listas de palavras.

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

Aqui estão algumas frases de exemplo:

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

Eu não consigo encontrar algumas das suas palavras no meu dicionário
Dr. belisarius

5
Ajustei meu software para melhor se ajustar ao seu dicionário ruim.
Antonio Ragagnin

2
Está bem. Em 15000 anos, postarei para certificar que os encontrei todos
Dr. belisarius

10

Brincando com o dicionário interno do 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

Você tem sorte, digamos, 70% do tempo. Ele gera coisas como:

um circuito elétrico das
amígdalas além de Parkia era irrestrito, embora
atrapalhasse sua sociedade longânima
Doutor em Educação resposta ininteligível ao
pequeno teatro musical de kibbutz contra Julius Caesar
e Tai nuthatch
ceifam-se no centro esportivo contra a sua irreverência
os detergentes extrínsecos necessários
sem o feiticeiro necromântico
essas veias pectoralis opostas à minha latria mulher troféu investidores
que definem tendências marrom que homem um campo de fogo portátil
umbra encantadoramente em que minha resposta
outra tempestade de destroços soltos sem cheiro aslante aslante do Aral Mar complexo waffle
para prazer professado tipo mongolóide de metal

mas às vezes:

adoção de mina, pelo menos, a batalha de Lutzen ganharia dinheiro durante o tempo em que Hejira, do cutelo,
nove gêneros comuns de subducção de olho roxo, Seiurus, comove seu público

Bem, o uso do inglês é melhor que o meu.


8

VBA / Excel

[editar 2]

Ensinei como conjugar verbos, os exemplos abaixo são simples do passado:

A cocaína selvagem moderada deslizou a par da histórica decisão instantânea. O capítulo regional seguro se encaixou dentro da numerosa entidade aleatória. O domínio direito amarelo foi removido atrás do gênero frágil magnético. A poluição física fatal começou além da pobre sensação de morte. O teatro cognitivo corajoso foi para a frente da literatura frágil e consciente. A saída real convencional resistiu ao local imunológico favorito. O gêmeo econômico fixo reconhecido pela necessidade humana maligna.

A seguir, o código relevante, excluindo várias funções auxiliares de análise e loop. As partes principais que faltam são as várias listas de palavras (por partes do discurso) que fazem pluralização, tempos, conjugações, etc.

Todas as raízes das palavras são escolhidas aleatoriamente, mas forço-as a serem organizadas em um padrão de frase específico:

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

... que é o que eu usei para gerar a saída acima. Segue a forma geral de "A rápida raposa vermelha pulou sobre o cachorro marrom preguiçoso".

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

[iniciar postagem original]

Ainda um trabalho em andamento, é necessário adicionar lógica aos tempos e pluralização de substantivo / verbo, a saber:

Sua viagem média é nossa suposta dose, nem um aumento de temperatura além do meu tomate.

... que é analisável, mas não faz muito sentido.

A programação permite que o pescador sujo esteja longe do nosso elenco de porco, em vez de nenhuma frase.

Direito. Não é realmente uma frase, mas é melhor do que algumas mensagens de erro do JavaScript.

Seu apelo eleva todas as perguntas ao vivo que minha senhora descreve em inglês.

A rotina de insinuações é quase de alto nível ...

Código a seguir anon. Este concurso tem prazo?

[editar 1]

Código que gerou o acima.

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
Onde está o seu código?
ace_HongKongIndependence

Veja minha edição para o código.
Brandon R. Gates

6

Perl 5

OK, a coragem do programa é exatamente isso:

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

É basicamente um mecanismo "madlib". Para realmente gerar frases interessantes, você precisa preencher %padcom alguns dados. Aqui está um exemplo %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',
  ],
);

Aqui estão alguns exemplos da sabedoria que descobri disso %pad. Essas frases não foram editadas para tamanho, pontuação, gramática etc., embora eu tenha selecionado algumas desinteressantes e reorganizado a ordem em que as frases aparecem - elas não estão mais na ordem em que foram geradas, mas estou tentando use-os para contar uma história: uma história que espero que você ache emocionante e instigante.

  • As teias de aranha são curtas.
  • Teias de aranha fascinam regularmente.
  • Macacos curtos brilham, mas as teias de aranha bebem avidamente.
  • Macacos cintilantes (ainda cheirosos) seguiram o pequeno (ainda cintilante) gorila.
  • O cume do Monte Everest recebeu o estegossauro altamente decorado.
  • Não apenas o cume do Monte Everest é caro, mas também o elenco de "Glee" da televisão seguiu o gorila cintilante.
  • O elenco de "Glee" da televisão se assemelha à caixa de correio lilás.
  • A cara caixa de correio é alta, e o caro estegossauro pula Chuck Norris, mas sapatos verdes pularam o sanduíche de salada de carne.
  • O sanduíche de salada de carne amado Chuck Norris.
  • Milhões de enguias brilhantes são verdes (mas fantasmagóricas).

Agora, se você pudesse preencher pad programaticamente
Pureferret

Preencher a área de programação programaticamente não é um grande desafio. Apenas raspe wikcionário ou algo assim. Isso não produziria frases tão divertidas.
tobyink

Não é um grande desafio, mas acho que é uma parte divertida.
Pureferret 25/02

5

Ms Word

Não tenho certeza se isso é aceitável, mas como o html é, acho que isso também deve ser aceitável.

 =rand(1,1)

Exemplos de frases:

Na guia Inserir, as galerias incluem itens projetados para coordenar com a aparência geral do seu documento.

Você pode usar essas galerias para inserir tabelas, cabeçalhos, rodapés, listas, páginas de rosto e outros blocos de construção de documentos.

você também pode especificar qualquer número de frases e parágrafos.


4

Um trabalho em andamento usando 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);
        }
    }

}

Problemas:

  • Frases são muito simples
  • Ocasionalmente 404s (sem bom manuseio!)
  • Gera apenas uma frase por vez
  • Usa uma caixa de comutação!

Saídas de amostra:

Popoloca prickethes feijão corredor.
O Trópico de Capricórnio irradia os corpos.
Pequim é sinônimo de fronhas.
Chukchis enculturados influenciando.


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

Ele busca as 30 pesquisas mais populares do Google, realiza uma pesquisa "Sinto-me com sorte" e exibe uma frase aleatória dessa página com pelo menos três palavras.

Exemplos:

"Ela foi considerada a favorita da medalha no evento."

"Kate se formou no colegial um ano antes."

"15 de abril de 2014, para promover o cumprimento da política de biografias de pessoas vivas."

"Em nome de Bryan, nós, sua família, gostaríamos de agradecer a todos pelo derramamento de amor, orações e apoio".

"Este artigo é sobre o jogador de basquete americano".

"Desculpe, seu navegador tem o JavaScript desabilitado ou não possui nenhum player compatível."


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

resultado:

Gere uma frase que possa ser lida e compreendida


Use os URIs de compartilhamento do Stack Exchange (por exemplo, em /q/21571vez de /questions/21571/generate-an-understandable-sentence).
Blacklight Shining

2
Como esse não é um código de golfe, as quebras de linha para facilitar a leitura seriam boas.
nyuszika7h

2

Script de Shell

Esse script sempre exibirá o título da primeira pergunta que está atualmente no topo deste site. Minha suposição é que o título da pergunta sempre será legível por humanos. E isso mudará dinamicamente. Portanto, sempre que surgir uma nova pergunta e quando o script for executado, ele dará o título da pergunta mais recente.

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

Saída da versão experimental 1

Find words containing every vowel

Saída da versão 2

Hello World 0.0!

EDITAR

Não está usando nenhum arquivo. Sem arquivos, eu posso usar o script abaixo.

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

Resultado

Generate an understandable sentence

11
nem é lê-los diretamente de um arquivo ...
rafaelcastrocouto

Fiz as alterações para não usar um arquivo. Agora, apenas usou as variáveis. Que tal este?
Ramesh

2
removido para baixo votação!
Rafaelcastrocouto

2

JavaScript (ES6)

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

A execução no console produz

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

Ainda mais curto:t='';for(f of [_=>foo,_=>null.a,_=>0..toString(0)])try{f()}catch(e){t+=e.message+'\n'}t
Escova de dentes

2

Ainda outro script Python

A resposta do usuário3058846 não é ruim, mas exibe todas as frases, sempre. Aqui, proponho um script que produza uma frase aleatória do Zen of 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))

Em uma linha, para fãs 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, sujo.)

Exemplos:

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


Outra maneira divertida em Python

Graças a @TheDoctor, despeje a idéia :-) Silencie a saída de importação e brinque com o ditado pseudo-criptografado no 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.'
>>>

Geralmente, é uma prática ruim de usar shell=True. Embora não seja inseguro nesse caso, como você não está recebendo informações do usuário, eu optaria subprocess.Popen(('python', '-c', 'import this')).
nyuszika7h

Você sabia que se pode silenciar o poema de import this, existe uma variável no módulo thisque contém todo o texto, mas criptografado. Há também um dicionário para descriptografá-lo.
TheDoctor

11
@TheDoctor Veja minha resposta atualizada: D
Maxime Lorant

1

Python 3

Garantido para gerar saída gramatical! (Usualmente.)

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 torná-lo perfeitamente gramatical, exclua o sublinhado de wordregex. Isso não permitirá entradas de várias palavras que levem a frases incorretas, como "Nós fechamos você".

Exemplo de execução:

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?

Saída favorita até agora:

They you her.

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


0

Pitão

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)

Usei a lista de palavras daqui Encontre palavras que contenham todas as vogais

Mais algumas regras podem ser adicionadas. Por exemplo, se uma palavra que termina com "ness" e a palavra também existem em conjunto sem o sufixo, é um substantivo.

Código fonte:

#!/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
Eu realmente sou péssima em Python e Inglês, ou você está produzindo 3 substantivos em vez de 2 substantivos e um verbo?
ace_HongKongIndependence

@ace Opa, eu decidi corrigir o código nos últimos minutos :-(
yegle 20/02

0

Bater

Tentar executar um programa que existe, mas não está instalado, fornece isso (no 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'

Em distros diferentes, fornece uma frase diferente.
TheDoctor

É por isso que eu disse no LM13
user80551

0

Python 3

Outra visão de The Zen of Python , inspirada na resposta 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))

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
Indique qual é o idioma.
Rodolfo Dias

11
@RodolfoDias Eu tenho certeza que isso é Javascript ... mas não tenho certeza.
TheDoctor
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.