用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)

代码解读:

  1. 分词部分:我们用了 jieba 库,它就像一把智能剪刀,能准确地把中文句子剪成词语。
  2. 词向量部分
    • 我们创建了一个迷你文本库,里面既有“苹果”作为水果的句子,也有“苹果”作为电脑品牌的句子。
    • Word2Vec 模型通过阅读这些句子,为每个词学习了一个5维的向量(实际应用中是几百维)。
    • 我们可以看到,“苹果”和“香蕉”、“橘子”的向量在某种程度上是相似的(因为它们都是水果),但也包含了一些让它和“电脑”产生关联的信息。
    • 由于我们的训练数据非常少,结果可能不完美,但它清晰地展示了词向量的核心思想:词的意义可以通过它在数字空间中的位置来表示

总的来说

AI理解自然语言的过程,本质上是一个将人类语言“翻译”成机器能理解的数学语言的过程。它通过“阅读”海量文本,学会了词语之间的关系和句子的结构模式,并用“向量”这个强大的数学工具来表征含义。我们上面的Python代码,就是对这个宏大过程的一个微小但具体的展示。

posted @ 2025-11-21 16:41  深圳蔓延科技有限公司  阅读(1)  评论(0)    收藏  举报