문제

누군가에게 몇 가지 간단한 질문을 하고 답변을 기반으로 분기하는 봇을 만들고 싶습니다.인간의 반응에서 의미를 분석하는 것이 어려울 것이라는 점은 알고 있지만 대화의 "상태"를 처리하기 위해 프로그램을 어떻게 설정합니까?

이는 인간과 봇 간의 일대일 대화가 될 것입니다.

도움이 되었습니까?

해결책

당신은 아마 조사하고 싶을 것입니다 마르코프 체인 봇 AI의 기본으로.나는 오래 전에 뭔가를 썼는데(전혀 자랑스럽지 않은 코드이고 Python > 1.5에서 실행하려면 몇 가지 모드가 필요함) 여러분에게 유용한 시작점이 될 수 있습니다. http://sourceforge.net/projects/Benz/

편집하다:다음은 stdin의 입력을 받아들이고 입력에서 서로 이어지는 단어의 확률에 따라 텍스트를 출력하는 Markov Chain의 Python의 최소한의 예입니다.IRC 스타일 채팅 로그에 최적화되어 있지만 적당한 크기의 텍스트를 실행하면 다음 개념을 알 수 있습니다.

import random, sys

NONWORD = "\n"
STARTKEY = NONWORD, NONWORD
MAXGEN=1000

class MarkovChainer(object):
    def __init__(self):
        self.state = dict()

    def input(self, input):
        word1, word2 = STARTKEY
        for word3 in input.split():
            self.state.setdefault((word1, word2), list()).append(word3)
            word1, word2 = word2, word3 
        self.state.setdefault((word1, word2), list()).append(NONWORD)

    def output(self):
        output = list()
        word1, word2 = STARTKEY
        for i in range(MAXGEN):
            word3 = random.choice(self.state[(word1,word2)])
            if word3 == NONWORD: break
            output.append(word3)
            word1, word2 = word2, word3
        return " ".join(output)

if __name__ == "__main__":
    c = MarkovChainer()
    c.input(sys.stdin.read())
    print c.output()

여기에서 지속성과 IRC 라이브러리를 연결하고 말하는 봇 유형의 기초를 갖추는 것은 매우 쉽습니다.

다른 팁

사람들은 이미 상태 저장이 일반적인 챗봇의 큰 구성 요소가 아니라고 언급했습니다.

  • 순수한 Markov 구현은 어휘집과 테이블이 실시간으로 증가하는 경우 매우 느슨한 종류의 상태를 표현할 수 있습니다. 대화 상대의 이전 발언은 나중에 대화에서 우연히 다시 나올 수 있습니다. 그러나 Markov 모델에는 고유한 상태가 없습니다. 그러한 응답을 선택하거나 생성하는 메커니즘.

  • 구문 분석 기반 봇(예:ELIZA)는 일반적으로 이전 교환을 크게 고려하지 않고 사용자의 가장 최근 입력의 의미론적 내용(일부)에 응답하려고 시도합니다.

즉, 당신은 확실히 ~할 수 있다 사용 중인 입력 구문 분석 및 명령문 합성 모델에 관계없이 챗봇에 일정량의 상태를 추가합니다.이를 수행하는 방법은 상태 저장을 통해 달성하려는 작업에 따라 많이 달라지며 귀하의 질문에서는 명확하지 않습니다.그러나 몇 가지 일반적인 아이디어는 다음과 같습니다.

  • 키워드 스택을 만듭니다.인간이 입력을 제공하면 진술/질문에서 키워드를 구문 분석하고 해당 키워드를 일종의 스택에 던지십시오.챗봇이 가장 최근 입력에서 응답할 만한 설득력 있는 항목을 찾지 못한 경우(아마도 무작위로 내용을 혼합한 경우) 스택으로 돌아가서 이전 키워드를 선택하고 이를 사용하여 다음 키워드를 시딩합니다. 합성.보너스 포인트의 경우 봇이 이전 주제로 돌아가는 것을 명시적으로 인식하도록 합니다."잠깐만, HUMAN, 아까 foo에 대해 언급하셨잖아요.[foo가 시드한 문장]".

  • RPG와 같은 대화 로직을 봇에 구축하세요.인간의 입력을 분석하면서 사용자의 특정 대화 프롬프트나 콘텐츠에 대한 플래그를 전환하고 챗봇이 말할 수 있는 내용이나 통신 방식을 조건에 따라 변경합니다.예를 들어, 욕설을 퍼붓거나 꾸짖거나 웃는 챗봇은 매우 흔합니다.조건부로 뜨거워지는 챗봇 사과할 때까지 그대로 유지, 이것에 대한 흥미로운 상태 저장 변형이 될 것입니다.출력을 모두 대문자로 전환하고 대립적인 수사, 요구, 흐느낌 등을 던지십시오.

주정부가 귀하가 달성하는 데 도움을 주기를 원하는 것이 무엇인지 조금 더 명확히 설명해 주실 수 있습니까?

각 노드나 뉴런에 구문 분석 기능이 있는 신경망을 상상해 보세요.규칙과 분석 결과에 따라 뉴런이 발화합니다.특정 뉴런이 활성화되면 질문의 주제와 의미에 대한 좋은 아이디어를 얻을 수 있으므로 좋은 답변을 줄 수 있습니다.

세션에서 논의된 주제를 유지하고 다음 질문에 대한 발사를 추가하여 마지막에 가능한 답변 선택 프로세스를 안내함으로써 기억이 이루어집니다.

규칙과 패턴을 지식 베이스에 보관하되 시작 시 규칙당 뉴런을 사용하여 메모리에 컴파일합니다.리스너나 이벤트 함수와 같은 것을 사용하여 시냅스를 설계할 수 있습니다.

코드를 보시면 될 것 같아요 쿠키, IIRC도 Markov 체인을 사용합니다.

또한 다음을 확인하세요. 이상한 따옴표, 그들은 얼마 전 Coding Horror에 소개되었으며 일부는 재미있습니다.

이 프로젝트를 시작하려면 질문이 있는 데이터베이스(트리로 구성)가 있으면 좋을 것 같습니다.모든 노드에는 하나 이상의 질문이 있습니다.이러한 질문에는 "예" 또는 "아니요"로 답할 수 있습니다.

봇이 질문을 시작하면 시작 질문으로 표시된 질문 데이터베이스의 질문으로 시작할 수 있습니다.답은 트리의 다음 노드로 가는 길입니다.

편집하다:다음은 Ruby로 작성된 간단한 코드입니다. 루비봇

순진한 챗봇 프로그램.구문 분석도 없고 영리함도 없으며 단지 교육 파일과 출력만 있을 뿐입니다.

먼저 텍스트에 대해 스스로 훈련한 다음 나중에 해당 훈련의 데이터를 사용하여 대화 상대의 입력에 대한 응답을 생성합니다.학습 프로세스에서는 각 키가 단어이고 값이 학습 텍스트의 어느 위치에서든 해당 단어 뒤에 순차적으로 오는 모든 단어의 목록인 사전을 생성합니다.단어가 이 목록에 두 번 이상 포함된 경우 이는 반영되고 봇에 의해 선택될 가능성이 더 높으므로 확률론적인 내용은 필요하지 않으며 목록을 사용하여 수행하면 됩니다.

봇은 입력에서 임의의 단어를 선택하고 보유 단어의 후속 단어로 보이는 다른 임의의 단어를 선택하여 응답을 생성합니다.그런 다음 해당 단어의 후속 단어를 차례로 찾고 충분히 언급되었다고 생각할 때까지 반복적으로 계속하여 프로세스를 반복합니다.훈련 텍스트의 구두점 앞에 있는 단어에서 중지하여 해당 결론에 도달합니다.그런 다음 사용자가 응답할 수 있도록 다시 입력 모드로 돌아갑니다.

매우 현실적이지는 않지만 누구든지 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

부분적으로는 말이 되는 것처럼 보이는 말을 할 때 당신은 묘한 느낌을 받는 경향이 있습니다.

베이지안 확률을 살펴보는 것이 좋습니다.그런 다음 일정 기간 동안 채팅방을 모니터링하여 확률 트리를 만드세요.

이것이 당신이 찾고 있는 것인지 확실하지 않지만 다음과 같은 오래된 프로그램이 있습니다. 엘리자 이는 당신이 말한 것을 가져다가 간단한 텍스트 변환을 수행한 후 다시 뱉어냄으로써 대화를 유지할 수 있습니다.

내 기억이 맞다면 많은 사람들은 자신이 실제 사람과 '대화'하고 있다고 확신하고 그 사람과 오랫동안 정교한 대화를 나눴습니다.

그냥 장난만 치면 난 믿어 피진 채팅 스타일 동작을 스크립트로 작성할 수 있습니다.프레임워크의 일부는 누가 언제 메시지를 보냈는지에 대한 상태를 기록할 수 있으며 마지막 N개 메시지 각각에 대해 봇의 내부 상태에 대한 로그를 유지하려고 할 것입니다.미래 상태 결정은 이전 상태 검사와 가장 최근 몇 개의 메시지 내용을 기반으로 하드코딩될 수 있습니다.또는 논의된 Markov 체인과 같은 작업을 수행하고 이를 구문 분석 및 생성에 모두 사용할 수 있습니다.

학습봇이 필요하지 않다면 AIML(http://www.aiml.net/)는 적어도 봇이 입력을 구문 분석하고 이를 기반으로 응답하는 것과 관련하여 원하는 결과를 생성할 가능성이 높습니다.

XML(AIML 형식)로 만들어진 "두뇌"를 재사용하거나 생성하고 이를 프로그램(파서)에서 구문 분석/실행합니다.선택할 수 있는 다양한 언어로 만들어진 파서가 있으며, 내가 알 수 있는 한 대부분의 경우 코드는 오픈 소스인 것 같습니다.

"ChatterBot"을 사용하고 'flask-chatterbot-master'를 사용하여 로컬로 호스팅할 수 있습니다.

연결:

  1. [채터봇 설치]https://chatterbot.readthedocs.io/en/stable/setup.html
  2. [Flask-chatterbot-master를 사용하여 로컬로 호스트]: https://github.com/chamkank/flask-chatterbot

건배,

라트나카르

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top