朴素的马尔可夫链词生成


9

有许多产生随机单词的方法。您可以从集合中提取随机音节,可以使用n元组,可能使用神经网络(它们不能做什么?),在辅音和元音之间交替等等。到目前为止,此挑战所基于的方法是最差的。它使用马尔可夫链生成随机词。如果您熟悉马尔可夫链,您可能会知道为什么这种方法如此糟糕。

如果您想阅读有关马尔可夫链的信息,请单击此处

您的程序将采用加权马尔可夫链的方法,输入一个或多个单词并生成一个随机单词。既然这可能对我来说都没有道理,那么以下是使用马尔可夫链的图片并输入以下内容的一种解释abba

<code> abba </ code>的马尔可夫链

(所有图片的所有边缘权重都相同)您的程序将基于输入文本通过马尔可夫链输出路径。如您所见,它将有1/2的机会输出a,1/8的机会,1/ aba16的机会abba,1/32的机会ababa,等等。

以下是一些其他示例马尔可夫链:

yabba dabba doo

在此处输入图片说明

wolfram

在此处输入图片说明

supercalifragilisticexpialidocious

在此处输入图片说明

如果您需要更多示例,请使用this。(我太努力了)

挑战详情:

  • 输入可以作为字符串列表,也可以作为空格,逗号或换行符分隔的字符串
  • 您可能会假设所有单词都将全部为小写且没有标点符号(ASCII 97-122)
  • 您可以编写程序或函数
  • 为了进行测试,您可能可以输入示例并查看所有输入是否与马尔可夫链对齐

这是 ,因此您的程序以字节计。

让我知道是否有任何不清楚的地方,我将尝试使其更有意义。


这对很多人来说可能很有意义,因为Chatgoat和Marky都是加权的Markov聊天机器人IIRC。
ASCII码,仅ASCII

我不了解输入与那些马尔可夫链之间的关系。有时似乎不可能通过使用给定链中的一条路径来产生输入单词(例如,“ yabba dabba doo”。没有自循环,b因此您无法产生双精度b。此外,一旦到达a b,就似乎不可能返回以start产生其他字词)。我相信您必须阐明要求是什么...
Bakuriu

@Bakuriu上的错误yabba dabba doo是一个意外。我会尽快修复。至于无法重新开始,您只能从给的一单词中生成一个单词。这样可以澄清吗?
DanTheMan

Answers:


5

Pyth,38 32字节

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

感谢FryAmTheEggman提供5个字节!老实说,当我发现有人发布了一个非常类似的答案时,我开始编写Python答案,所以我决定用一些新东西挑战自己,所以我在Pyth中重写了答案(基本上是Pietu的答案)。

输入是一个字符串数组 ["Mary" , "had" , "a" , "little"]


好的第一篇文章,欢迎来到PPCG :)一些高尔夫技巧:FV在不希望使用的变量被覆盖时有用,因此您可以将first更改FdVdN其他地方替换。[)围绕一个元素与相同]。无需添加到列表,您可以使用append(a)保存转换。总的来说,我认为您可以通过采用更实用的方法来缩短此时间。我也不知道这+kJ是干什么的,将空字符串添加到字符串应该是noop吗?
FryAmTheEggman

谢谢!我很想采用更多的函数方法,但我对函数方面的知识并不精通(lambda表达式可能是我最近的经验)。谢谢你的字节!
Lause

4

Python 2中,138个 133字节的

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

接受字符串数组,例如["yabba", "dabba", "doo"]

该输入的示例输出:

do
ya
dabbbbbbbaba
do
ya
yaba
da
dabba
yabbababbababbbbababa
do

我也想强调这个结果。

stidoupilioustialilisusupexpexpexpicexperagilidoupexpexpilicalidousupexpiocagililidocercagidoustilililisupialis

2

红宝石,112 107 101 99

输入的是stdin,换行符分隔的字符串。

QPaysTaxes在打高尔夫球方面大有帮助!

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
我要感谢信贷机构:D(在这里似乎很常见,例如“感谢QPaysTaxes提供高尔夫帮助”之类的东西)
Fund Monica的诉讼

1

Matlab,160字节

将输入作为字符串的单元格数组,例如{'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))

这将读取单词,并将其转换为ASCII值的向量,其中96表示单词的开头,而123表示单词的结尾。要构建随机词,请从96开始。在向量中搜索所有跟随96的整数,并从这些整数中抽取一个随机样本以选择下一个字母。重复此步骤,查找当前整数之后的所有整数,直到达到123,这表示单词的结尾。将其转换回字母并显示。

输入{'yabba','dabba','doo'}产生类似的结果da。这里有十个运行的结果:yabababbbababadadoodooooooyadadooooyadoyaba

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.