根据书中敲的代码如下:
from simpletriple import SimpleGraph
class InferenceRule:
def getqueries(self):
return []
def maketriples(self, binding):
return self._maketriples(**binding)
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)))
运行时提示:
File "c:\Users\user\Desktop\NLP\simpletriple.py", line 162, in applyinference
new_triples = rule.maketriples(b)
File "inferencerule.py", line 8, in maketriples
return self._maketriples(**binding)
TypeError: _maketriples() got an unexpected keyword argument '?company'
发现原因如下:
在class InterenceRule 中,
def maketriples(self, binding):
return self._maketriples(**binding)
在class WestCoastRule中;
def _maketriples(self, company):
return [(company, 'on_coast', 'west_coast')]
调试发现, binding的值是{'?company': 'xxxx'}, return self._maketriples(**binding) 等于 retutn self._maketriples(?company = xxxx), 但是_maketriples的参数是company,意味着,正确调用_maketriples的方式是_maketriples(company = xxxxx), 这就是为啥报错说找不到keyword argument '?company', 因为正确的keyword argument是 'company', 所以我修改了一下maketriples的代码如下:
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)
即把’?company‘的问号去掉即可。
另外,在修改代码的时候,又导致了另外一个错误:
File "inferencerule.py", line 9, in maketriples
for k, v in binding:
ValueError: too many values to unpack
仔细发现,正确的代码是for k,v in binding.items(), 对于字典类型,不像list类型那样,可以直接for k in listb, 所以不要跟我犯同样的错误啦!!