以下的代碼對於所有測試情況下工作,除了test_errors()測試用例(最後測試用例lexicon_tests)。有下面的代碼置於lexicon.py。註釋lexicon_tests.py中的test_errors()函數並運行nosetests。
lexicon.py:
from itertools import izip
direction = {'north':('direction','north'), 'south':('direction','south'),'east':('direction','east'), 'west':('direction','west')}
verbs = {'go':('verb', 'go'), 'stop':('verb', 'stop'), 'kill':('verb', 'kill'), 'eat':('verb', 'eat')}
stop = {'the':('stop','the'), 'in':('stop','in'), 'of':('stop','of'), 'from':('stop','from'), 'at':('stop','at'), 'it':('stop','it')}
nouns = {'door':('noun','door'),'bear':('noun','bear'),'princess':('noun','princess'),'cabinet':('noun','cabinet')}
numbers = {'1234':('number', 1234),'3':('number', 3),'91234':('number', 91234)}
class lexicon(object):
def scan(self, sentence):
self.flag=''
self.list_var=[]
self.sentence = sentence
self.words =self.sentence.split()
for k1,k2,k3 in izip(direction,verbs,nouns):
self.j=0
while self.j < len(self.words):
if direction[k1][1] == self.words[self.j] :
self.flag='d'
break
elif verbs[k2][1] == self.words[self.j] :
self.flag='v'
break
elif nouns[k3][1] == self.words[self.j] :
self.flag='n'
break
self.j=self.j+1
for k4 in numbers:
self.j=0
while self.j < len(self.words):
if str(numbers[k4][1]) == self.words[self.j] :
self.flag='nu'
break
self.j=self.j+1
for k5 in stop:
self.j=0
while self.j < len(self.words):
if stop[k5][1] == self.words[self.j] :
print 'in if set flag'
self.flag='s'
break
self.j=self.j+1
if self.flag =='d':
if len(self.words) == 1:
self.list_var.append(direction.get(self.words[0]))
return self.list_var
else :
self.i = 0
while self.i < len(self.words):
self.list_var.append(direction.get(self.words[self.i]))
self.i=self.i+1;
return self.list_var
elif self.flag == 'v':
if len(self.words) == 1:
self.list_var.append(verbs.get(self.words[0]))
return self.list_var
else :
print "else"
self.i = 0
while self.i < len(self.words):
self.list_var.append(verbs.get(self.words[self.i]))
self.i=self.i+1;
return self.list_var
elif self.flag == 'n':
if len(self.words) == 1:
self.list_var.append(nouns.get(self.words[0]))
return self.list_var
else :
self.i = 0
while self.i < len(self.words):
self.list_var.append(nouns.get(self.words[self.i]))
self.i=self.i+1;
return self.list_var
elif self.flag == 'nu':
if len(self.words) == 1:
self.list_var.append(numbers.get(self.words[0]))
return self.list_var
else :
self.i = 0
while self.i < len(self.words):
self.list_var.append(numbers.get(self.words[self.i]))
self.i=self.i+1;
return self.list_var
elif self.flag == 's':
if len(self.words) == 1:
self.list_var.append(stop.get(self.words[0]))
return self.list_var
else :
self.i = 0
while self.i < len(self.words):
self.list_var.append(stop.get(self.words[self.i]))
self.i=self.i+1;
return self.list_var
lexicon_tests.py:
from nose.tools import *
from ex48.lexicon import lexicon
lex=lexicon()
def test_directions():
print lex.scan("north")
assert_equal(lex.scan("north"), [('direction', 'north')])
result = lex.scan("north south east")
assert_equal(result, [('direction', 'north'),
('direction', 'south'),
('direction', 'east')])
def test_verbs():
assert_equal(lex.scan("go"), [('verb', 'go')])
result = lex.scan("go kill eat")
assert_equal(result, [('verb', 'go'),
('verb', 'kill'),
('verb', 'eat')])
def test_nouns():
assert_equal(lex.scan("bear"), [('noun', 'bear')])
result = lex.scan("bear princess")
assert_equal(result, [('noun', 'bear'),
('noun', 'princess')])
def test_numbers():
assert_equal(lex.scan("1234"), [('number', 1234)])
result = lex.scan("3 91234")
assert_equal(result, [('number', 3),
('number', 91234)])
def test_stops():
assert_equal(lex.scan("the"), [('stop', 'the')])
result = lex.scan("the in of")
assert_equal(result, [('stop', 'the'),
('stop', 'in'),
('stop', 'of')])
'''def test_errors():
assert_equal(lexicon.scan("ASDFADFASDF"), [('error', 'ASDFADFASDF')])
result = lexicon.scan("bear IAS princess")
assert_equal(result, [('noun', 'bear'),
('error', 'IAS'),
('noun', 'princess')])'''
類似的實現可以爲test_errors()函數來完成。
非常感謝!快速的問題,因爲我在這個東西還是新的。這會返回給它作爲一個元組的句子嗎?這被認爲是該功能的目的。從這本書中:「這個掃描器將從用戶處接收一串原始輸入,並返回一個由(TOKEN,WORD)配對組成的列表組成的句子。如果一個單詞不是詞典的一部分,那麼它應該仍然返回WORD,但將TOKEN設置爲錯誤令牌,這些錯誤令牌會告訴用戶他們搞砸了。「 – Adam
好吧,打印它,你會看到它返回的 - 元組列表。 –
哦對。現在它給了我各種麻煩。看來測試程序不能導入代碼。我一直收到如下錯誤消息:ImportError:無法導入名詞詞典或無模塊名爲lexicon或NameError:全局名稱'詞典'沒有定義 – Adam