学习Programming the Semantic Web遇到的问题(二)——python:too many values to unpack

好不容意解决上次的问题,能运行成功。这次运行,居然发现又是too many values to unpack,但跟上一次的不一样

原来的代码如下:


from simpletriple import SimpleGraph

class InferenceRule:
    def getqueries(self):
	return []

    def maketriples(self, binding):
	tempbind = {}
	for k, v in binding.items():
	    tempbind[k[1:]] = v
	return self._maketriples(**tempbind)

    
				
class WestCoastRule(InferenceRule):
    def getqueries(self):
	sfoquery = [('?company', 'headquarters', 'San_Francisco_California')]
	seaquery = [('?company', 'headquarters', 'Seattle_Washington')]
	laxquery = [('?company', 'headquarters', 'Los_Angelese_California')]
	porquery = [('?company', 'headquarters', 'Portland_Oregon')]
	return [sfoquery, seaquery, laxquery, porquery]

    def _maketriples(self, company):
        return [(company, 'on_coast', 'west_coast')]

if __name__ == '__main__':
    bg = SimpleGraph()
    bg.load('business_triples.csv')
    wcr = WestCoastRule()
    bg.applyinference(wcr)
    print list(bg.triples((None, 'on_coast', None))

运行是正确的,


后来在此基础上添加代码如下:


class EnemyRule(InferenceRule):
    def getqueries(self):
        partner_enemy = [('?person', 'enemy', '?enemy'),
                         ('?rel', 'with', '?person'),
                         ('?rel', 'with', '?partner')]
        return [partner_enemy]

    def _maketriples(self, person, enemy, rel, partner):
        return (partner, 'enemy', enemy)

if __name__ == '__main__':
    bg = SimpleGraph()
    bg.load('business_triples.csv')
    wcr = WestCoastRule()
    bg.applyinference(wcr)
    #print list(bg.triples((None, 'on_coast', None)))

    cg = SimpleGraph()
    cg.load('celeb_triples.csv')
    er = EnemyRule()
    print list(cg.triples((None, 'enemy', None)))
    cg.applyinference(er)
    print 'apply rule'
    print list(cg.triples((None, 'enemy', None)))


运行时报出如下错误:


Traceback (most recent call last):
  File "inferencerule.py", line 49, in <module>
    cg.applyinference(er)
  File "c:\Users\user\Desktop\NLP\simpletriple.py", line 167, in applyinference
    self.add(triple)
  File "c:\Users\user\Desktop\NLP\simpletriple.py", line 8, in add
    def add(self, (sub, pred, obj)):
ValueError: too many values to unpack


applyinference的代码如下:


 def applyinference(self, rule):
        queries = rule.getqueries()
	print 'queries: ', queries
	bindings=[]
	for query in queries:
	    bindings += self.query(query)
	
	for b in bindings:
	    new_triples = rule.maketriples(b)
	    print 'b: ', b
	    print 'new triple: ', new_triples
	    for triple in new_triples:
		print 'triple: ', triple
		self.add(triple)

调试发现:

对于bg.applyinference(wcr), 即WestCoastRule, 发现在applyinference调用rule.maketriples, 即调用WestCoastRule的_maketriples, 返回的new_triples的值,是一个list, 如:

new triple:  [(u'POR', 'on_coast', 'west_coast')]


然而对于EnemyRule, 返回的是一个tuple,如下:

new triple:  (u'Orlando Bloom', 'enemy', u'Angelina Jolie')


所以在applyinference运行到for triple in new_triples时,可以从错误信息看出,self.add的参数是def add(self, (sub, pred, obj)):,所以对于WestCoastRule,triple是(u'POR', 'on_coast', 'west_coast'),运行正常,对于EnemyRule,triple是u'Orlando Bloom', 所以报出以上的错误。


解决方式:只要把EnemyRule里_maketriples的返回值改成return [(partner, 'enemy', enemy)]即可。


看来对着书的代码一字不漏的敲,也会产生很多问题啊。这本书里代码的bug,还真不少。╮(╯_╰)╭



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值