Saf Markov Zinciri Kelime Üretimi


9

Rastgele kelimeler üretmenin birçok yolu vardır. Bir setten rastgele heceler alabilir , ünsüzler ve ünlüler arasında dönüşümlü olarak n-tuples, muhtemelen sinir ağları (ne yapamazlar?) Kullanabilirsiniz . Bu zorluğun temel aldığı yöntem çok kötü . Rastgele kelimeler üretmek için bir Markov zinciri kullanır. Eğer Markov zincirlerini biliyorsanız, muhtemelen bu yöntemin neden bu kadar korkunç olduğunu biliyorsunuzdur.

Markov zincirleri hakkında okumak istiyorsanız, buraya tıklayın .

Programınız bir veya daha fazla kelime girecek ve ağırlıklı bir Markov zinciri yöntemiyle tek bir rastgele kelime oluşturacaktır. Bu muhtemelen benden başka kimseye mantıklı olmadığından, Markov zincirinin bir resminin girişi ile kullanılmasıyla bir açıklama abba:

<code> abba </code> için bir Markov zinciri

(Tüm kenar ağırlıkları tüm resimler için aynıdır) Programınız, giriş metnine dayalı olarak yolu bir Markov zincirinden çıkarır. Gördüğünüz gibi, çıkacağı 1/2 şans a, 1/8 şans aba, 1/16 şans abba, 1/32 şans ababavb. Var .

Markov zincirlerinden bazıları:

yabba dabba doo

resim açıklamasını buraya girin

wolfram

resim açıklamasını buraya girin

supercalifragilisticexpialidocious

resim açıklamasını buraya girin

Daha fazla örnek isterseniz, kullanmak bu . (Üzerinde çok çalıştım)

Meydan okuma ayrıntıları:

  • Giriş, dizelerin listesi olarak veya boşluk, virgül veya satırsonu ile ayrılmış dize olarak alınabilir
  • Tüm kelimelerin noktalama işareti olmadan tamamen küçük harf olacağını varsayabilirsiniz (ASCII 97-122)
  • Bir program veya işlev yazabilirsiniz
  • Test etmek için muhtemelen örnekleri girebilir ve tüm girişlerin Markov zincirleriyle aynı hizada olup olmadığını görebilirsiniz.

Bu , programınız bayt cinsinden puanlanır.

Bunun herhangi bir kısmının belirsiz olup olmadığını bana bildirin ve daha anlamlı hale getirmeye çalışacağım.


Muhtemelen oldukça özgür insanlar için mantıklıdır, çünkü Chatgoat ve Marky'nin ikisi de ağırlıklı Markov chatbot IIRC'dir.
Yalnızca ASCII

Girdi ve Markov zincirleri arasındaki ilişkiyi anlamıyorum. Bazen kullanarak giriş kelime üretmek imkansız gibi görünen bir örnek "yabba dabba doo". Hayır için kendini döngü (verilen zincirinde yolunu bbir çift üretemez böylece b. Üstelik sen ulaştıktan sonra bir bo kadar mümkün görünmüyor startdiğer kelimeleri üretmek için geri dön ). İhtiyaçların ne olduğunu açıklığa kavuşturmak gerektiğine inanıyorum ...
Bakuriu

@Bakuriu bir hatadır yabba dabba dookaza. En kısa sürede düzeltirim. Başlamak için geri dönememeye gelince, belirli bir kelime kümesinden yalnızca bir kelime üretersiniz. Bu açıklığa kavuşuyor mu?
DanTheMan

Yanıtlar:


5

Pyth, 38 32 bayt

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

5 bayt için FryAmTheEggman'a teşekkürler ! Dürüst olmak gerekirse, birisinin çok benzer bir şey gönderdiğini fark ettiğimde Python cevabı yazmaya başladım, bu yüzden kendime yeni bir şeyle meydan okumaya karar verdim, bu yüzden Pyth'de cevabımı (temelde Pietu'nun cevabı) yeniden yazdım.

Girdi bir dizgi dizisidir ["Mary" , "had" , "a" , "little"]


Güzel sonrası ilk, bazı golf ipuçları :) PPCG hoş geldiniz: Fdeğişken zaman sadece hiç yararlıdır Vsiz istediğiniz olmadığı zamanlarda ilk değiştirebilir böylece kullanımı geçersiz olur olur Fdetmek Vve değiştirme dile Nbaşka bir yerde. [)bir elemanın çevresi ile aynıdır ]. Bir listeye eklemek yerine a, döküm işlemini kaydetmek için append ( ) yöntemini kullanabilirsiniz . Daha genel olarak, daha işlevsel bir yaklaşım izleyerek bunu muhtemelen daha kısa hale getirebileceğinizi düşünüyorum. Ben de ne için emin değilim +kJ, bir dizeye boş dize ekleyerek bir noop olmalıdır?
FryAmTheEggman

Teşekkürler! Ne yazık ki daha işlevsel bir yaklaşım almak isterdim Ben işlevsel şeyler iyi usta değilim (lambda ifadeleri muhtemelen benim en yakın deneyimdir). Bu arada baytlar için teşekkürler!
Mart'ta Lause

4

Python 2, 138 133 bayt

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

Gibi bir dizi dize alır ["yabba", "dabba", "doo"].

Bu girişle örnek çıktılar:

do
ya
dabbbbbbbaba
do
ya
yaba
da
dabba
yabbababbababbbbababa
do

Ayrıca bu sonucu vurgulamak istiyorum.

stidoupilioustialilisusupexpexpexpicexperagilidoupexpexpilicalidousupexpiocagililidocercagidoustilililisupialis

2

Yakut, 112 107 101 99

Girdi stdin, satırsonu ile ayrılmış dizelerdir.

QPaysTaxes aşağı golf ile çok yardımcı oldu!

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

1
Kredi için teşekkür ederim: D ("Golf yardımı için QPaysTaxes sayesinde" gibi bir şey "veya benzeri burada yaygın görünüyor)
Monica'nın Davası

1

Matlab, 160 bayt

Girişi, dizeler gibi bir hücre dizisi olarak alır {'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))

Bu, sözcükleri okur ve bunları ASCII değerlerinin bir vektörüne dönüştürür; bir sözcüğün başlangıcını işaretlemek için 96 ve bir sözcüğün sonunu temsil etmek için 123. Rastgele bir kelime oluşturmak için 96 ile başlayın. Vektörde 96'yı takip eden tüm tam sayıları arayın ve sonraki harfi seçmek için bunlardan rastgele bir örnek alın. Kelimenin sonunu gösteren 123'e ulaşılana kadar geçerli olanı takip eden tüm tam sayıları arayarak bunu tekrarlayın. Harflere dönüştürün ve görüntüleyin.

Girdi {'yabba','dabba','doo'}, gibi sonuçlar üretir da. İşte on ishal sonuçları şunlardır: yabababbbababa, da, doo, doooooo, ya, da, doooo, ya, do, yaba.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.