首页 > 解决方案 > Python:给定一个问题,在数据库中找到一个相似的问题

问题描述

我正在编写一个 Telegram 机器人来回答人们关于特定城市的问题。我想编写一段代码,将消息与我的 sqlite 数据库表中的问题进行比较。

最大的问题是我不能使用difflib.get_close_matches,因为问题不是英文的,目前我只处理完全匹配的字符串,例如:

if msg.lower() == "what can you do?":
    send_message("I can answer to any question you have about...", chat_id)

这绝对不是我的目标

所以,让我们来看看代码:我正在使用这个函数来获取最后一条消息

URL = "https://api.telegram.org/bot{}/".format(TOKEN)

def get_updates(offset=None):
url = URL + "getUpdates"
if offset:
    url += "?offset={}".format(offset)
js = get_json_from_url(url)
return js

并将返回的值分配给变量updates,因此我将在其中包含消息文本update["message"]["text"]

现在困难的部分是,我必须将字符串与 db 记录进行比较,然后,如果没有任何类似的匹配,我将不得不在消息中找到单词的同义词并重新将它们与记录进行比较。

但是这会使程序运行得非常慢,我真的没有时间也不会为每个可能的单词列出同义词

任何人都可以帮助我找到进行比较的方法并在数据库中找到类似的字符串,以尽可能快地保持程序?

标签: pythonpython-3.xchatbot

解决方案


我很遗憾地说,可能没有一种简单易行的方法来处理这样的事情:

由于您正在处理数据库,因此我假设您有很多可能的问题,并且使用简单的同义词表是行不通的

自然语言处理(NLP)

这是机器学习中一个非常活跃的研究课题,简而言之,它涉及从文本中自动理解。对于您的特定情况。为了获得一些关于它的直觉,并且因为它完全适用于您的问题,我建议从:Song et al.的 FAQ Answering 的问题相似度计算开始。(2007)

对于有助于您的应用程序的最先进的工具,我建议使用word2vec(这是论文,但您可能还想遵循教程

其他选项

如果 NLP 看起来比您的目标更复杂,我建议您查看单词相似性,例如:

然而,这些不会像训练有素的 NLP 系统那样执行。


推荐阅读