Создание лексикона и сканера в Python
Я новичок в мире кодирования, и меня не встретили очень тепло. Я пытался изучать Python через онлайн-учебник http://learnpythonthehardway.org/book/. Мне удавалось пробираться сквозь книгу до упражнений 48 и 49. Именно здесь он отпускает учеников и говорит: "Вы это понимаете". Но я просто не могу. Я понимаю, что мне нужно создать лексикон из возможных слов и что мне нужно отсканировать пользовательский ввод, чтобы увидеть, соответствует ли он чему-либо в лексиконе, но это все! Из того, что я могу сказать, мне нужно создать список под названием лексикон:
lexicon = [
('directions', 'north'),
('directions', 'south'),
('directions', 'east'),
('directions', 'west'),
('verbs', 'go'),
('verbs', 'stop'),
('verbs', 'look'),
('verbs', 'give'),
('stops', 'the'),
('stops', 'in'),
('stops', 'of'),
('stops', 'from'),
('stops', 'at')
]
Это правильно? Я не знаю, что делать дальше? Я знаю, что каждый элемент в списке называется кортежем, но для меня это ничего не значит. Как взять необработанный ввод и назначить его кортежу? Если вы понимаете, о чем я? Таким образом, в упражнении 49 он импортирует лексикон и только внутри python печатает lexicon.scan("input") и возвращает список кортежей, например:
from ex48 import lexicon
>>> print lexicon.scan("go north")
[('verb', 'go'), ('direction', 'north')]
Является ли 'scan()' предопределенной функцией или он создал эту функцию в модуле лексикона? Я знаю, что если вы используете 'split()', он создает список со всеми словами из входных данных, но как тогда он назначает 'go' в кортеж ('verb', 'go')?
Я просто далеко? Я знаю, что спрашиваю много, но я искал повсюду в течение нескольких часов, и я не могу понять это самостоятельно. Пожалуйста помоги! Я всегда буду любить тебя!
5 ответов
Основываясь на инструкциях ex48, вы можете создать несколько списков для каждого вида слова. Вот пример для первого теста. Возвращаемое значение представляет собой список кортежей, так что вы можете добавить в этот список для каждого заданного слова.
direction = ['north', 'south', 'east', 'west', 'down', 'up', 'left', 'right', 'back']
class Lexicon:
def scan(self, sentence):
self.sentence = sentence
self.words = sentence.split()
stuff = []
for word in self.words:
if word in direction:
stuff.append(('direction', word))
return stuff
lexicon = Lexicon()
Он отмечает, что числа и исключения обрабатываются по-разному.
Я бы не использовал список, чтобы составить лексикон. Вы сопоставляете слова с их типами, поэтому создайте словарь.
Вот самый большой совет, который я могу дать, не написав всего этого:
lexicon = {
'north': 'directions',
'south': 'directions',
'east': 'directions',
'west': 'directions',
'go': 'verbs',
'stop': 'verbs',
'look': 'verbs',
'give': 'verbs',
'the': 'stops',
'in': 'stops',
'of': 'stops',
'from': 'stops',
'at': 'stops'
}
def scan(sentence):
words = sentence.lower().split()
pairs = []
# Iterate over `words`,
# pull each word and its corresponding type
# out of the `lexicon` dictionary and append the tuple
# to the `pairs` list
return pairs
Наконец-то я это сделал!
lexicon = {
('directions', 'north'),
('directions', 'south'),
('directions', 'east'),
('directions', 'west'),
('verbs', 'go'),
('verbs', 'stop'),
('verbs', 'look'),
('verbs', 'give'),
('stops', 'the'),
('stops', 'in'),
('stops', 'of'),
('stops', 'from'),
('stops', 'at')
}
def scan(sentence):
words = sentence.lower().split()
pairs = []
for word in words:
word_type = lexicon[word]
tupes = (word, word_type)
pairs.append(tupes)
return pairs
Это действительно классное упражнение. Я должен был провести исследования в течение нескольких дней, и, наконец, все заработало. Другие ответы здесь не показывают, как на самом деле использовать список с кортежами внутри, как sugests электронной книги, так что это будет сделано так. Ответ владельца не совсем работает, лексика [слово] просит интергер, а не ул.
lexicon = [('direction', 'north', 'south', 'east', 'west'),
('verb', 'go', 'kill', 'eat'),
('nouns', 'princess', 'bear')]
def scan():
stuff = raw_input('> ')
words = stuff.split()
pairs = []
for word in words:
if word in lexicon[0]:
pairs.append(('direction', word))
elif word in lexicon[1]:
pairs.append(('verb', word))
elif word in lexicon[2]:
pairs.append(('nouns', word))
else:
pairs.append(('error', word))
print pairs
Ура!
Как и большинство здесь, я новичок в мире кодирования, и хотя я прилагаю свое решение ниже, оно может помочь другим студентам.
Я уже видел еще несколько эффективных подходов, которые мог бы реализовать. Тем не менее, код обрабатывает все варианты использования упражнения, и, поскольку я написал его самостоятельно с мыслями новичка, он не требует сложных сокращений и должен быть очень легким для понимания другими новичками.
Поэтому я подумал, что это может быть полезно для обучения кого-то другого. Дайте мне знать, что вы думаете. Ура!
class Lexicon(object):
def __init__(self):
self.sentence = []
self.dictionary = {
'north' : ('direction','north'),
'south' : ('direction','south'),
'east' : ('direction','east'),
'west' : ('direction','west'),
'down' : ('direction','down'),
'up' : ('direction','up'),
'left' : ('direction','left'),
'right' : ('direction','right'),
'back' : ('direction','back'),
'go' : ('verb','go'),
'stop' : ('verb','stop'),
'kill' : ('verb','kill'),
'eat' : ('verb', 'eat'),
'the' : ('stop','the'),
'in' : ('stop','in'),
'of' : ('stop','of'),
'from' : ('stop','from'),
'at' : ('stop','at'),
'it' : ('stop','it'),
'door' : ('noun','door'),
'bear' : ('noun','bear'),
'princess' : ('noun','princess'),
'cabinet' : ('noun','cabinet'),
}
def scan(self, input):
loaded_imput = input.split()
self.sentence.clear()
for item in loaded_imput:
try:
int(item)
number = ('number', int(item))
self.sentence.append(number)
except ValueError:
word = self.dictionary.get(item.lower(), ('error', item))
self.sentence.append(word)
return self.sentence
lexicon = Lexicon()
Ясно, что Лексикон - это еще один файл python в папке ex48.
like: ex48 ----lexicon.py
поэтому вы импортируете файл lexicon.py из папки ex 48.
сканирование - это функция внутри lexicon.py
Это моя версия сканирования лексики для ex48. Я также начинающий в программировании, Python - мой первый язык. Таким образом, программа может быть неэффективной для своих целей, в любом случае результат будет хорошим после многих испытаний. Пожалуйста, не стесняйтесь улучшать код.
ПРЕДУПРЕЖДЕНИЕ
Если вы не пытались выполнить упражнение самостоятельно, я советую вам попробовать, не рассматривая ни одного примера.
ПРЕДУПРЕЖДЕНИЕ
В программировании мне нравится то, что каждый раз, когда я сталкиваюсь с какой-то проблемой, я трачу много времени, пытаясь найти другой метод решения проблемы. Я провожу несколько недель, пытаясь создать структуру, и для новичка действительно полезно то, что я действительно многому учусь, а не копирую из других.
Ниже моя лексика и поиск в одном файле.
direction = [('direction', 'north'),
('direction', 'south'),
('direction', 'east'),
('direction', 'west'),
('direction', 'up'),
('direction', 'down'),
('direction', 'left'),
('direction', 'right'),
('direction', 'back')
]
verbs = [('verb', 'go'),
('verb', 'stop'),
('verb', 'kill'),
('verb', 'eat')
]
stop_words = [('stop', 'the'),
('stop', 'in'),
('stop', 'of'),
('stop', 'from'),
('stop', 'at'),
('stop', 'it')
]
nouns = [('noun', 'door'),
('noun', 'bear'),
('noun', 'princess'),
('noun', 'cabinet')
]
library = tuple(nouns + stop_words + verbs + direction)
#below is the search method with explanation.
def convert_number(x):
try:
return int(x)
except ValueError:
return None
def scan(input):
#include uppercase input for searching. (Study Drills no.3)
lowercase = input.lower()
#element is what i want to search.
element = lowercase.split()
#orielement is the original input which have uppercase, for 'error' type
orielement = input.split()
#library is tuple of the word types from above. You can replace with your data source.
data = library
#i is used to evaluate the position of element
i = 0
#z is used to indicate the position of output, which is the data that match what i search, equals to "i".
z = 0
#create a place to store my output.
output = []
#temp is just a on/off switch. Turn off the switch when i get any match for that particular input.
temp = True
#creating a condition which evaluates the total search needed to be done and follows the sequence by +1.
while not(i == len(element)):
try:
#j is used to position the word in the library, eg 'door', 'bear', 'go', etc which exclude the word type.
j = 0
while not (j == len(data)):
#data[j][1] all the single word in library
matching = data[j][1]
#when the word match, it will save the match into the output.
if (matching == element[i]):
output.append(data[j])
#print output[z]
j += 1
z += 1
#to switch off the search for else: below and go to next input search. Otherwise they would be considerd 'error'
temp = False
#else is everything that is not in the library.
else:
while (data[j][1] == data [-1][1]) and (temp == True):
#refer to convert_number, to test if the input is a number, here i use orielement which includes uppercase
convert = convert_number(orielement[i])
#a is used to save number only.
a = tuple(['number', convert])
#b is to save everything
b = tuple(['error', orielement[i]])
#conver is number a[1] is the access the number inside, if it returns None from number then it wont append.
if convert == a[1] and not(convert == None):
output.append(a)
temp = False
else:
output.append(b)
#keep the switch off to escape the while loop!
temp = False
#searching in next data
j += 1
#next word of input
i += 1
temp = True
except ValueError:
return output
else:
pass
return output