ナイーブマルコフ連鎖の単語生成


9

ランダムな単語を生成するには多くの方法があります。セットからランダムな音節を取り出すことができます。nタプル、おそらくニューラルネットワークを使用できます(何ができないのですか?)、子音と母音を交互に使用します。この課題の基本となる方法は、最悪です。マルコフ連鎖を使用してランダムな単語を生成します。あなたがマルコフ連鎖に精通しているなら、おそらくこの方法がそれほどひどい理由を知っているでしょう。

マルコフ連鎖について読みたい場合は、ここをクリックしてください

プログラムは、重み付けされたマルコフ連鎖の方法によって、1つ以上の単語を入力として受け取り、ランダムな単語を1つ生成します。それはおそらく私以外には理解できないので、以下の入力を伴うマルコフ連鎖の画像を使用して説明しますabba

<code> abba </ code>のマルコフ連鎖

(すべてのエッジの重みはすべての画像で同じです)プログラムは、入力テキストに基づいてマルコフ連鎖を介してパスを出力します。ご覧のとおり、出力される確率は1/2 a、確率は1/8、確率はaba1/16、確率はabba32 分の1 ababaなどです。

マルコフ連鎖の他の例をいくつか示します。

yabba dabba doo

ここに画像の説明を入力してください

wolfram

ここに画像の説明を入力してください

supercalifragilisticexpialidocious

ここに画像の説明を入力してください

さらに例が必要な場合は、これを使用してください。(私はそれにあまりにも努力しすぎました)

チャレンジの詳細:

  • 入力は、文字列のリスト、またはスペース、コンマ、または改行で区切られた文字列として受け取ることができます
  • あなたはすべての単語が句読点なしで完全に小文字であると仮定するかもしれません(ASCII 97-122)
  • プログラムまたは関数のいずれかを記述できます
  • テストするには、例を入力して、すべての入力がマルコフ連鎖と一致するかどうかを確認できます

これはなので、プログラムはバイト単位でスコアリングされます。

これについて不明な点がある場合はお知らせください。わかりやすくするよう努めます。


ChatgoatとMarkyはどちらもマルコフチャットボットIIRCに重み付けされているため、これはおそらく非常にフリーの人には理にかなっています。
ASCIIのみ

入力とマルコフ連鎖との関係がわかりません。指定されたチェーンの1つのパスを使用して入力単語を生成するbことができないように見える場合があります(たとえば、「yabba dabba doo」。自己ループがないため、doubleを生成できませんb。さらに、一度到達するbと、に戻りstart、他の単語を生成します)。要件を明確にする必要があると思います...
バクリウ

@Bakuriuのエラーyabba dabba dooは事故です。できるだけ早く修正します。最初からやり直すことができないことに関しては、与えられた単語のセットから1つの単語のみを生成します。それはそれを明確にしますか?
DanTheMan 2016年

回答:


5

Pyth、38 32バイト

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

5バイトのFryAmTheEggmanに感謝!正直なところ、誰かが非常に似たようなものを投稿したことに気付いたとき、Pythonの回答を書き始めたので、何か新しいことに挑戦することにしたので、私の回答(基本的にはPietuの回答)をPythで書き直しました。

入力は文字列の配列です ["Mary" , "had" , "a" , "little"]


ニースの最初のポストは、PPCGへようこそ:)いくつかのゴルフのヒント:F変数の場合にのみ、これまで有効ですVあなたはそれをしたくないときは、最初に変更できるように使用することになり、上書きされますFdVして交換dしてN他の場所。[)1つの要素の周りはと同じ]です。リストに追加する代わりに、追加(a)を使用してキャストを保存できます。より一般的には、より機能的なアプローチをとることにより、おそらくこれを短くすることができると思います。また、+kJ目的がわからないので、空の文字列を文字列に追加しても何も起こらないはずです。
FryAmTheEggman 2016年

ありがとう!残念ながら、もっと機能的なアプローチをとりたいと思っています。機能的なものに精通していません(ラムダ式はおそらく私の最も近い経験です)。ちなみにバイトありがとう!
ラウズ

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

Ruby、112 107 101 99

入力は、標準入力、改行区切りの文字列です。

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に感謝する」などのようなことがこのあたりでよくあるようです)
モニカの訴訟に資金

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。ここでは10の実験の結果は以下のとおりです。yabababbbababadadoodooooooyadadooooyadoyaba

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.