나이브 마르코프 체인 단어 생성


9

임의의 단어를 생성하는 방법에는 여러 가지가 있습니다. 세트에서 임의 음절을 가져와 n- 튜플, 아마도 신경망 (무엇을 할 수 없습니까?), 자음과 모음 사이를 번갈아 사용할 수 있습니다.이 도전의 기반이되는 방법은 훨씬 최악 . 임의의 단어를 생성하기 위해 Markov 체인을 사용합니다. 친숙한 Markov 체인이라면 아마도이 방법이 왜 그렇게 끔찍한 지 알 것입니다.

Markov 체인에 대해 읽으려면 여기를 클릭하십시오 .

프로그램은 가중 마르코프 체인의 방법을 통해 하나 이상의 단어를 입력하고 임의의 단일 단어를 생성합니다. 아마도 나 외에는 아무도 이해가되지 않기 때문에 다음과 같은 입력으로 Markov 체인의 그림을 사용하여 설명합니다 abba.

<code> abba </ code>에 대한 Markov 체인

(가장자리 가중치는 모든 그림에서 동일합니다.) 프로그램은 입력 텍스트를 기준으로 Markov 체인을 통해 경로를 출력합니다. 보시다시피, 1/2 확률 a, 1/8 확률 aba, 1/16 확률 abba, 1/32 확률 ababa등이 있습니다.

Markov 체인의 다른 예는 다음과 같습니다.

yabba dabba doo

여기에 이미지 설명을 입력하십시오

wolfram

여기에 이미지 설명을 입력하십시오

supercalifragilisticexpialidocious

여기에 이미지 설명을 입력하십시오

더 많은 예제를 원하면 this를 사용 하십시오 . (나는 너무 열심히 일했다)

도전의 세부 사항 :

  • 입력은 문자열 목록 또는 공백, 쉼표 또는 줄 바꾸기로 구분 된 문자열로 취할 수 있습니다.
  • 구두점없이 모든 단어가 완전히 소문자라고 가정 할 수 있습니다 (ASCII 97-122)
  • 프로그램이나 함수를 작성할 수 있습니다
  • 테스트하기 위해 예제를 입력하고 모든 입력이 Markov 체인과 일치하는지 확인할 수 있습니다.

이것은 이므로 프로그램의 점수는 바이트입니다.

이것의 어떤 부분이 불분명한지 알려 주시면 더 이해하도록 노력하겠습니다.


Chatgoat와 Marky는 모두 Markov chatbots IIRC에 가중치를 부여하기 때문에 아마도 꽤 많은 사람들에게 의미가 있습니다.
ASCII 전용

입력과 Markov 체인 간의 관계를 이해하지 못합니다. 주어진 체인에서 하나의 경로를 사용하여 입력 단어를 생성하는 것이 불가능한 것 같습니다 (예 : "yabba dabba doo". 자체 루프가 b없으므로 double을 생성 할 수 없습니다 b. 또한 도달하면 b불가능합니다) start다른 단어를 생산하기 위해로 돌아갑니다 ). 나는 당신이 요구 사항을 명확히해야한다고 생각합니다 ...
Bakuriu

@Bakuriu의 오류 yabba dabba doo는 사고입니다. 최대한 빨리 수정하겠습니다. 다시 시작할 수 없다는 것에 관해서 는 주어진 단어 세트 에서 하나의 단어 만 생성 합니다. 그것이 명확합니까?
DanTheMan

답변:


5

Pyth, 38 32 바이트

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

5 바이트 동안 FryAmTheEggman 에 감사 합니다! 솔직히 말해서 누군가가 매우 비슷한 것을 게시했을 때 파이썬 답변을 작성하기 시작했습니다. 그래서 나는 새로운 무언가로 나 자신에게 도전하기로 결정했습니다.

입력은 문자열의 배열입니다 ["Mary" , "had" , "a" , "little"]


좋은 첫 번째 게시물, PPCG에 오신 것을 환영합니다 :) 일부 골프 팁 : F변수 V가 원하지 않을 때 변수 가 재정의 될 때만 유용 하므로 첫 번째 항목 Fd을 변경하고 다른 곳으로 V바꿀 dN있습니다. [)한 요소 주위는와 같습니다 ]. 목록에 추가하는 대신 append ( a)를 사용하여 전송을 저장할 수 있습니다 . 더 일반적으로, 당신은 아마도 더 기능적인 접근 방식을 취함으로써 이것을 짧게 만들 수 있다고 생각합니다. 또한 +kJ빈 문자열을 문자열에 추가하는 것이 엉망이되어야합니다.
FryAmTheEggman

감사! 나는 슬프게도 더 기능적인 접근 방식을 취하고 싶습니다. 나는 기능적인 것들에 정통하지 않습니다 (람다 표현은 아마도 가장 가까운 경험 일 것입니다). 그런데 바이트 주셔서 감사합니다!
Lause

4

파이썬 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 ( "골프 도움에 대한 QPaysTaxs의 감사와 같은 것"과 같은 일이 여기에서 일반적으로 보입니다)
Fund Monica 's Lawsuit

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. 여기에 열 실행의 결과는 다음과 같습니다 : yabababbbababa, da, doo, doooooo, ya, da, doooo, ya, do, yaba.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.