首页
/ ML-For-Beginners NLP 入门:从图灵测试、Eliza 到写出第一个 Python 对话机器人

ML-For-Beginners NLP 入门:从图灵测试、Eliza 到写出第一个 Python 对话机器人

2026-09-04 20:28:46作者:郁楠烈Hubert

本篇是 ML-For-Beginners 课程第 6 周「自然语言处理」的第一课,带你了解 NLP(Natural Language Processing,自然语言处理)的学科定位与发展脉络——从图灵测试、模仿游戏到 MIT 的 Eliza 程序——并在「无数学公式」的前提下,用 Python 3 亲手实现一个名为 Marvin 的随机应答式对话机器人,掌握「用户输入循环 + 退出条件 + 随机回复」这一构建对话系统的最小骨架,为后续课程中的分词(tokenization)、词性标注(POS tagging)与情感分析打下基础。

语言学理解为何困难

NLP 与计算语言学:一个应用最广的机器学习领域

NLP 是机器学习在生产软件中应用最广、最为人知的领域之一。你可能每天都在使用嵌入了 NLP 功能而不自知的软件——文字处理程序的拼写检查、手机输入法、语音助手都是典型例子。

先厘清两个概念:

  • 计算语言学(Computational Linguistics):研究计算机如何「工作于、理解、翻译并与语言交流」的研究与开发领域,已持续数十年。
  • 自然语言处理(NLP):其相关分支,聚焦于计算机如何处理「自然」的、即人类语言。

案例:手机语音听写的处理链条

如果你曾对手机口述文字、或向虚拟助手提问,那么你的语音经历了如下处理流程:

  1. 语音被转换成文本形式;
  2. 文本被从你所说的语言中进行解析(parsing)
  3. 检测出的关键词被整理成手机或助手能够理解并据此执行的格式。

这一技术之所以可行,是因为有人编写了相应的计算机程序。几十年前,一些科幻作家预言人们将主要靠说话与计算机交互、且计算机总能准确理解其含义——但事实证明这比许多人想象的要难得多。即便在理解「句子意义」方面,实现「完美」的自然语言处理依然面临重大挑战,当涉及理解幽默、或检测句子中的讽刺情绪时,难度尤其高。

这里你会想起学校里老师讲解句子语法成分的课堂。有些国家把语法和语言学作为专门学科教授,在许多国家这些内容则是语言学习的一部分(小学学习读写母语、中学学习第二语言)。如果你分不清名词和动词、副词和形容词,也别担心;如果你被 simple present(一般现在时)与 present progressive(现在进行时)的区别困扰,你并不孤单——这对许多母语者来说都有难度。好消息是:计算机非常擅长应用形式化规则,本课程会教你编写能像人一样解析句子的代码。后续更棘手的挑战才是理解句子的含义(meaning)与情感(sentiment)。

课程前置条件

本课程的唯一硬性前提是能够读懂本课使用的语言,不需要解任何数学题。虽然原作者用英文撰写,但课程已翻译为多种语言(可在仓库 translations/ 目录下找到 40 多种语言版本);文中用于对比不同语言语法规则的示例句子不做翻译,解释性文字已翻译,含义仍可理解。

编码任务使用 Python,示例基于 Python 3.8。你需要并会用到:

  • Python 3 基础:本课使用 input、循环、文件读取、数组;
  • Visual Studio Code + Python 扩展(也可以使用其他 Python IDE);
  • TextBlob:一个简化的 Python 文本处理库,按官方说明安装,并同时安装语料库(corpora),命令如下:
pip install -U textblob
python -m textblob.download_corpora

提示:可以直接在 VS Code 中运行 Python。

与机器对话的历史:图灵测试、模仿游戏与 Eliza

让计算机理解人类语言的历史可追溯数十年之前,最早考虑自然语言处理的科学家之一是 Alan Turing

图灵测试(The Turing Test)

20 世纪 50 年代,Turing 在研究人工智能时设想:能否设计一个对话测试,让人类通过文字通信与另一个人或一台计算机对话,而对话者不确定对方是人还是机器?

如果经过一定长度的对话后,人类无法判断回答来自计算机,那么这台计算机能否被认为具有思考能力?

灵感来源:「模仿游戏」

这个想法源于一个聚会游戏 The Imitation Game:提问者独处在房间里,任务是判定另一房间中的两个人(一男一女)分别是谁。提问者可以发送纸条,并思考哪些问题能让书面答案暴露对方的性别。当然,另一个房间里的玩家可以通过误导性或令人困惑的回答来欺骗提问者,同时又要表现出诚实作答的样子。

Eliza 的开发

20 世纪 60 年代,MIT 科学家 Joseph Weizenbaum 开发了 Eliza——一个计算机「心理咨询师」,它会向人类提问,并营造出理解其回答的样子。Eliza 能解析句子、识别某些语法结构和关键词,从而给出合理的回答,但谈不上真正理解句子。

例如,当输入形如「I am sad」的句子时,Eliza 可能会重排和替换句子中的词,生成回复「How long have you been sad」。这营造出 Eliza 理解了陈述并提出了追问的假象,而实际上它只是改变了时态、添加了一些词。当 Eliza 找不到可应答的关键词时,它会随机回复一条适用于许多不同陈述的通用语句。Eliza 很容易被骗:如果用户写「You are a bicycle」,它可能回复「How long have I been a bicycle?」,而不是一个更合乎逻辑的回答。

实战练习:编写一个基础对话机器人

对话机器人(conversational bot)与 Eliza 类似:引导用户输入,并表现得像是理解并智能地回应了输入。与拥有多条规则、营造智能对话假象的 Eliza 不同,本课的机器人只有一种能力——用几乎适用于任何琐碎对话的随机回复来维持对话。

计划

构建对话机器人的步骤如下:

  1. 打印说明文字,告知用户如何与机器人交互;
  2. 开始一个循环:
    1. 接受用户输入;
    2. 如果用户要求退出,则退出;
    3. 处理用户输入并决定回复(本例中,回复是从一组可能的通用回复中随机选取的);
    4. 打印回复;
  3. 回到第 2 步继续循环。

构建机器人

首先定义一组随机回复(你可以添加自己的回复,或翻译成自己的语言):

random_responses = ["That is quite interesting, please tell me more.",
                    "I see. Do go on.",
                    "Why do you say that?",
                    "Funny weather we've been having, isn't it?",
                    "Let's change the subject.",
                    "Did you catch the game last night?"]

期望的样例输出如下(以 > 开头的行是用户输入):

Hello, I am Marvin, the simple robot.
You can end this conversation at any time by typing 'bye'
After typing each answer, press 'enter'
How are you today?
> I am good thanks
That is quite interesting, please tell me more.
> today I went for a walk
Did you catch the game last night?
> I did, but my team lost
Funny weather we've been having, isn't it?
> yes but I hope next week is better
Let's change the subject.
> ok, lets talk about music
Why do you say that?
> because I like music!
Why do you say that?
> bye
It was nice talking to you, goodbye!

参考实现与源码解析

课程提供的完整参考实现位于 solution/bot.py,全文如下:

import random

# This list contains the random responses (you can add your own or translate them into your own language too)
random_responses = ["That is quite interesting, please tell me more.",
                    "I see. Do go on.",
                    "Why do you say that?",
                    "Funny weather we've been having, isn't it?",
                    "Let's change the subject.",
                    "Did you catch the game last night?"]

print("Hello, I am Marvin, the simple robot.")
print("You can end this conversation at any time by typing 'bye'")
print("After typing each answer, press 'enter'")
print("How are you today?")

while True:
    # wait for the user to enter some text
    user_input = input("> ")
    if user_input.lower() == "bye":
        # if they typed in 'bye' (or even BYE, ByE, byE etc.), break out of the loop
        break
    else:
        response = random.choices(random_responses)[0]
    print(response)

print("It was nice talking to you, goodbye!")

对照上文的四步计划,可以从源码结构看其逐条落地方式:

  • 步骤 1(打印交互说明):四个 print 语句依次输出机器人身份(「Hello, I am Marvin, the simple robot.」)、退出方式(输入 bye)、回车确认方式,以及第一句开场白「How are you today?」。
  • 步骤 2(循环 + 输入 + 退出判断 + 处理 + 输出)while True: 建立无限循环;input("> ")> 作为提示符阻塞等待用户输入。退出判断使用 user_input.lower() == "bye"——先转小写再比较,因此 BYEByEbyE 等任意大小写形式都能触发 break 跳出循环。处理逻辑只有一行:random.choices(random_responses)[0],从 6 条通用回复列表中随机抽取一条(random.choices 返回单元素列表,取下标 [0] 得到字符串)。
  • 循环结束后的收尾break 跳出循环后,程序继续执行循环之外的 print("It was nice talking to you, goodbye!"),这与样例输出最后一行一致。

值得注意的是,这个机器人没有任何语义分析——它不会把输入与回复关联,这正是它与 Eliza 的区别所在:Eliza 尚且能通过改写句式营造「理解」的假象,而 Marvin 完全靠随机性撑场面。

停下来思考(Stop and consider)

  1. 你认为这些随机回复能「骗」过人,让人以为机器人真的理解了他吗?
  2. 机器人需要具备哪些功能才能更有效?
  3. 如果一个机器人能真正「理解」句子的含义,它是否还需要「记住」对话中前几句的含义?

🚀 挑战(Challenge)

从上面任意一个「停下来思考」问题入手,尝试用代码实现它,或在纸上用伪代码写出解决方案。

课后作业与延伸阅读

  • 作业「寻找一个机器人」:完整的作业说明见 assignment.md。任务要求你在网站、银行应用或电话客服等场景中找到一个真实机器人,分析它并尝试「搞晕」它;如果能成功,分析你认为原因何在,并写一篇短文说明你的经验。评分标准(Rubric)要求一篇完整页面长度的论文,解释所推测的机器人架构并概述你的体验。
  • 参考阅读:Schubert, Lenhart, "Computational Linguistics", The Stanford Encyclopedia of Philosophy(Spring 2020 Edition);Princeton University "About WordNet." WordNet, 2010.
  • 下一课:在 Common NLP tasks and techniques 中,你将学习分词、词嵌入(embeddings)、解析与词性标注(parsing & POS tagging)、词/短语频率统计、N-grams 等处理自然语言的常用方法,以及机器学习在这些任务中的应用。

整个第 6 周课程的完整脉络(共 5 课:NLP 入门 → 常见任务与技术 → 机器翻译与情感分析 → 酒店评论数据准备 → 用 NLTK 做情感分析)见 6-NLP/README.md

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.13 K
2.75 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
857
1.35 K
docsdocs
暂无描述
Markdown
897
5.8 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
529
593
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
915
1.83 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.58 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.35 K
1.46 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.01 K
515
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
547
388