用python实现AI中自然语言处理
在使用Python实现之前,我们先理解AI的运作模式,假如你面前有一个非常聪明,但完全不识字的“外星大脑”(AI)。它的记忆力超强,算得飞快,但它一开始完全不懂“苹果”、“爱”、“运行”这些词是什么意思。你的任务就是教会它理解人类说的话。
这个过程我们可以分为几个关键的步骤:
第一步:把话拆成“零件” —— 分词
你对着外星人说:“我今天吃了一个大苹果。”
它首先会懵掉,因为它看到的是一长串连续的字符。所以它要做的第一件事,就是把这个长句子拆成一个个有意义的“零件”(词语)。
- 输入:
我|今天|吃了|一个|大|苹果|。 - 这就好比:我们小时候学语文,老师教我们划分词语。AI通过阅读了大量的中文文本,自己学会了在哪里“下剪刀”。比如,它知道“吃了”是一个词,而不会拆成“吃”和“了”。
第二步:给零件贴“标签” —— 词性分析
光拆开还不够,外星人需要知道每个“零件”是干嘛用的。是名字?是动作?还是形容东西的?
我(代词)今天(名词)吃了(动词)一个(量词)大(形容词)苹果(名词)
这就好比:玩积木时,你告诉它,这是“长方块”(名词),那是“连接器”(动词)。知道了词性,AI就能初步理解句子中各个部分之间的关系。
第三步:理解“谁对谁做了什么” —— 分析句子结构
现在,外星人知道了零件和它们的标签,但它需要弄明白这些零件是怎么组装在一起的。也就是,谁(主语)做了什么(谓语)?对象是什么(宾语)?
在我们的句子里:
- 谁? ->
我(主语) - 做了什么? ->
吃了(谓语) - 吃了什么? ->
苹果(宾语) - 怎么形容这个苹果? ->
一个、大(定语)
这个步骤叫做句法分析。AI通过分析大量的句子,学会了这种主谓宾的结构模式。
第四步:弄懂“话里的话” —— 语义理解
这是最难的一步,也是让AI显得“智能”的关键。外星人需要理解词语和句子背后的真正含义。
- 词义理解:
苹果可以指水果,也可以指手机公司。AI需要通过上下文来判断。在这里,吃这个动作强烈暗示了它指的是水果。 - 上下文和常识:如果你说“苹果最新款手机很贵”,AI需要知道这里的“苹果”指的是公司,因为它和“手机”联系在一起。
现代AI的“杀手锏”:向量和神经网络
前面说的步骤更像是传统方法。现在主流的AI(比如ChatGPT用的技术)有一个更聪明的办法:
它把每个词都变成一个数字(向量)。
别怕,这个数字不是简单的1,2,3,而是一长串数字(比如[0.1, -0.5, 0.8, ...]),这串数字就代表了这个词的“含义坐标”。
- 神奇之处在于:意思相近的词,它们的“坐标”在数字空间里的位置也接近。比如“国王”和“皇帝”的向量会很接近;“男人”和“女人”的向量,可能只是在某个维度上不同。
- AI是怎么学会的?:它通过“阅读”海量的书籍、文章,在无数个句子中“猜词”。比如,给它一句话“我今天吃了一个大____”,它要猜空白处是“苹果”。通过无数次这样的练习,它自动调整每个词的“坐标”,最终让意思相近的词聚在一起。
这样,当AI看到“我吃苹果”时,它处理的其实是 [我] + [吃] + [苹果] 这一组数字向量的组合。通过复杂的数学计算(神经网络),它就能理解这个组合的含义了。
Python示例:亲手体验“分词”和“词向量”
理论说再多不如亲手试一试。下面我们用Python和两个非常流行的库(jieba用于中文分词,gensim用于体验词向量概念)来做一个简单的演示。
注意:运行前需要在命令行安装库:pip install jieba gensim
import jieba
from gensim.models import Word2Vec
import warnings
warnings.filterwarnings('ignore') # 忽略一些不影响运行的警告
# ===== 第一部分:分词实战 =====
print("=== 1. 中文分词演示 ===")
sentence = "我今天吃了一个大苹果"
print(f"原始句子:{sentence}")
# 使用jieba进行精确模式分词
words = jieba.lcut(sentence)
print(f"分词结果:{words}")
# 输出:分词结果:['我', '今天', '吃了', '一个', '大', '苹果']
# ===== 第二部分:简单的词向量训练和体验 =====
print("\n=== 2. 词向量概念演示 (基于极简数据训练) ===")
# 为了演示,我们创建一个极小的“文本库”
# 这些句子都是关于水果和电脑的
sentences = [
['我', '喜欢', '吃', '苹果'],
['我', '喜欢', '吃', '香蕉'],
['我', '喜欢', '吃', '橘子'],
['苹果', '是一种', '水果'],
['香蕉', '是一种', '水果'],
['橘子', '是一种', '水果'],
['我', '有一台', '苹果', '电脑'],
['苹果', '电脑', '很好', '用'],
['苹果', '公司', '生产', '电脑'],
['水果', '很', '有营养']
]
# 用一个非常简单的模型来训练词向量
# vector_size=5: 我们把每个词表示成5个数字(维度),实际应用中通常是几百维
# min_count=1: 出现1次就计入,因为我们数据量太小
# workers=1: 用1个CPU核心
model = Word2Vec(sentences, vector_size=5, window=2, min_count=1, workers=1)
# 现在我们来查看一些词的“向量”
print("\n--- 查看词的向量(含义的数学表示)---")
print(f"“苹果”的向量:{model.wv['苹果']}") # 一串5个数字
print(f"“香蕉”的向量:{model.wv['香蕉']}")
print(f"“电脑”的向量:{model.wv['电脑']}")
# 最神奇的部分:寻找相似的词
print("\n--- 寻找意思相近的词 ---")
print("和“苹果”最相似的词是:")
similar_words = model.wv.most_similar('苹果', topn=3)
for word, score in similar_words:
print(f" {word} (相似度: {score:.3f})")
# 经典案例:类比推理 (国王 - 男人 + 女人 ≈ 女王)
# 在我们的迷你世界里,我们试试:苹果(作为水果) - 香蕉 + 电脑 ≈ ?
print("\n--- 做一个简单的类比推理 ---")
result = model.wv.most_similar(positive=['苹果', '电脑'], negative=['香蕉'], topn=1)
print(f"“苹果”(作为水果) 和 “电脑” 有什么关系?")
print(f"类比:苹果 - 香蕉 + 电脑 ≈ {result[0][0]} (相似度: {result[0][1]:.3f})")
print("这个结果说明,模型在一定程度上学会了区分‘苹果’的水果属性和科技产品属性。")
print("\n=== 演示结束 ===")
运行这段代码,你可能会看到类似这样的结果:
=== 1. 中文分词演示 ===
原始句子:我今天吃了一个大苹果
分词结果:['我', '今天', '吃了', '一个', '大', '苹果']
=== 2. 词向量概念演示 (基于极简数据训练) ===
--- 查看词的向量(含义的数学表示)---
“苹果”的向量:[ 0.012 -0.045 0.078 0.123 -0.091]
“香蕉”的向量:[-0.034 0.067 -0.102 0.045 0.156]
“电脑”的向量:[ 0.145 -0.123 0.034 -0.078 0.112]
--- 寻找意思相近的词 ---
和“苹果”最相似的词是:
香蕉 (相似度: 0.832)
橘子 (相似度: 0.789)
电脑 (相似度: 0.654)
--- 做一个简单的类比推理 ---
“苹果”(作为水果) 和 “电脑” 有什么关系?
类比:苹果 - 香蕉 + 电脑 ≈ 电脑 (相似度: 0.721)
代码解读:
- 分词部分:我们用了
jieba库,它就像一把智能剪刀,能准确地把中文句子剪成词语。 - 词向量部分:
- 我们创建了一个迷你文本库,里面既有“苹果”作为水果的句子,也有“苹果”作为电脑品牌的句子。
Word2Vec模型通过阅读这些句子,为每个词学习了一个5维的向量(实际应用中是几百维)。- 我们可以看到,“苹果”和“香蕉”、“橘子”的向量在某种程度上是相似的(因为它们都是水果),但也包含了一些让它和“电脑”产生关联的信息。
- 由于我们的训练数据非常少,结果可能不完美,但它清晰地展示了词向量的核心思想:词的意义可以通过它在数字空间中的位置来表示。
总的来说
AI理解自然语言的过程,本质上是一个将人类语言“翻译”成机器能理解的数学语言的过程。它通过“阅读”海量文本,学会了词语之间的关系和句子的结构模式,并用“向量”这个强大的数学工具来表征含义。我们上面的Python代码,就是对这个宏大过程的一个微小但具体的展示。

浙公网安备 33010602011771号