наивная программа чатбота. Никакого разбора, никакой хитрости, просто тренировочный файл и вывод.
Сначала он обучается самому тексту, а затем использует данные этого тренинга для генерации ответов на вход собеседника. В процессе обучения создается словарь, в котором каждый ключ представляет собой слово, а значение представляет собой список всех слов, которые следуют за этим словом последовательно в любом месте обучающего текста. Если слово присутствует в этом списке более одного раза, то это отражает, и бот, скорее всего, выберет его, нет необходимости в вероятностных вещах, просто сделайте это со списком.
Бот выбирает случайное слово из вашего ввода и генерирует ответ, выбирая другое случайное слово, которое считается преемником его удерживаемого слова. Затем он повторяет этот процесс, находя преемника этого слова по очереди и итеративно, пока не решит, что оно достаточно сказано. Он приходит к такому заключению, останавливаясь на слове, которое было до знака препинания в учебном тексте. Затем он снова возвращается в режим ввода, чтобы вы могли ответить, и т. Д.
Это не очень реалистично, но я призываю кого-либо сделать лучше в 71 строке кода! Это большой вызов для любого начинающего Pythonists, и я просто хотел бы открыть этот вызов для более широкой аудитории, чем небольшое количество посетителей этого блога. Чтобы кодировать бота, который всегда гарантированно должен быть грамматическим, обязательно должен быть ближе к нескольким сотням строк, я сильно упростил его, просто пытаясь придумать простейшее правило, позволяющее компьютеру просто сказать, что сказать.
Его ответы довольно импрессионистские, если не сказать больше! Также вы должны поместить то, что вы говорите, в одинарные кавычки.
Я использовал «Войну и мир» для своего «корпуса», который занял пару часов на тренировочном заезде, используйте более короткий файл, если вы нетерпеливы…
вот тренер
#lukebot-trainer.py
import pickle
b=open('war&peace.txt')
text=[]
for line in b:
for word in line.split():
text.append (word)
b.close()
textset=list(set(text))
follow={}
for l in range(len(textset)):
working=[]
check=textset[l]
for w in range(len(text)-1):
if check==text[w] and text[w][-1] not in '(),.?!':
working.append(str(text[w+1]))
follow[check]=working
a=open('lexicon-luke','wb')
pickle.dump(follow,a,2)
a.close()
вот бот
#lukebot.py
import pickle,random
a=open('lexicon-luke','rb')
successorlist=pickle.load(a)
a.close()
def nextword(a):
if a in successorlist:
return random.choice(successorlist[a])
else:
return 'the'
speech=''
while speech!='quit':
speech=raw_input('>')
s=random.choice(speech.split())
response=''
while True:
neword=nextword(s)
response+=' '+neword
s=neword
if neword[-1] in ',?!.':
break
print response
Вы склонны испытывать странное чувство, когда оно говорит что-то, что, кажется, частично имеет смысл.