Реализация eliza на основе правил Python для Regex - PullRequest
0 голосов
/ 20 февраля 2019
import random
import re

rules=[["(.*)hello(.*)",["Hi there. Please state your problem"]],
           ["(.*)name(.*)",["Great, good to know","I am not interested 
        in names"]],
  ["(.*)sorry(.*)",["please don't apologize","Apologies are not necessary","What feelings you have when you apologize?"]],
 ["(.*)",["Very interesting","I am not sure I understand you fully","Please continue",
         "Do you feel strongly about discussing such things?","\\2"]]]

grammar = {
"am": "are",
"was": "were",
"i": "you",
"i'd": "you would",
"i've": "you have",
"i'll": "you will",
"my": "your",
"are": "am",
"you've": "I have",
"you'll": "I will",
"your": "my",
"yours": "mine",
"you": "me",
"me": "you"
}

def correction(word):
character=word.lower().split()
for i, j in enumerate(character):
    if j in grammar:
        character[i]=grammar[j]
return " ".join(character)

def test(sentence):
for pattern, message in rules:
    match=re.match(pattern,sentence.rstrip(".!"))
    if match:
        response = random.choice(message)
        temp = " " + correction(match.group())
        response2 = re.sub(r"\\2",temp,response)
        return response2
      else:
        recall=random.choice(message)
        return recall



while True:
sentence =input("You: ")
print("JBot: " + test(sentence))

    if sentence == "quit":
    break

В этой простой реализации eliza существует список, называемый правилом, с набором шаблонов и соответствующих ответов.Предполагается, что этот код получит случайный ответ, если шаблон соответствует или если введено что-то еще, что не входит в правило (последнее правило).

Код только выводит, "Hi, there. Please state your problem" для всех операторов ввода.Любая помощь, почему это происходит ??

Если вы введете предложение, которое соответствует правилу, то оно ответит соответствующим ответом.предположим для правила, подобного следующему: '(.*) подобны (.*)', ["Какое сходство вы видите между {0} и {1}?"]], если входное значение равно "Cats are like dogs", ответ должен быть примерно таким: ЧтоСходство вы видите между кошками и собаками?Таким образом, он берет группу из матча и помещает в соответствующий ответ.

1 Ответ

0 голосов
/ 20 февраля 2019

Я исправил ваш код, и теперь он должен работать как ожидалось:

Примечания:

  • else в цикле test Функция будет выходить из цикла на каждой итерации, поэтому вы не сможете просматривать все правила грамматики.Я поставил его после for, это заставит сначала проверять каждое правило перед тем, как перейти к случайно выбранному ответу по умолчанию.

Код:

import random
import re

rules=[["(.*)hello(.*)",["Hi there. Please state your problem"]],
           ["(.*)name(.*)",["Great, good to know","I am not interested in names"]],
  ["(.*)sorry(.*)",["please don't apologize","Apologies are not necessary","What feelings you have when you apologize?"]],
 ["(.*)",["Very interesting","I am not sure I understand you fully","Please continue",
         "Do you feel strongly about discussing such things?","\\2"]]]

grammar = {
"am": "are",
"was": "were",
"i": "you",
"i'd": "you would",
"i've": "you have",
"i'll": "you will",
"my": "your",
"are": "am",
"you've": "I have",
"you'll": "I will",
"your": "my",
"yours": "mine",
"you": "me",
"me": "you"
}

def correction(word):
  character=word.lower().split()
  for i, j in enumerate(character):
      if j in grammar:
          character[i]=grammar[j]
  return " ".join(character)

def test(sentence):
  for pattern, message in rules:
      match=re.match(pattern,sentence.rstrip(".!"))
      if match:
          response = random.choice(message)
          temp = " " + correction(match.group())
          response2 = re.sub(r"\\2",temp,response)
          return response2
  recall=random.choice(random.choice([r[1] for r in rules]))
  return recall



while True:
  sentence =input("You: ")
  print("JBot: " + test(sentence))
  if sentence == "quit":
        break

Вывод:

You: 'hello'
JBot: Hi there. Please state your problem
You: "i don't have a name"
JBot: Great, good to know
You: "i am so sorry"
JBot: What feelings you have when you apologize?
You: "help me"
JBot: Do you feel strongly about discussing such things?

Выводы настолько смешные, что буквально сделали мой день.


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...