2013-06-11 2 views
0

저는 파이썬으로 멍청한 사람입니다. 문장을 생성하기 위해 마코프 체인을 사용하는 코드가 있지만 코드 작업에서는 시작 단어 2 개를 정의해야하지만 처음 단어를 무작위로 선택했으면 좋겠습니까?파이썬에서 마크로프 체인이있는 문장을 작성하십시오.

import random 

def getLines(filename): 
return [line[0:-1] for line in open(filename).readlines()] 

def getWords(lines): 
words = [] 
for line in lines: 
    words.extend(line.split()) 
return words 

def createProbabilityHash(words): 
numWords = len(words) 
wordCount = {} 
for word in words: 
    if wordCount.has_key(word): 
    wordCount[word] += 1 
    else: 
    wordCount[word] = 1 

for word in wordCount.keys(): 
    wordCount[word] /= 1.0 * numWords 
return wordCount 

def getRandomWord(wordCount): 
randomValue = random.random() 
cumulative = 0.0 
choosenWord = "" 
print wordCount 
for word in wordCount: 
    probability = wordCount[word] 
    if probability > cumulative: 
     cumulative = probability 
     choosenWord = word 

return choosenWord 


words = getWords(getLines("frases.txt")) 
wordMap = {} 
previous = (words[0], words[1]) 
for word in words[2:]: 
if wordMap.has_key(previous): 
    wordMap[previous].append(word) 
else: 
    wordMap[previous] = [word] 
previous = (previous[1], word) 

for word in wordMap.keys(): 
probabilityHash = createProbabilityHash(wordMap[word]) 

wordMap[word] = probabilityHash 

palavras = ['hello', 'apple', 'something', 'yeah', 'nope', 'lalala'] 
previous = (".", "A") #Starting words 
numWords = 10 # The number of words to print 

print previous[0], previous[1], 
for i in range(numWords): 
word = getRandomWord(wordMap[previous]) 
print word, 
if word.endswith(","): 
    print "\n" 
if word.endswith("."): 
    break 

previous = (previous[1], word) 

답변

0

이것은 당신의 사전에있는 단어에서 무작위로 선택합니다 :

코드입니다

import random 
previous[0] = random.choice(wordMap.keys()) 
+0

당신을 감사합니다,하지만 난 그것을 놓고 나에게이 오류를 줄 : "를 역 추적을 (최근 호출 마지막) : 파일 "C : \ Users \ Gerson \ Desktop \ test2.py", 줄 56, 이전 [0] = random.choice (wordMap.keys()) TypeError : '튜플 '객체가 항목 assi를 지원하지 않습니다. gnment " – user2438683

+0

나는 이미 코드 상단에있는 랜덤 함수를 가져온다. 문제가 아닌 것 같다. – user2438683

+0

죄송 합니다만 튜플의 개별 요소를 덮어 쓸 수는 없습니다. 중간 변수를 사용하면 : first = random.choice (wordMap.keys())'두 번째 단어가'second '이고'previous = (first, second)'가 설정됩니다. – richsilv

관련 문제