Как преобразовать указанный c обычный список во вложенный список - PullRequest
0 голосов
/ 07 марта 2020

Справочная информация о проблеме:

По сути, я делаю "чат-бота" и хочу передать ему много данных из текстового файла. В этом примере 0 означает людей, а 1 означает чатбота. Список всегда начинается с разговора человека, и у человека и робота может быть несколько ответов. На основе списка возможных ответов я хотел бы составить список всех возможных разговоров. Я знаю, что это можно сделать с помощью рекурсии, но я просто не могу обдумать это :( Желательно ответить на это в псевдокоде или python. Однако я открыт для любого языка программирования.

Пример:

Given: [ [0, "Hello"], [0, "Good morning"], [1, "Beep bop Im a bot"], [1, "Hello, dear human"], [0, "Okay, what time is it?" ]
Output: [ 
["Hello", "Beep bop Im a bot", "Okay, what time is it?"],
["Hello", "Hello, dear human", "Okay, what time is it?"],
["Good morning", "Beep bop Im a bot", "Okay, what time is it?"],
["Good morning", "Hello, dear human", "Okay, what time is it?"],
]

Ответы [ 2 ]

0 голосов
/ 07 марта 2020

Вы ищете самые длинные пути в простом ориентированном графе, например:

"Hello" ------->\ /->"Beep bop Im a bot"->\
                 X                         X-->"Okay, what time is it?"
"Good morning"->/ \->"Hello, dear human"->/

Итак, вы ищете альтернативные пути в:

given = [ [0, "Hello"], [0, "Good morning"], [1, "Beep bop Im a bot"], [1, "Hello, dear human"], [0, "Okay, what time is it?" ] ]

Рекурсивный ответ здесь естествен :

  • , если given пусто, у вас есть только пустой путь.
  • , если given не пусто, пусть head, tail будет первым элементом given и, соответственно, остальные элементы given. У вас есть три возможности:
    1. , если tail пусто, то единственный путь - [head.sentence];
    2. , в противном случае, если head.speaker != first element tail.speaker, то вы получите [head.sentence] + path для каждого пути в tail;
    3. иначе, если head.speaker == first element tail.speaker, то: a. привести пути в tail (рекурсивный вызов) b. уберите первый элемент с tail и l oop до 3. пока не окажетесь в случае 1. или 2.

Почему это работает? (эскиз демонстрации):

(I) У вас есть: given[0].speaker == path.speaker на каждые path в paths(given). Это правда, если given имеет только один элемент. Иначе, вы дадите путь head.sentence + <something> == given[0].sentence + <something>, или вы получите path в paths(tail), где tail[0].speaker == head.speaker == given[0].speaker

  • Вращение: вы получаете непосредственно элемент только в случае 1. или 2., когда за head.sentence следует paths(tail), а носитель первого элемента tail отличается от speker head. Учитывая предложение (I), вы уверены, что за человеческим предложением всегда следует компьютерное предложение и наоборот.
  • Полнота: это верно для пустых путей, и поскольку вы пробуете любое возможное начало, потому что вы вызываете paths на каждом элементе, пока не произойдет вращение.

В python:

given = [ [0, "Hello"], [0, "Good morning"], [1, "Beep bop Im a bot"], [1, "Hello, dear human"], [0, "Okay, what time is it?" ] ]

def paths(L):
    if L:
        head, *tail = L
        while tail and tail[0][0] == head[0]:
            yield from paths(tail)
            _, *tail = tail

        for path in paths(tail):
            yield [head[1]] + path
    else:
        yield []

print(list(paths(given)))

Вывод:

[['Good morning', 'Hello, dear human', 'Okay, what time is it?'], ['Good morning', 'Beep bop Im a bot', 'Okay, what time is it?'], ['Hello', 'Hello, dear human', 'Okay, what time is it?'], ['Hello', 'Beep bop Im a bot', 'Okay, what time is it?']]
0 голосов
/ 07 марта 2020

А как насчет использования словарей? Вы можете добавить список ключей (человеческие предложения) и их значения (ответы роботов). Я полагаю, что разделение предложений на категории необходимо для того, чтобы получить резонансный разговор.

Например

import random
from datetime import date

human_greetings = ['hi', 'hello']
robot_greetings = ['hello human', 'hi buddy']
talk = dict()

talk['time'] = ['It is...']
talk['date'] = [('Today is ' + str(date.today()))]


for greeting in human_greetings:
    talk[greeting] = robot_greetings

while True:
    human = str(input())
    robot = random.choice(talk[human])
    print(robot)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...