Geração de Palavras naïve Markov Chain


9

Existem muitas maneiras de gerar palavras aleatórias. Você pode pegar sílabas aleatórias de um conjunto, usar n-tuplas, provavelmente redes neurais (o que elas não podem fazer?), Alternar entre consoantes e vogais, etc. O método em que esse desafio se baseia é de longe o pior . Ele usa uma cadeia de Markov para gerar palavras aleatórias. Se você conhece cadeias Markov, provavelmente sabe por que esse método é tão terrível.

Se você quiser ler sobre as cadeias de Markov, clique aqui .

Seu programa irá inserir uma ou mais palavras e gerar uma única palavra aleatória, através do método de uma cadeia de Markov ponderada. Como isso provavelmente não faz sentido para ninguém além de mim, aqui está uma explicação através do uso de uma imagem da cadeia de Markov com a entrada de abba:

Uma cadeia de Markov para <code> abba </code>

(Todos os pesos das bordas são iguais para todas as imagens) Seu programa produzirá o caminho através de uma cadeia de Markov com base no texto de entrada. Como você pode ver, existe uma chance de 1/2 da saída a, 1/8 de chance aba, 1/16 de chance abba, 1/32 de chance ababa, etc.

Aqui estão alguns outros exemplos de cadeias de Markov:

yabba dabba doo

insira a descrição da imagem aqui

wolfram

insira a descrição da imagem aqui

supercalifragilisticexpialidocious

insira a descrição da imagem aqui

Se você quiser mais exemplos, use isso . (Eu trabalhei demais nisso)

Detalhes do desafio:

  • A entrada pode ser considerada como uma lista de cadeias ou como uma cadeia separada por espaço, vírgula ou nova linha
  • Você pode assumir que todas as palavras serão totalmente minúsculas, sem pontuação (ASCII 97-122)
  • Você pode escrever um programa ou uma função
  • Para testar, você provavelmente pode inserir os exemplos e ver se todas as entradas estão alinhadas com as cadeias de Markov

Isso é , então seu programa é pontuado em bytes.

Deixe-me saber se alguma parte disso não está clara, e tentarei fazer com que faça mais sentido.


Provavelmente faz sentido para um povo bastante livre, porque Chatgoat e Marky são os chatbots de Markov IIRC ponderados.
somente ASCII

Não entendo a relação entre a entrada e as cadeias de Markov. Às vezes, parece impossível produzir a palavra de entrada usando um caminho na cadeia especificada (por exemplo, "yabba dabba doo". Não há auto loop para bque você não possa produzir um duplo b. Além disso, quando você alcança um b, não parece possível retorne ao startpara produzir as outras palavras). Eu acredito que você deve esclarecer quais são os requisitos ...
Bakuriu

@Bakuriu o erro no yabba dabba dooé um acidente. Vou consertar o mais rápido possível. Quanto a não poder voltar ao início, você gera apenas uma palavra a partir de um determinado conjunto de palavras. Isso esclarece?
21416 DanTheMan

Respostas:


5

Pitão, 38 32 bytes

VQJK1FZacN1k XKH]Z=KZ;WJ=JO@HJpJ

Obrigado a FryAmTheEggman por 5 bytes! Para ser sincero, comecei a escrever a resposta em Python quando notei que alguém postou uma resposta muito semelhante, então decidi me desafiar com algo novo, então reescrevi minha resposta (que era basicamente a resposta de Pietu) em Pyth.

Input é uma matriz de strings ["Mary" , "had" , "a" , "little"]


Bom primeiro post, bem-vindo ao PPCG :) Algumas dicas de golfe: Fé somente sempre útil quando a variável Vusaria obtém substituído quando você não quer que ele, assim que você pode mudar o primeiro Fdpara Ve substituir dcom Noutro lugar. [)em torno de um elemento é o mesmo que ]. Em vez de adicionar a uma lista, você pode usar append ( a) para salvar a transmissão. Mais em geral, acho que você provavelmente pode reduzir esse número adotando uma abordagem mais funcional. Também não tenho certeza para que +kJserve, adicionar a string vazia a uma string deve ser um noop?
FryAmTheEggman 17/03

Obrigado! Eu adoraria ter uma abordagem mais funcional, infelizmente, não sou versado em coisas funcionais (expressões lambda são provavelmente a minha experiência mais próxima). Obrigado pelos bytes pelo caminho!
Maruse 17/03

4

Python 2, 138 133 bytes

from random import*
M={}
for w in input():
 P=p=1
 for k in list(w)+[""]:M[p]=M.get(p,[])+[k];p=k
while P:P=choice(M[P]);k+=P
print k

Toma em uma matriz de seqüência de caracteres como ["yabba", "dabba", "doo"].

Exemplo de saídas com essa entrada:

do
ya
dabbbbbbbaba
do
ya
yaba
da
dabba
yabbababbababbbbababa
do

Eu também quero destacar este resultado.

stidoupilioustialilisusupexpexpexpicexperagilidoupexpexpilicalidousupexpiocagililidocercagidoustilililisupialis

2

Ruby, 112 107 101 99

A entrada é stdin, strings separadas por nova linha.

QPaysTaxes ajudou muito no golfe!

M={}
while gets
k=''
$_.each_char{|c|M[k]||=[];M[k]<<c;k=c}
end
k=''
print k=M[k].sample while M[k]

11
Eu apreciaria crédito: D (algo como "graças a QPaysTaxes para golfe ajuda" ou algo semelhante parece ser comum por aqui)
Ação do Fundo Monica

1

Matlab, 160 bytes

Recebe entrada como uma matriz de células de strings, como {'string1','string2','string3'}.

s=input('');n=[];l=96;for i=1:numel(s);n=[n 96 double(s{i}) 123];end
while(l(end)<123);p=n(find(n==l(end))+1);l=[l p(randsample(nnz(p),1))];end
char(l(2:end-1))

Isso lê as palavras e as converte em um vetor de valores ASCII, com um 96 para marcar o início de uma palavra e um 123 para representar o final de uma palavra. Para construir uma palavra aleatória, comece com um 96. Procure todos os números inteiros que seguem 96 no vetor e pegue uma amostra aleatória para escolher a próxima letra. Repita isso, procurando todos os números inteiros que seguem o atual, até que 123 seja alcançado, o que indica o fim da palavra. Converta-o novamente em letras e exiba.

A entrada {'yabba','dabba','doo'}produz resultados como da. Aqui estão os resultados de dez corridas: yabababbbababa, da, doo, doooooo, ya, da, doooo, ya, do, yaba.

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.