difflib xlrd模糊查找

这篇文章展示了一段Python代码,它使用Tkinter创建一个图形界面,用户可以输入问题,程序通过读取Excel数据并利用difflib库寻找最接近的匹配问题来生成回答。同时,系统还集成了pyttsx3进行语音合成,能将回答转化为语音播放给用户。此外,还包括了答案的复制功能以及答案的语音播报功能。
摘要由CSDN通过智能技术生成

import tkinter as tk
import pyttsx3
import difflib
import xlrd

# 初始化语音合成引擎
engine = pyttsx3.init()

# 读取 Excel 数据
workbook = xlrd.open_workbook('data.xls')#Question

sheet = workbook.sheet_by_index(0)
data = {sheet.cell_value(i, 0): sheet.cell_value(i, 1) for i in range(1, sheet.nrows)}

def get_closest_answer(keyword):#Answer
# 在问题列表中找到包含关键词的问题
closest_question = difflib.get_close_matches(keyword.lower(), data.keys(), n=1, cutoff=0.3)
if closest_question:
closest_question = closest_question[0]
# 获取对应的答案
return data[closest_question]
else:
return "I'm sorry, I don't understand."

def auto_reply(*args):
user_input = input_entry.get()
answer = get_closest_answer(user_input)
output_label.config(text=answer)
# 使用语音合成播报回复内容
engine.say(answer)
engine.runAndWait()
# 清空输入框内容
input_entry.delete(0, tk.END)

def copy_answer():
root.clipboard_clear()
root.clipboard_append(output_label.cget("text"))
root.update()

root = tk.Tk()
root.title("自动回复")

canvas = tk.Canvas(root, width=600, height=300, bg='white')
canvas.pack()

input_label = tk.Label(root, text="Input:")
input_label.place(x=50, y=50)

input_entry = tk.Entry(root)
input_entry.place(x=100, y=50)

output_label = tk.Label(root, text="")
output_label.place(x=50, y=100)

reply_button = tk.Button(root, text="Reply", command=auto_reply)
reply_button.place(x=250, y=50)

copy_button = tk.Button(root, text="Copy Answer", command=copy_answer)
copy_button.place(x=350, y=95)

# 绑定回车键到自动回复函数
root.bind('<Return>', auto_reply)

root.mainloop()

import random
import pyttsx3

engine = pyttsx3.init()  # 初始化语音引擎

def say(text):
    """将文本转换为语音输出"""
    engine.say(text)
    engine.runAndWait()

def get_response(input_text):
    """根据输入文本返回回复"""
    responses = [
        "你好啊!",
        "我不清楚,请再说一遍。",
        "你能具体说一下吗?",
        "很高兴和你交流!",
        "对不起,我还无法理解你的意思。",
        "这个问题有点难,我需要更多时间来思考。",
        "谢谢你和我聊天!",
        "我觉得你说的很有道理。",
        "你的意见很重要,我会认真考虑的。",
        "抱歉,我不能做到这个。"
    ]
    return random.choice(responses)

say("你好,我是小爱同学。请问有什么可以帮助你的吗?")

while True:
    user_input = input()
    say(user_input)  # 输出语音
    if user_input.lower() == "再见":
        say("再见!祝你过得愉快。")
        break
    else:
        response = get_response(user_input)
        say(response)  # 输出语音
import difflib
import xlrd

# 读取 Excel 数据
workbook = xlrd.open_workbook('data.xls')
sheet = workbook.sheet_by_index(0)
data = {sheet.cell_value(i, 0): sheet.cell_value(i, 1) for i in range(1, sheet.nrows)}

def get_closest_answer(keyword):
    # 在问题列表中找到包含关键词的问题
    closest_question = difflib.get_close_matches(keyword.lower(), data.keys(), n=1, cutoff=0.3)
    if closest_question:
        closest_question = closest_question[0]
        # 获取对应的答案
        return data[closest_question]
    else:
        return "I'm sorry, I don't understand."

# 测试程序
keyword = "衣服"
answer = get_closest_answer(keyword)
print(answer)
import tkinter as tk
import pyttsx3
import difflib
import xlrd
import os

# 初始化语音合成引擎
engine = pyttsx3.init()

# 读取 Excel 数据
data = {}
for filename in os.listdir('.'):
    if filename.endswith('.xls'):
        workbook = xlrd.open_workbook(filename)
        sheet = workbook.sheet_by_index(0)
        data.update({sheet.cell_value(i, 0): sheet.cell_value(i, 1) for i in range(1, sheet.nrows)})

last_answer = ""

def get_closest_answer(keyword):
    # 在问题列表中找到包含关键词的问题
    closest_question = difflib.get_close_matches(keyword.lower(), data.keys(), n=1, cutoff=0.3)
    if closest_question:
        closest_question = closest_question[0]
        # 获取对应的答案
        return data[closest_question]
    else:
        return "I'm sorry, I don't understand."

def speak_answer():
    global last_answer
    # 使用语音合成播报最后一个答案
    engine.say(last_answer)
    engine.runAndWait()

def auto_reply(*args):
    global last_answer
    user_input = input_entry.get()
    answer = get_closest_answer(user_input)
    output_label.config(text=answer)

    # 将答案存储到全局变量中
    last_answer = answer

    # 清空输入框内容
    input_entry.delete(0, tk.END)

def copy_answer():
    root.clipboard_clear()
    root.clipboard_append(output_label.cget("text"))
    root.update()

root = tk.Tk()
root.title("自动回复")

canvas = tk.Canvas(root, width=600, height=300, bg='white')
canvas.pack()

input_label = tk.Label(root, text="Input:")
input_label.place(x=50, y=50)

input_entry = tk.Entry(root)
input_entry.place(x=100, y=50)

output_label = tk.Label(root, text="", wraplength=280)
output_label.place(x=50, y=100)

reply_button = tk.Button(root, text="发送", command=auto_reply)
reply_button.place(x=250, y=50)

copy_button = tk.Button(root, text="Copy复制", command=copy_answer)
copy_button.place(x=350, y=95)

speak_button = tk.Button(root, text="语音播报", command=speak_answer)
speak_button.place(x=350, y=145)

# 绑定回车键到自动回复函数
root.bind('<Return>', auto_reply)

root.mainloop()

#在上面的代码中,我添加了一个新的“语音播报”按钮(speak_button)。在get_closest_answer()函数中,我将答案字符串存储到last_answer全局变量中。在speak_answer()函数中,我使用pyttsx3库播放last_answer全局变量中存储的答案字符串。最后,在auto_reply()函数中,我使用global关键字声明last_answer变量为全局变量,并将获取到的答案存储到该变量中。这样,用户每次获取答案时都会将其保存到last_answer全局变量中,然后可以手动单击“语音播报”按钮来朗读上一次获取的答案。

加入下拉条,内容过多时自动下移并实现打字效果

import tkinter as tk
import pyttsx3
import difflib
import xlrd
import time
import os
from tkinter.scrolledtext import ScrolledText

# 初始化语音合成引擎
engine = pyttsx3.init()

# 读取 Excel 数据
data = {}
for filename in os.listdir('.'):
    if filename.endswith('.xls'):
        workbook = xlrd.open_workbook(filename)
        sheet = workbook.sheet_by_index(0)
        data.update({sheet.cell_value(i, 0): sheet.cell_value(i, 1) for i in range(1, sheet.nrows)})

last_answer = ""

def get_closest_answer(keyword):
    # 在问题列表中找到包含关键词的问题
    closest_question = difflib.get_close_matches(keyword.lower(), data.keys(), n=1, cutoff=0.3)
    if closest_question:
        closest_question = closest_question[0]
        # 获取对应的答案
        return data[closest_question]
    else:
        return "I'm sorry, I don't understand."

def speak_answer():
    global last_answer
    # 使用语音合成播报最后一个答案
    engine.say(last_answer)
    engine.runAndWait()

def auto_reply(*args):
    global last_answer
    user_input = input_entry.get()
    answer = get_closest_answer(user_input)
    output_label.delete(1.0, tk.END)
    last_answer = answer
    for char in answer:
        output_label.insert(tk.END, char)
        output_label.update()
        time.sleep(0.1)  # 控制回答的速度

    # 清空输入框内容
    input_entry.delete(0, tk.END)

def copy_answer():
    root.clipboard_clear()
    root.clipboard_append(output_label.get(1.0, tk.END))
    root.update()

root = tk.Tk()
root.title("自动回复")
root.geometry('650x500')
# canvas = tk.Canvas(root, width=650, height=500, bg='white')
# canvas.pack()

input_label = tk.Label(root, text="Input:")
input_label.place(x=50, y=450)

input_entry = tk.Entry(root)
input_entry.place(x=100, y=450)

output_label = ScrolledText(root, width=67, height=30, wrap=tk.WORD)
output_label.place(x=50, y=10)

reply_button = tk.Button(root, text="发送", command=auto_reply)
reply_button.place(x=250, y=450)

copy_button = tk.Button(root, text="Copy复制", command=copy_answer)
copy_button.place(x=550, y=295)

speak_button = tk.Button(root, text="语音播报", command=speak_answer)
speak_button.place(x=550, y=345)

# 绑定回车键到自动回复函数
root.bind('<Return>', auto_reply)

root.mainloop()

# 使用output_label.see(tk.END)方法来将滚动条自动下移至文本框底部

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贾激光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值