深度学习:自然语言处理

news2025/1/15 9:29:09

一、引言

自然语言处理作为人工智能领域的关键分支,致力于使计算机能够理解、分析和生成人类语言。近年来,随着深度学习技术的迅猛发展,自然语言处理取得了前所未有的突破,一系列创新技术和应用不断涌现,极大地推动了人机交互、信息检索、智能客服等众多领域的进步。

二、自然语言处理基础任务与传统方法

(一)文本分类

文本分类是 NLP 中的常见任务,例如将新闻文章分类为政治、体育、娱乐等类别。传统的文本分类方法常基于特征工程,如词袋模型(Bag of Words)和 TF-IDF(Term Frequency-Inverse Document Frequency)。以下是一个简单的基于词袋模型和朴素贝叶斯分类器的文本分类代码示例:

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score

# 示例文本数据
texts = ["这是一篇体育新闻,讲述了一场精彩的足球比赛。",
         "政治新闻:关于国家领导人的重要会议报道。",
         "娱乐新闻:某明星的新电影即将上映。"]
labels = ["体育", "政治", "娱乐"]

# 构建词袋模型
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(texts)

# 训练朴素贝叶斯分类器
clf = MultinomialNB()
clf.fit(X, labels)

# 测试数据
test_text = "今天有一场盛大的演唱会,众多明星齐聚。"
test_X = vectorizer.transform([test_text])
predicted_label = clf.predict(test_X)
print("预测标签:", predicted_label)

# 评估模型(在完整数据集上)
# 假设这里有完整的训练集和测试集 X_train, X_test, y_train, y_test
# clf.fit(X_train, y_train)
# y_pred = clf.predict(X_test)
# accuracy = accuracy_score(y_test, y_pred)
# print("准确率:", accuracy)

(二)命名实体识别(NER)

命名实体识别旨在识别文本中的人名、地名、组织机构名等实体。传统方法多采用基于规则和统计的模型,如隐马尔可夫模型(HMM)和条件随机域(CRF)。以下是一个基于 CRF 的命名实体识别代码框架:

import nltk
from sklearn_crfsuite import CRF

# 示例句子
sentence = "苹果公司在加利福尼亚州发布了新款 iPhone。"

# 定义特征提取函数
def word2features(sent, i):
    word = sent[i]
    features = {
        'word.lower()': word.lower(),
        'word[-3:]': word[-3:],
        'word.isupper()': word.isupper(),
        'word.istitle()': word.istitle()
    }
    if i > 0:
        prev_word = sent[i - 1]
        features.update({
            '-1:word.lower()': prev_word.lower(),
            '-1:word.istitle()': prev_word.istitle()
        })
    else:
        features['BOS'] = True  # 句子开头标记
    if i < len(sent) - 1:
        next_word = sent[i + 1]
        features.update({
            '+1:word.lower()': next_word.lower(),
            '+1:word.istitle()': next_word.istitle()
        })
    else:
        features['EOS'] = True  # 句子结尾标记
    return features

def sent2features(sent):
    return [word2features(sent, i) for i in range(len(sent))]

def sent2labels(sent):
    # 这里假设已经有标注好的标签数据,实际应用中需要标注或使用已有的标注数据集
    return ["ORG" if word == "苹果公司" else "LOC" if word == "加利福尼亚州" else "O" for word in sent]

# 提取特征和标签
X = [sent2features(nltk.word_tokenize(sentence))]
y = [sent2labels(nltk.word_tokenize(sentence))]

# 训练 CRF 模型
crf = CRF()
crf.fit(X, y)

# 预测
predicted_labels = crf.predict(X)
print("预测的命名实体标签:", predicted_labels)

三、神经网络在自然语言处理中的应用

(一)循环神经网络(RNN)及其变体

循环神经网络在处理序列数据方面具有天然的优势,其能够保留序列中的上下文信息。长短期记忆网络(LSTM)和门控循环单元(GRU)是 RNN 的重要变体,有效解决了传统 RNN 的梯度消失和梯度爆炸问题。以下是一个基于 LSTM 的文本生成代码示例:

import torch
import torch.nn as nn

# 定义 LSTM 文本生成模型
class LSTMTextGenerator(nn.Module):
    def __init__(self, vocab_size, embedding_dim, hidden_dim):
        super(LSTMTextGenerator, self).__init__()
        self.embedding = nn.Embedding(vocab_size, embedding_dim)
        self.lstm = nn.LSTM(embedding_dim, hidden_dim, batch_first=True)
        self.fc = nn.Linear(hidden_dim, vocab_size)

    def forward(self, x, hidden):
        x = self.embedding(x)
        output, hidden = self.lstm(x, hidden)
        output = self.fc(output)
        return output, hidden

    def init_hidden(self, batch_size):
        return (torch.zeros(1, batch_size, self.lstm.hidden_size),
                torch.zeros(1, batch_size, self.lstm.hidden_size))

# 示例数据准备(这里简化为一个小的词汇表和文本序列)
vocab = ['我', '爱', '自然', '语言', '处理']
word_to_idx = {word: i for i, word in enumerate(vocab)}
idx_to_word = {i: word for i, word in enumerate(vocab)}
text = "我爱自然语言"
input_sequence = [word_to_idx[word] for word in text]
input_tensor = torch.tensor([input_sequence])

# 模型参数设置
vocab_size = len(vocab)
embedding_dim = 10
hidden_dim = 20

# 初始化模型
model = LSTMTextGenerator(vocab_size, embedding_dim, hidden_dim)

# 训练模型(这里省略训练循环,仅展示前向传播)
hidden = model.init_hidden(1)
output, hidden = model(input_tensor, hidden)

# 生成文本
generated_text = []
input_word = input_sequence[-1]
for _ in range(5):  # 生成 5 个单词
    input_tensor = torch.tensor([[input_word]])
    output, hidden = model(input_tensor, hidden)
    # 选择概率最高的单词作为下一个单词
    topv, topi = output.topk(1)
    input_word = topi.item()
    generated_text.append(idx_to_word[input_word])

print("生成的文本:", ''.join(generated_text))

(二)卷积神经网络(CNN)在 NLP 中的应用

卷积神经网络在自然语言处理中也有广泛应用,可用于文本分类、情感分析等任务。它通过卷积层提取文本的局部特征,然后通过池化层进行特征融合。以下是一个简单的基于 CNN 的文本分类代码:

import torch
import torch.nn as nn
import torch.optim as optim
from torchtext.legacy.data import Field, TabularDataset, BucketIterator

# 定义文本字段和标签字段
TEXT = Field(sequential=True, lower=True, batch_first=True)
LABEL = Field(sequential=False, use_vocab=False, batch_first=True)

# 加载数据集(假设已经有数据文件 'data.csv',格式为'text,label')
fields = [('text', TEXT), ('label', LABEL)]
train_data, test_data = TabularDataset.splits(
    path='.', train='data.csv', test='test.csv', format='csv', fields=fields)

# 构建词汇表
TEXT.build_vocab(train_data)

# 定义 CNN 模型
class CNNTextClassifier(nn.Module):
    def __init__(self, vocab_size, embedding_dim, num_filters, filter_sizes, output_dim):
        super(CNNTextClassifier, self).__init__()
        self.embedding = nn.Embedding(vocab_size, embedding_dim)
        self.convs = nn.ModuleList([
            nn.Conv2d(1, num_filters, (fs, embedding_dim)) for fs in filter_sizes
        ])
        self.fc = nn.Linear(len(filter_sizes) * num_filters, output_dim)

    def forward(self, x):
        x = self.embedding(x)
        # x: [batch_size, seq_len, embedding_dim]
        x = x.unsqueeze(1)
        # x: [batch_size, 1, seq_len, embedding_dim]
        conved = [F.relu(conv(x)).squeeze(3) for conv in self.convs]
        # conved: [batch_size, num_filters, seq_len - filter_size + 1]
        pooled = [F.max_pool1d(conv, conv.shape[2]).squeeze(2) for conv in conved]
        # pooled: [batch_size, num_filters]
        cat = torch.cat(pooled, dim=1)
        # cat: [batch_size, num_filters * len(filter_sizes)]
        return self.fc(cat)

# 模型参数设置
vocab_size = len(TEXT.vocab)
embedding_dim = 100
num_filters = 100
filter_sizes = [3, 4, 5]
output_dim = 2  # 假设二分类任务

# 初始化模型
model = CNNTextClassifier(vocab_size, embedding_dim, num_filters, filter_sizes, output_dim)

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters())

# 训练模型(这里省略完整训练循环)
for epoch in range(10):
    for batch in BucketIterator(train_data, batch_size=64, shuffle=True):
        optimizer.zero_grad()
        text = batch.text
        label = batch.label
        output = model(text)
        loss = criterion(output, label)
        loss.backward()
        optimizer.step()

# 测试模型(这里省略完整测试过程)
# 计算准确率等指标

四、预训练模型:BERT 与 GPT 等

(一)BERT(Bidirectional Encoder Representations from Transformers)

BERT 模型基于 Transformer 架构,通过大规模语料库的预训练,学习到了丰富的语言表示。它在多个自然语言处理任务上取得了 state-of-the-art 的成果,如文本分类、问答系统等。以下是一个使用 BERT 进行文本分类的简单示例:

import torch
from transformers import BertTokenizer, BertForSequenceClassification

# 加载预训练的 BERT 分词器和模型
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
model = BertForSequenceClassification.from_pretrained('bert-base-chinese', num_labels=2)

# 示例文本
text = "这部电影非常精彩,值得一看。"

# 文本预处理
encoded_text = tokenizer.encode_plus(
    text,
    add_special_tokens=True,
    max_length=128,
    padding='max_length',
    return_attention_mask=True,
    return_tensors='pt'
)

input_ids = encoded_text['input_ids']
attention_mask = encoded_text['attention_mask']

# 模型预测
with torch.no_grad():
    outputs = model(input_ids, attention_mask=attention_mask)
    logits = outputs[0]
    predicted_class = torch.argmax(logits, dim=1).item()

print("预测类别:", predicted_class)

(二)GPT(Generative Pretrained Transformer)

GPT 系列模型专注于生成任务,通过自监督学习方式在大规模文本上进行预训练。它能够根据给定的上下文生成连贯的文本。以下是一个使用 GPT-2 生成文本的示例:

import torch
from transformers import GPT2Tokenizer, GPT2LMHeadModel

# 加载 GPT-2 分词器和模型
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
model = GPT2LMHeadModel.from_pretrained('gpt2')

# 示例上下文
context = "在美丽的森林中,"

# 生成文本
input_ids = tokenizer.encode(context, return_tensors='pt')
output = model.generate(
    input_ids,
    max_length=50,
    num_return_sequences=1,
    no_repeat_ngram_size=2,
    top_k=50,
    top_p=0.95
)
generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
print("生成的文本:", generated_text)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2251465.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 系统之Init进程分析

1、Init进程流程 2、Init细节逻辑 2.1 Init触发shutdown init进程触发系统重启是一个很合理的逻辑&#xff0c;为什么合理&#xff1f; init进程是android世界的一切基石&#xff0c;如果android世界的某些服务或者进程出现异常&#xff0c;那么会导致整个系统无法正常使用…

轻量化的长时间序列预测模型

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

【Vue3】从零开始创建一个VUE项目

【Vue3】从零开始创建一个VUE项目 手动创建VUE项目附录 package.json文件报错处理: Failed to get response from https://registry.npmjs.org/vue-cli-version-marker 相关链接&#xff1a; 【VUE3】【Naive UI】&#xff1c;NCard&#xff1e; 标签 【VUE3】【Naive UI】&…

win10中使用ffmpeg的filter滤镜

1 给视频加文字水印 1.1 添加播放时间 ffmpeg -i input.mp4 -vf "drawtextfontfileC\\:/Windows/fonts/consola.ttf:fontsize30:fontcolorwhite:timecode00\:00\:00\:00:rate25:textTCR\::boxcolor0x000000AA:box1:x20:y20" -y output.mp4 在视频的x20:y20位置添加t…

【AI系统】昇腾 AI 架构介绍

昇腾 AI 架构介绍 昇腾计算的基础软硬件是产业的核⼼&#xff0c;也是 AI 计算能⼒的来源。华为&#xff0c;作为昇腾计算产业⽣态的⼀员&#xff0c;是基础软硬件系统的核⼼贡献者。昇腾计算软硬件包括硬件系统、基础软件和应⽤使能等。 而本书介绍的 AI 系统整体架构&#…

Pareidoscope - 语言结构关联工具

文章目录 关于 Pareidoscope安装使用方法输入格式语料库查询 将语料库转换为 SQLite3 数据库两种语言结构之间的关联简单词素分析关联共现和伴随词素分析相关的更大结构可视化关联结构 关于 Pareidoscope Pareidoscope 是一组 用于确定任意语言结构之间 关联的工具&#xff0c…

安装MySQL 5.7 亲测有效

前言&#xff1a;本文是笔者在安装MySQL5.7时根据另一位博主大大的安装教程基础上做了一些修改而成 首先在这里表示对博主大大的感谢 下面附博主大大地址 下面的步骤言简意赅 跟着做就不会出错 希望各位读者耐下心来 慢慢解决安装中出现的问题~MySQL 5.7 安装教程&#xff08;全…

眼部按摩仪WT2605音频蓝牙语音芯片方案 单芯片实现语音提示及控制/手机无线音频传输功能

随着科技的快速发展&#xff0c;人们的生活方式也在不断改变&#xff0c;智能化、便捷化的产品逐渐成为市场的主流。眼部按摩仪作为一种结合了现代科技与健康生活理念的产品&#xff0c;受到了广大消费者的青睐。而在众多眼部按摩仪中&#xff0c;采用WT2605音频蓝牙芯片的方案…

RK3568平台开发系列讲解(PWM篇)PWM 子系统框架

🚀返回专栏总目录 文章目录 一、PWM 设备驱动层二、PWM 核心层三、PWM 适配器驱动层沉淀、分享、成长,让自己和他人都能有所收获!😄 📢整个 PWM 子系统可以用下面的框图来描述: 再上图中 PWM 子系统被划分为了三个层次, 分别为用户空间、 内核空间和硬件层, 内核空…

使用ESP32通过Arduino IDE点亮1.8寸TFT显示屏

开发板选择 本次使用开发板模块丝印为ESP32-WROOM-32E 开发板库选择 Arduino IDE上型号选择为ESP32-WROOM-DA Module 显示屏选择 使用显示屏为8针SPI接口显示屏 驱动IC为ST7735S 使用库 使用三个Arduino平台库 分别是 Adafruit_GFXAdafruit_ST7735SPI 代码详解 首…

yolo辅助我们健身锻炼

使用软件辅助健身能够大大提升运动效果并帮助你更轻松地达成健身目标。确保每次锻炼都更加高效且针对性强,精确记录你的训练进度,帮助你更清晰地看到自己的进步,避免无效训练。 借助YOLO11的尖端计算机视觉技术,跟踪和分析锻炼变得异常简单。它可以无缝检测和监控多种锻炼…

YOLO系列论文综述(从YOLOv1到YOLOv11)【第12篇:YOLOv9——可编程梯度信息(PGI)+广义高效层聚合网络(GELAN)】

YOLOv9 1 摘要2 改进点3 网络架构 YOLO系列博文&#xff1a; 【第1篇&#xff1a;概述物体检测算法发展史、YOLO应用领域、评价指标和NMS】【第2篇&#xff1a;YOLO系列论文、代码和主要优缺点汇总】【第3篇&#xff1a;YOLOv1——YOLO的开山之作】【第4篇&#xff1a;YOLOv2—…

新能源汽车充电插口类型识别-YOLO标记,可识别Type1,ccs2的充电标准

前言: CCS标准定义的Type-2 CCS汽车充电端口&#xff0c;右侧装有直流充电枪的插头。汽车的充电端口设计巧妙地将交流部分&#xff08;上半部分&#xff09;与直流部分&#xff08;下半部分的两个粗大的接口&#xff09;集于一体。在交流和直流充电过程中&#xff0c;电动汽车…

k8s集成skywalking

如果能科学上网的话&#xff0c;安装应该不难&#xff0c;如果有问题可以给我留言 本篇文章我将给大家介绍“分布式链路追踪”的内容&#xff0c;对于目前大部分采用微服务架构的公司来说&#xff0c;分布式链路追踪都是必备的&#xff0c;无论它是传统微服务体系亦或是新一代…

微信小程序构建npm失败,没有找到可以构建的npm包

方法&#xff1a;打开终端输入 npm init -y npm install 或 yarn install我用 npm install 下载后并没有出现node_modules, 又用 yarn install 下载&#xff0c;成功了 下载好后&#xff0c;在project.config.json文件添加 "showShadowRootInWxmlPanel": true, …

Vue.js中的交互式样式:鼠标悬停与点击选中响应

在现代Web开发中&#xff0c;用户体验是至关重要的。Vue.js作为一个渐进式JavaScript框架&#xff0c;它提供了一种简洁而高效的方式来构建用户界面。本文将介绍如何在Vue.js中实现两种常见的交互效果&#xff1a;鼠标悬停响应和点击选中响应。 一、鼠标悬停响应右边显示 在V…

0017. shell命令--tac

目录 17. shell命令--tac 功能说明 语法格式 选项说明 实践操作 注意事项 17. shell命令--tac 功能说明 Linux 的 tac 命令用于按行反向输出文件内容&#xff0c;与 cat 命令的输出顺序相反。非常有趣&#xff0c;好记。也就是说&#xff0c;当我们使用tac命令查看文件内…

Zero to JupyterHub with Kubernetes上篇 - Kubernetes 离线二进制部署

前言&#xff1a; 纯个人记录使用。 搭建 Zero to JupyterHub with Kubernetes 上篇 - Kubernetes 离线二进制部署。搭建 Zero to JupyterHub with Kubernetes 中篇 - Kubernetes 常规使用记录。搭建 Zero to JupyterHub with Kubernetes 下篇 - Jupyterhub on k8s。 k8s二进…

《Vue零基础入门教程》第十四课:列表渲染

往期内容 《Vue零基础入门教程》第六课&#xff1a;基本选项 《Vue零基础入门教程》第八课&#xff1a;模板语法 《Vue零基础入门教程》第九课&#xff1a;插值语法细节 《Vue零基础入门教程》第十课&#xff1a;属性绑定指令 《Vue零基础入门教程》第十一课&#xff1a;事…

1.1 数据结构的基本概念

1.1.1 基本概念和术语 一、数据、数据对象、数据元素和数据项的概念和关系 数据&#xff1a;是客观事物的符号表示&#xff0c;是所有能输入到计算机中并被计算机程序处理的符号的总称。 数据是计算机程序加工的原料。 数据对象&#xff1a;是具有相同性质的数据元素的集合&…