【发布时间】:2021-01-27 10:43:55
【问题描述】:
这是在 Python 中。
我想在我的计算器上用大约 75 行代码编写一个简单的马尔可夫链。我能够导入的唯一模块是“随机”和“数学”。
这是我制作的一个快速副本,应该可以在 python 终端中工作,它应该可以工作。
这是我的计算器拥有它的唯一方法。
from random import *
class word:
def __init__(self,word,words):
self.word=word
self.words=words.split()
def addWord(self,word):
self.words.append(word)
# "x" is an empty list, otherwise contains all previous word-objects
# "s" is the string to use for training
def train(x,s):
s=s.split()
if len(x)==0:
x=[]
for i in range(len(s)-1):
if s[i]==s[-1]:
return x
w=word(s[i],s[i+1])
ind=0
# ///
# This is the problem area
for wr in x:
ind+=1
if wr in x:
wr.addWord(s[i+1])
elif wr not in x:
x.append(w)
# ///
return x
def chain(start, x):
for i in range(10):
for w in x:
if w.word==start[-1]:
start.append(choice(w.words))
return start
我希望 train 函数返回一个“单词”对象列表,而不是:
if wr in x:
wr.addWord(s[i+1])
elif wr not in x:
x.append(w)
似乎永远不会被执行,我会继续研究这个,因为肯定有解决方案。
TL:DR;我如何检查一个对象是否在对象列表中,如果是,则向该对象添加一些内容,如果它没有将该对象添加到列表中?
如果您需要更多信息,请随时询问。
如果您想对其进行测试,请将其附加到代码中:
x=[]
x=train(x, "This is a String")
x=train(x, "And this is yet another Sentence")
y=chain(x, "This")
print(y)
其中 x 是最后所有单词的字典 y 是生成的句子。
我希望使用给定的单词和上下文生成一个未经训练的句子。 上下文和来自它训练的句子的单词。
y 例如可能是“这是另一个句子” 这将是它得到的字符串的组合,但不等于它们中的任何一个。
【问题讨论】:
-
您好,您的代码中有错误。过度检查逻辑?你是编程/python 新手吗?
-
您所展示的正是如何做到这一点。你没有描述的是你期望它如何工作。您的
word对象在实现时将简单地测试 identity,但我想,您还有其他一些语义? -
好吧,我本身不是新手,我已经编写 python 代码 2 年了,但这只是我计算器的一个快速而肮脏的副本,我会调查并修复它。
-
很简单的方法:使用
set而不是list并始终进行添加。 -
@guidot 这实际上是一个非常好的技巧,我没想到。
标签: python markov-chains