

自然语言理解(Natural Language Understanding, NLU)是指计算机能够理解人类自然语言的能力,包括文字和语音两种形式。它不仅要求计算机能识别语言符号,还需要理解语言背后的含义、情感和意图。
简单来说,自然语言理解就是让计算机 "听懂" 和 "看懂" 人类的语言,并做出合适的回应。
自然语言处理的发展经历了多个阶段,从早期的规则方法到现在的深度学习方法,取得了巨大的进步。

(图 1:NLP 发展历史思维导图 )
自然语言处理是一个复杂的过程,通常可以分为多个层次进行处理。这些层次从低级到高级依次处理语言的不同方面。

(图 2:语言处理过程的层次流程图)
各层次的主要任务:
下面我们通过一个综合案例来展示语言处理的部分层次,实现一个文本预处理的流程:
import jieba
import jieba.posseg as pseg
import re
from collections import Counter
# 1. 原始文本
text = "自然语言处理(Natural Language Processing, NLP)是人工智能的一个重要分支,它研究计算机如何理解和生成人类语言。" \
"近年来,随着深度学习的发展,NLP技术取得了巨大进步,例如机器翻译、语音识别等应用越来越普及。"
# 2. 文本清洗(去除特殊符号)
def clean_text(text):
"""清洗文本,去除特殊符号和多余空格"""
# 去除HTML标签等
text = re.sub(r'<.*?>', '', text)
# 去除特殊符号和数字
text = re.sub(r'[^\u4e00-\u9fa5a-zA-Z]', ' ', text)
# 去除多余空格
text = re.sub(r'\s+', ' ', text).strip()
return text
cleaned_text = clean_text(text)
print("清洗后的文本:")
print(cleaned_text)
print()
# 3. 分词(词法分析的一部分)
words = jieba.lcut(cleaned_text)
print("分词结果:")
print(words)
print()
# 4. 词性标注(词法分析的一部分)
pos_words = pseg.lcut(cleaned_text)
print("词性标注结果:")
print([(word, flag) for word, flag in pos_words])
print()
# 5. 词频统计
word_counts = Counter(words)
print("词频统计(前5名):")
print(word_counts.most_common(5))
代码说明:
jieba库进行中文分词和词性标注运行前请先安装必要的库:
bash
pip install jieba机器翻译(Machine Translation, MT)是指利用计算机将一种自然语言自动翻译成另一种自然语言的技术。从早期的基于规则的方法,到后来的统计机器翻译,再到现在主流的神经机器翻译,机器翻译技术不断发展进步。

(图 3:机器翻译基本流程图 )
下面我们使用 Hugging Face 的 Transformers 库来实现一个简单的机器翻译系统,支持多种语言间的互译:
# 安装必要的库
# !pip install transformers torch sentencepiece
from transformers import pipeline, AutoModelForSeq2SeqLM, AutoTokenizer
def translate_text(text, src_lang, tgt_lang, model_name=None):
"""
实现文本翻译
参数:
text: 要翻译的文本
src_lang: 源语言 (如 'en', 'zh')
tgt_lang: 目标语言 (如 'zh', 'en')
model_name: 预训练模型名称,默认为None时自动选择
"""
# 如果没有指定模型,根据语言对选择合适的模型
if model_name is None:
if (src_lang, tgt_lang) in [('en', 'zh'), ('zh', 'en')]:
model_name = "Helsinki-NLP/opus-mt-en-zh" if tgt_lang == 'zh' else "Helsinki-NLP/opus-mt-zh-en"
else:
# 多语言翻译模型
model_name = "Helsinki-NLP/opus-mt-mul-en" if tgt_lang == 'en' else "Helsinki-NLP/opus-mt-en-mul"
try:
# 加载模型和分词器
model = AutoModelForSeq2SeqLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 创建翻译管道
translator = pipeline("translation", model=model, tokenizer=tokenizer)
# 执行翻译
result = translator(text, max_length=400)
# 返回翻译结果
return result[0]['translation_text']
except Exception as e:
return f"翻译出错: {str(e)}"
# 测试中英互译
english_text = "Natural language processing is an important branch of artificial intelligence."
chinese_translation = translate_text(english_text, "en", "zh")
print(f"英文原文: {english_text}")
print(f"中文翻译: {chinese_translation}")
print()
chinese_text = "机器学习使计算机能够从数据中学习并改进,而无需显式编程。"
english_translation = translate_text(chinese_text, "zh", "en")
print(f"中文原文: {chinese_text}")
print(f"英文翻译: {english_translation}")代码说明:
语音识别(Speech Recognition)是将人类的语音信号转换为文本的技术。它是人机交互的重要方式,广泛应用于智能助手、语音输入、电话客服等场景。

(图 4:语音识别主要流程图 )
主要步骤说明:
隐马尔可夫模型(Hidden Markov Model, HMM)是一种统计模型,广泛应用于语音识别、自然语言处理等领域。它用来描述一个含有隐含未知参数的马尔可夫过程。
HMM 包含两个状态:
HMM 有三个基本问题:
(图 5:隐马尔可夫模型示意图)
隐藏状态序列: S1 → S2 → S3 → ... → Sn
| | | |
v v v v
观测状态序列: O1 → O2 → O3 → ... → On下面是一个简单的 HMM 实现,用于理解其基本原理:
import numpy as np
class HiddenMarkovModel:
def __init__(self, num_states, num_observations):
"""
初始化隐马尔可夫模型
参数:
num_states: 隐藏状态的数量
num_observations: 观测状态的数量
"""
self.num_states = num_states
self.num_observations = num_observations
# 初始化状态转移概率矩阵
self.transition = np.ones((num_states, num_states)) / num_states
# 初始化观测概率矩阵
self.emission = np.ones((num_states, num_observations)) / num_observations
# 初始化初始状态概率
self.initial = np.ones(num_states) / num_states
def forward(self, observations):
"""
前向算法:计算观测序列的概率
参数:
observations: 观测序列
返回:
观测序列的概率
"""
T = len(observations)
# 前向概率矩阵
alpha = np.zeros((T, self.num_states))
# 初始化第一个时刻
alpha[0] = self.initial * self.emission[:, observations[0]]
# 递推计算
for t in range(1, T):
for s in range(self.num_states):
alpha[t, s] = self.emission[s, observations[t]] * np.sum(alpha[t-1] * self.transition[:, s])
# 求和得到最终概率
return np.sum(alpha[-1])
def viterbi(self, observations):
"""
维特比算法:找到最可能的隐藏状态序列
参数:
observations: 观测序列
返回:
最可能的隐藏状态序列和对应的概率
"""
T = len(observations)
# 概率矩阵
delta = np.zeros((T, self.num_states))
# 路径矩阵
psi = np.zeros((T, self.num_states), dtype=int)
# 初始化第一个时刻
delta[0] = self.initial * self.emission[:, observations[0]]
# 递推计算
for t in range(1, T):
for s in range(self.num_states):
# 计算所有可能的前一状态的概率
probabilities = delta[t-1] * self.transition[:, s]
# 找到最大概率和对应的状态
max_prob = np.max(probabilities)
max_state = np.argmax(probabilities)
delta[t, s] = max_prob * self.emission[s, observations[t]]
psi[t, s] = max_state
# 找到最后时刻的最大概率状态
final_prob = np.max(delta[-1])
final_state = np.argmax(delta[-1])
# 回溯找到最优路径
path = [final_state]
for t in range(T-1, 0, -1):
path.append(psi[t, path[-1]])
# 反转路径,使其与观测序列顺序一致
path.reverse()
return path, final_prob
# 简单测试
if __name__ == "__main__":
# 创建一个有2个隐藏状态和3个观测状态的HMM
hmm = HiddenMarkovModel(2, 3)
# 手动设置一些概率(实际应用中通常通过训练得到)
hmm.initial = np.array([0.6, 0.4])
hmm.transition = np.array([[0.7, 0.3], [0.4, 0.6]])
hmm.emission = np.array([[0.1, 0.4, 0.5], [0.6, 0.3, 0.1]])
# 观测序列
observations = [0, 1, 2, 0]
# 计算观测序列的概率
prob = hmm.forward(observations)
print(f"观测序列的概率: {prob:.6f}")
# 找到最可能的隐藏状态序列
path, path_prob = hmm.viterbi(observations)
print(f"最可能的隐藏状态序列: {path}")
print(f"该序列的概率: {path_prob:.6f}")
基于 HMM 的语音识别方法是传统语音识别的主流方法,其核心思想是将语音识别问题转化为 HMM 的解码问题:
下面我们使用 Python 的 SpeechRecognition 库来实现一个简单的语音识别系统。这个库封装了多种语音识别 API,使用起来非常方便。
import speech_recognition as sr
class SimpleSpeechRecognizer:
def __init__(self):
"""初始化语音识别器"""
self.recognizer = sr.Recognizer()
def recognize_from_microphone(self, timeout=5, phrase_time_limit=10):
"""
从麦克风识别语音
参数:
timeout: 等待语音输入的超时时间(秒)
phrase_time_limit: 最长语音输入时间(秒)
返回:
识别出的文本或错误信息
"""
# 使用麦克风作为音频源
with sr.Microphone() as source:
print("请开始说话...")
# 调整环境噪声
self.recognizer.adjust_for_ambient_noise(source)
try:
# 监听麦克风输入
audio = self.recognizer.listen(
source,
timeout=timeout,
phrase_time_limit=phrase_time_limit
)
print("正在识别...")
# 使用Google Web Speech API进行识别
text = self.recognizer.recognize_google(audio, language='zh-CN')
return f"识别结果: {text}"
except sr.WaitTimeoutError:
return "超时错误: 没有检测到语音输入"
except sr.UnknownValueError:
return "识别错误: 无法理解语音"
except sr.RequestError as e:
return f"请求错误: 无法连接到识别服务;{e}"
def recognize_from_file(self, file_path, language='zh-CN'):
"""
从音频文件识别语音
参数:
file_path: 音频文件路径
language: 语言代码,如'zh-CN'表示中文,'en-US'表示英文
返回:
识别出的文本或错误信息
"""
try:
# 读取音频文件
with sr.AudioFile(file_path) as source:
audio = self.recognizer.record(source)
print("正在识别音频文件...")
# 使用Google Web Speech API进行识别
text = self.recognizer.recognize_google(audio, language=language)
return f"识别结果: {text}"
except FileNotFoundError:
return f"文件错误: 找不到文件 {file_path}"
except sr.UnknownValueError:
return "识别错误: 无法理解音频内容"
except sr.RequestError as e:
return f"请求错误: 无法连接到识别服务;{e}"
# 测试语音识别
if __name__ == "__main__":
recognizer = SimpleSpeechRecognizer()
# 测试从麦克风识别
print("测试麦克风识别:")
print(recognizer.recognize_from_microphone())
print()
# 如果你有音频文件,可以测试从文件识别
# 请将下面的路径替换为你的音频文件路径
# audio_file = "test.wav"
# print(f"测试从文件 {audio_file} 识别:")
# print(recognizer.recognize_from_file(audio_file))代码说明:
运行前请先安装必要的库:
pip install SpeechRecognition pyaudio注意:pyaudio 库在某些系统上可能需要额外的依赖才能安装成功。如果遇到安装问题,可以参考其官方文档。
本章我们学习了自然语言处理的基本概念和主要应用,包括:
自然语言处理是一个快速发展的领域,随着深度学习技术的不断进步,新的模型和方法不断涌现。希望通过本章的学习,大家能够对 NLP 有一个基本的认识,并能够动手实践相关的应用。

(图 6:第 10 章内容总结思维导图 )
希望本章内容对大家有所帮助!如果有任何问题或建议,欢迎在评论区留言讨论。感谢阅读!