Python的智能问答之路 张晓庆Python的智能问答之路 张晓庆 目录 CONTENTS 智能问答简介 QA快速实践 Python开发的利与弊 总结展望 1 智能问答简介 智能问答领域分类、举例、应用场景 智能问答领域分类 [Duan 2017] 智能问答举例-Community QA • 数据结构化 Ø 用问答对的方式进行知识表示 Ø 知识点:由若干个问题(相似问)、以及 能回答这些问题的答案组成 Ø 为什么用这种形式? ü 减轻人工维护答案的工作量 ü 同一知识点下的问题语义相同,是很好的 训练数据 智能问答应用场景 • 辅助人工 Ø 客服 Ø 营销 Ø 特定领域、重复性的对话 • GUI补充 Ø 语音助手 Ø 电话助手 • Voice-only Apps Ø 智能音箱 Ø 车载设备 Ø 可穿戴设备 2 QA快速实践 任务拆解、各个击破 任务拆解 • 业务 Ø 解决什么问题? 支持Java调用 优势总结 缺点举例1-内存占用高 Python:一切皆对象 • python执行由解析器解析为C语言对应的结构 • python对象取值仅对应C结构的一个属性 • 附加字段、引用指针均消耗内存 • 解决方案:c++封装kv存储,编译成so供python调用,内部采用unordered_map实现 • 提升:1g文件,python load dict占用5~6g,kvdict存储占用1~10 码力 | 28 页 | 2.60 MB | 1 年前3
Hello 算法 1.1.0 Python版10 倍!” ——李沐,亚马逊资深首席科学家 计算机的出现给世界带来了巨大变革,它凭借高速的计算能力和出色的可编程性,成为了执行算法与处理数 据的理想媒介。无论是电子游戏的逼真画面、自动驾驶的智能决策,还是 AlphaGo 的精彩棋局、ChatGPT 的自然交互,这些应用都是算法在计算机上的精妙演绎。 事实上,在计算机问世之前,算法和数据结构就已经存在于世界的各个角落。早期的算法相对简单,例如古 Java、C++ 和 Python 中分别被记为 null、nullptr 和 None 。 ‧ 在 C、C++、Go 和 Rust 等支持指针的语言中,上述“引用”应被替换为“指针”。 如以下代码所示,链表节点 ListNode 除了包含值,还需额外保存一个引用(指针)。因此在相同数据量下,链 表比数组占用更多的内存空间。 class ListNode: """ 链表节点类""" def __init__(self 代码中的链表可记作链表 n0 。 2. 插入节点 在链表中插入节点非常容易。如图 4‑6 所示,假设我们想在相邻的两个节点 n0 和 n1 之间插入一个新节点 P , 则只需改变两个节点引用(指针)即可,时间复杂度为 ?(1) 。 相比之下,在数组中插入元素的时间复杂度为 ?(?) ,在大数据量下的效率较低。 图 4‑6 链表插入节点示例 # === File: linked_list0 码力 | 364 页 | 18.42 MB | 1 年前3
Hello 算法 1.2.0 简体中文 Python 版10 倍!” ——李沐,亚马逊资深首席科学家 计算机的出现给世界带来了巨大变革,它凭借高速的计算能力和出色的可编程性,成为了执行算法与处理数 据的理想媒介。无论是电子游戏的逼真画面、自动驾驶的智能决策,还是 AlphaGo 的精彩棋局、ChatGPT 的自然交互,这些应用都是算法在计算机上的精妙演绎。 事实上,在计算机问世之前,算法和数据结构就已经存在于世界的各个角落。早期的算法相对简单,例如古 Java、C++ 和 Python 中分别被记为 null、nullptr 和 None 。 ‧ 在 C、C++、Go 和 Rust 等支持指针的语言中,上述“引用”应被替换为“指针”。 如以下代码所示,链表节点 ListNode 除了包含值,还需额外保存一个引用(指针)。因此在相同数据量下,链 表比数组占用更多的内存空间。 class ListNode: """ 链表节点类""" def __init__(self 代码中的链表可记作链表 n0 。 2. 插入节点 在链表中插入节点非常容易。如图 4‑6 所示,假设我们想在相邻的两个节点 n0 和 n1 之间插入一个新节点 P , 则只需改变两个节点引用(指针)即可,时间复杂度为 ?(1) 。 相比之下,在数组中插入元素的时间复杂度为 ?(?) ,在大数据量下的效率较低。 图 4‑6 链表插入节点示例 # === File: linked_list0 码力 | 364 页 | 18.43 MB | 10 月前3
Hello 算法 1.0.0 Python版Java、C++ 和 Python 中分别被记为 null、nullptr 和 None 。 ‧ 在 C、C++、Go 和 Rust 等支持指针的语言中,上述“引用”应被替换为“指针”。 如以下代码所示,链表节点 ListNode 除了包含值,还需额外保存一个引用(指针)。因此在相同数据量下,链 表比数组占用更多的内存空间。 class ListNode: """ 链表节点类""" def __init__(self 代码中的链表可记作链表 n0 。 2. 插入节点 在链表中插入节点非常容易。如图 4‑6 所示,假设我们想在相邻的两个节点 n0 和 n1 之间插入一个新节点 P , 则只需改变两个节点引用(指针)即可,时间复杂度为 ?(1) 。 相比之下,在数组中插入元素的时间复杂度为 ?(?) ,在大数据量下的效率较低。 图 4‑6 链表插入节点示例 # === File: linked_list next = n1 n0.next = P 第 4 章 数组与链表 hello‑algo.com 73 3. 删除节点 如图 4‑7 所示,在链表中删除节点也非常方便,只需改变一个节点的引用(指针)即可。 请注意,尽管在删除操作完成后节点 P 仍然指向 n1 ,但实际上遍历此链表已经无法访问到 P ,这意味着 P 已 经不再属于该链表了。 图 4‑7 链表删除节点 # === File:0 码力 | 362 页 | 17.54 MB | 1 年前3
Hello 算法 1.0.0b5 Python版Java、C++ 和 Python 中分别被记为 null、nullptr 和 None 。 ‧ 在 C、C++、Go 和 Rust 等支持指针的语言中,上述的“引用”应被替换为“指针”。 如以下代码所示,链表节点 ListNode 除了包含值,还需额外保存一个引用(指针)。因此在相同数据量下,链 表比数组占用更多的内存空间。 class ListNode: """ 链表节点类""" def __init__(self 中的链表可被记做链表 n0 。 2. 插入节点 在链表中插入节点非常容易。如图 4‑6 所示,假设我们想在相邻的两个节点 n0 和 n1 之间插入一个新节点 P , 则只需要改变两个节点引用(指针)即可,时间复杂度为 ?(1) 。 相比之下,在数组中插入元素的时间复杂度为 ?(?) ,在大数据量下的效率较低。 图 4‑6 链表插入节点示例 # === File: linked_list next = n1 n0.next = P 第 4 章 数组与链表 hello‑algo.com 70 3. 删除节点 如图 4‑7 所示,在链表中删除节点也非常方便,只需改变一个节点的引用(指针)即可。 请注意,尽管在删除操作完成后节点 P 仍然指向 n1 ,但实际上遍历此链表已经无法访问到 P ,这意味着 P 已 经不再属于该链表了。 图 4‑7 链表删除节点 # === File:0 码力 | 361 页 | 30.64 MB | 1 年前3
Python 标准库参考指南 3.10.15 认值是 'r' ,表示以文本模式打开并读取 文件。其他常见模式有:写入模式 'w' (已存在文件会被清空)、独占创建模式 'x' 、追加写入 模式 'a' (在 某些 Unix 系统中,无论当前文件指针在什么位置,所有的写入操作都会追加到文 件末尾)。在文本模式,如果未指定 encoding ,则会根据当前平台决定编码格式:调用 locale. getpreferredencoding(False) 1. 如果 A 被定义成一个承认 b 的 __add__(),一切都没有问题。 2. 如果 A 转回成“模板”失败,它将返回一个属于 __add__() 的值,我们需要避免 B 定义了一个更 加智能的 __radd__(),因此模板需要返回一个属于 __add__() 的NotImplemented 。(或者 A 可能完全不实现 __add__() 。) 3. 接着看 B 的 __radd__() 来查看它是否与输入的路径不同。 3.4 新版功能: 支持在 Windows 上检测非根挂载点。 在 3.6 版更改: 接受一个path-like object。 os.path.join(path, *paths) 智能地合并一个或多个路径部分。返回值将是 path 和所有 *paths 成员的拼接,其中每个非空部分 后面都紧跟一个目录分隔符,最后一个除外。也就是说,如果最后一个部分为空或是以一个分隔符 结束则结果0 码力 | 2072 页 | 10.39 MB | 9 月前3
Python 标准库参考指南 3.9.20 是一个可选字符串,用于指定打开文件的模式。默认值是 'r' ,这意味着它以文本模式 打开并读取。其他常见模式有:写入 'w' (截断已经存在的文件);排它性创建 'x' ;追加 写 'a' (在 一些 Unix 系统上,无论当前的文件指针在什么位置,所有写入都会追加到文件 末尾)。在文本模式,如果 encoding 没有指定,则根据平台来决定使用的编码:使用 locale. getpreferredencoding(False) 来 1. 如果 A 被定义成一个承认 b 的 __add__(),一切都没有问题。 2. 如果 A 转回成“模板”失败,它将返回一个属于 __add__() 的值,我们需要避免 B 定义了一个更 加智能的 __radd__(),因此模板需要返回一个属于 __add__() 的NotImplemented 。(或者 A 可能完全不实现 __add__() 。) 3. 接着看 B 的 __radd__() 来查看它是否与输入的路径不同。 3.4 新版功能: 支持在 Windows 上检测非根挂载点。 在 3.6 版更改: 接受一个类路径对象。 os.path.join(path, *paths) 智能地拼接一个或多个路径部分。返回值是 path 和 *paths 的所有成员的拼接,其中每个非空部分 后面都紧跟一个目录分隔符,最后一个部分除外,这意味着如果最后一个部分为空,则结果将以分 隔符结尾。0 码力 | 2015 页 | 10.12 MB | 9 月前3
Python 标准库参考指南 3.10.15 是可选的字符串,用于指定打开文件的模式。默认值是 'r' ,表示以文本模式打开并读取文件。其 他常见模式有:写入模式 'w'(已存在文件会被清空)、独占创建模式 'x' 、追加写入模式 'a'(在 某些 Unix 系统中,无论当前文件指针在什么位置,所有的写入操作都会追加到文件末尾)。在文本模式,如果 未指定 encoding ,则会根据当前平台决定编码格式:调用 locale.getpreferredencoding(False) 1. 如果 A 被定义成一个承认 b 的 __add__(),一切都没有问题。 2. 如果 A 转回成“模板”失败,它将返回一个属于 __add__() 的值,我们需要避免 B 定义了一个更加 智能的 __radd__(),因此模板需要返回一个属于 __add__() 的NotImplemented 。(或者 A 可能 完全不实现 __add__() 。) 3. 接着看 B 的 __radd__() 来查看它是否与输入的路径不同。 3.4 新版功能: 支持在 Windows 上检测非根挂载点。 在 3.6 版更改: 接受一个path-like object。 os.path.join(path, *paths) 智能地合并一个或多个路径部分。返回值将是 path 和所有 *paths 成员的拼接,其中每个非空部分后面 都紧跟一个目录分隔符,最后一个除外。也就是说,如果最后一个部分为空或是以一个分隔符结束则 结果0 码力 | 2207 页 | 10.45 MB | 9 月前3
Python 标准库参考指南 3.9.20 是一个可选字符串,用于指定打开文件的模式。默认值是 'r' ,这意味着它以文本模式打开并读 取。其他常见模式有:写入 'w'(截断已经存在的文件);排它性创建 'x' ;追加写 'a'(在 一些 Unix 系统上,无论当前的文件指针在什么位置,所有写入都会追加到文件末尾)。在文本模式,如果 encoding 没有指定,则根据平台来决定使用的编码:使用 locale.getpreferredencoding(False) 来获 1. 如果 A 被定义成一个承认 b 的 __add__(),一切都没有问题。 2. 如果 A 转回成“模板”失败,它将返回一个属于 __add__() 的值,我们需要避免 B 定义了一个更加 智能的 __radd__(),因此模板需要返回一个属于 __add__() 的NotImplemented 。(或者 A 可能 完全不实现 __add__() 。) 3. 接着看 B 的 __radd__() 来查看它是否与输入的路径不同。 3.4 新版功能: 支持在 Windows 上检测非根挂载点。 在 3.6 版更改: 接受一个类路径对象。 os.path.join(path, *paths) 智能地拼接一个或多个路径部分。返回值是 path 和 *paths 的所有成员的拼接,其中每个非空部分后面 都紧跟一个目录分隔符,最后一个部分除外,这意味着如果最后一个部分为空,则结果将以分隔符结 尾。0 码力 | 2146 页 | 10.17 MB | 9 月前3
Python 标准库参考指南 3.8.20 是一个可选字符串,用于指定打开文件的模式。默认值是 'r' ,这意味着它以文本模式 打开并读取。其他常见模式有:写入 'w' (截断已经存在的文件);排它性创建 'x' ;追加 写 'a' (在 一些 Unix 系统上,无论当前的文件指针在什么位置,所有写入都会追加到文件 末尾)。在文本模式,如果 encoding 没有指定,则根据平台来决定使用的编码:使用 locale. getpreferredencoding(False) 来 1. 如果 A 被定义成一个承认 b 的 __add__(),一切都没有问题。 2. 如果 A 转回成“模板”失败,它将返回一个属于 __add__() 的值,我们需要避免 B 定义了一个更 加智能的 __radd__(),因此模板需要返回一个属于 __add__() 的NotImplemented 。(或者 A 可能完全不实现 __add__() 。) 3. 接着看 B 的 __radd__() 来查看它是否与输入的路径不同。 3.4 新版功能: 支持在 Windows 上检测非根挂载点。 在 3.6 版更改: 接受一个path-like object。 os.path.join(path, *paths) 智能地拼接一个或多个路径部分。返回值是 path 和 *paths 的所有成员的拼接,其中每个非空部分 后面都紧跟一个目录分隔符,最后一个部分除外,这意味着如果最后一个部分为空,则结果将以分 隔符结尾。0 码力 | 1927 页 | 9.69 MB | 9 月前3
共 77 条
- 1
- 2
- 3
- 4
- 5
- 6
- 8













