好不容意解决上次的问题,能运行成功。这次运行,居然发现又是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,还真不少。╮(╯_╰)╭