【自然语言处理】词嵌入模型
词嵌入(Word Embedding) 是一种将词汇表示为实数向量的技术,通常是低维度的连续向量。这些向量被设计为捕捉词汇之间的语义相似性,使得语义相似的词在嵌入空间中的距离也更近。词嵌入可以看作是将离散的语言符号(如单词、短语)映射到向量空间,从而在一定程度上解决了自然语言处理中的语义表示问题。
简单来说,词嵌入就是一种将词汇转换成向量的方法,使得计算机能够理解词与词之间的关系,并在不同的NLP任务(如文本分类、机器翻译、问答系统等)中表现出色。
一、词嵌入的动机和重要性
自然语言中的单词本质上是离散的符号,对于计算机来说,直接处理这些符号是困难的。传统的词表示方法(如词袋模型(Bag of Words)、TF-IDF等)会导致词与词之间的相互关系无法捕捉到,例如“king”和“queen”这两个词虽然表示不同的对象,但在某种语义上有相似性。
词嵌入技术通过以下方式克服这些问题:
- 密集表示:将单词表示为低维的密集向量(例如100维或300维),而不是像词袋模型那样的高维稀疏向量。
- 语义信息捕捉:相似的词(如“king”和“queen”)在向量空间中靠得更近。
- 可用于神经网络:词嵌入作为向量输入,能够直接用于神经网络模型(如RNN、LSTM、Transformer)进行下游的NLP任务。
二、词嵌入的表示形式
-
One-hot表示:在早期,单词通常以one-hot编码表示。词汇表中的每个单词用一个长度为词汇表大小的向量表示,在向量中,目标单词的位置为1,其余位置为0。这种表示无法捕捉单词之间的语义相似性,且向量维度非常高。
例如,假设词汇表包含 [“dog”, “cat”, “mouse”, “king”, “queen”],那么 “dog” 的 one-hot 表示是:
[1, 0, 0, 0, 0]
-
词嵌入表示:与one-hot不同,词嵌入将单词映射到低维实数向量。这个向量表示捕捉到了词汇的语义关系和上下文特性,例如,通过预训练的词嵌入,模型会“知道” “king” 和 “queen” 是相似的,因为它们的向量距离较近。
例如,“dog” 的词嵌入可能是:
[0.13, -0.24, 0.65, ... , 0.42]
三、常见的词嵌入技术
-
Word2Vec:
- Word2Vec 是最早成功应用于词嵌入学习的技术之一,由谷歌在2013年推出。它使用浅层神经网络,将单词映射到向量空间,捕捉词汇的语义相似性。
- Word2Vec 有两种模型:CBOW(连续词袋模型)和 Skip-gram。CBOW根据上下文词预测目标词,Skip-gram则根据目标词预测上下文。
优点:
- 能够高效地学习到低维度且能捕捉语义关系的词向量。
- 适用于大规模无监督文本数据。
缺点:
- 对于词汇的不同含义(如“bank”既可以指银行,也可以指河岸),它无法根据上下文进行区分。
-
GloVe:
- GloVe (Global Vectors for Word Representation) 是斯坦福大学提出的另一种词嵌入方法。它通过构建词汇共现矩阵并进行矩阵分解,生成词向量。它的目标是捕捉全局的语义信息,而不仅仅是局部上下文。
优点:
- GloVe捕捉全局语义信息,能够更好地反映词与词之间的统计关系。
- 提供了丰富的预训练模型(如Common Crawl和Wikipedia上训练的模型),可以在各种NLP任务中直接使用。
-
FastText:
- FastText 是Facebook提出的改进版Word2Vec,能够生成单词的子词级别嵌入。例如,FastText能够将词分解为多个n-gram(如“apple”可以分解为 “app”, “ple”),然后为这些n-gram生成向量。这使得FastText在处理稀有词或拼写错误时表现更好。
优点:
- 能够处理未见词(Out-of-Vocabulary, OOV)问题,因为它可以生成单词的子词嵌入。
- 适合多语言和拼写错误的文本处理场景。
-
ELMo:
- ELMo (Embeddings from Language Models) 是一个上下文相关的词嵌入模型。与Word2Vec不同,ELMo可以根据不同的上下文为同一个词生成不同的嵌入向量。例如,词“bank”在“银行”和“河岸”这两种不同的上下文中会有不同的词向量。
- ELMo基于双向LSTM,通过联合语言模型的方式,结合上下文信息生成词向量。
优点:
- 能够根据上下文动态调整词的表示,克服了Word2Vec静态词嵌入的问题。
- 在NLP任务中表现优秀,尤其是在句子级别的任务上。
-
BERT:
- BERT (Bidirectional Encoder Representations from Transformers) 是基于Transformer架构的预训练语言模型。BERT能够捕捉到单词的双向上下文信息,这意味着它不仅考虑当前单词的前后文,而且能够生成动态的词嵌入。与ELMo相似,BERT的词嵌入是上下文相关的,但BERT的架构(Transformer)使得它更强大。
- BERT的预训练任务包括掩码语言模型(MLM)和下一个句子预测(NSP),通过这两项任务使得它在各种NLP任务中表现优异。
优点:
- 动态的词嵌入可以根据上下文生成最符合语义的词向量。
- 在多个NLP任务(如问答、机器翻译、文本分类)中达到了最新的性能记录。
四、词嵌入的应用场景
词嵌入的主要优势在于其能够捕捉单词之间的语义相似性,并为许多NLP任务提供有力支持。以下是一些常见的应用场景:
-
文本分类:
- 在情感分析、垃圾邮件检测、主题分类等任务中,词嵌入可以作为输入特征,为神经网络模型(如CNN、LSTM)提供丰富的语义信息。
-
信息检索:
- 词嵌入帮助提高搜索系统的性能,通过嵌入空间中的语义相似性,用户查询词可以与文档中的内容更好地匹配。
-
机器翻译:
- 词嵌入能够捕捉不同语言中的语义关系,帮助机器翻译系统生成更符合语义的翻译结果。
-
命名实体识别(NER):
- 词嵌入在命名实体识别任务中用于表示输入的单词特征,结合上下文信息帮助模型识别出人名、地名、公司名等实体。
-
问答系统:
- 在问答系统中,词嵌入帮助模型理解用户问题中的词语语义,并从知识库中找到最合适的答案。
-
推荐系统:
- 词嵌入可以用于推荐系统,将用户的文本评论或搜索词转换为语义向量,从而为用户推荐相关的产品或内容。
五、Tokenizer(分词器)
Tokenizer 是将原始文本(通常是句子或段落)**转换为可处理的离散单词或子词单位(token)**的过程。每个 token 通常表示文本中的一个单词、子词甚至字符。Tokenizer 的主要作用是将自然语言的字符串转换为模型能够理解的数值输入形式。
特点:
- 文本到token映射:Tokenizer的工作是将文本数据(字符串形式)分割为更小的单位,即 token。通常每个 token 对应于词汇表中的一个索引(整数),这些索引被输入到模型中。
- 词汇表:Tokenizer基于一个词汇表(vocabulary),这个词汇表定义了所有可以被模型处理的单词或子词。当遇到词汇表之外的单词时,通常会有一种机制来处理,比如用特殊的未知词符
[UNK]
表示。 - 子词分词(如BPE、WordPiece):一些模型(如BERT、GPT)使用子词级别的tokenization,将单词拆分为多个子词单位,从而有效处理未见词(OOV)问题。例如,“playing” 可以被拆分为 “play” 和 “##ing”。
例子:
假设有如下句子:
sentence = "I love playing football."
使用 Tokenizer 后,这个句子可能会被分词为:
tokens = ["I", "love", "playing", "football", "."]
再进一步转换为索引(假设词汇表中每个单词有对应的ID):
token_ids = [101, 2000, 2030, 2079, 102]
这些 token ids 会被输入到模型中。
词嵌入和 Tokenizer 的工作流程
- 文本 -> Tokenizer:Tokenizer 是文本处理的第一步,用于将原始文本转换为 token(或词汇表中的索引)。这个步骤是模型的基础输入准备步骤。
- Token -> 词嵌入:词嵌入 是将 token(离散索引表示)转换为实数向量。它是模型中的输入层之一,用于将离散的单词或 token 映射为可以处理的连续向量。
六、Word2Vec + LSTM 代码举例
以下是使用 Word2Vec 词嵌入与 LSTM 网络进行文本分类的完整代码。
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
from nltk.tokenize import word_tokenize
from sklearn.model_selection import train_test_split
from gensim.models import Word2Vec
import nltknltk.download('punkt')# 示例数据集
data = [("I love programming and coding.", "positive"),("Python is an amazing language.", "positive"),("I hate bugs in the code.", "negative"),("Debugging is so frustrating.", "negative"),("Machine learning is fascinating.", "positive"),("I don't like syntax errors.", "negative")
]# 提取文本和标签
sentences = [text for text, label in data]
labels = [1 if label == "positive" else 0 for text, label in data]# 分词
tokenized_sentences = [word_tokenize(sentence.lower()) for sentence in sentences]# 训练 Word2Vec 模型
word2vec_model = Word2Vec(sentences=tokenized_sentences, vector_size=100, window=5, min_count=1, workers=4)# 为单词构建词汇表并映射单词到索引
vocab = {word: index for index, word in enumerate(word2vec_model.wv.index_to_key)}
vocab_size = len(vocab)# 将每个句子转换为索引序列
def sentence_to_indices(sentence, vocab):return [vocab[word] for word in word_tokenize(sentence.lower()) if word in vocab]# 将句子转换为索引序列
X_indices = [sentence_to_indices(sentence, vocab) for sentence in sentences]# 找出最长句子长度,确保所有输入有相同长度
max_length = max(len(seq) for seq in X_indices)# 填充句子,使得它们长度一致(填充0)
def pad_sequence(seq, max_length):padded = np.zeros(max_length, dtype=int)padded[:len(seq)] = seqreturn paddedX_padded = np.array([pad_sequence(seq, max_length) for seq in X_indices])
y = np.array(labels)# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_padded, y, test_size=0.2, random_state=42)# 将数据转换为 PyTorch 张量
X_train_tensor = torch.tensor(X_train, dtype=torch.long)
X_test_tensor = torch.tensor(X_test, dtype=torch.long)
y_train_tensor = torch.tensor(y_train, dtype=torch.long)
y_test_tensor = torch.tensor(y_test, dtype=torch.long)# 生成嵌入矩阵,大小为 (vocab_size, vector_size)
embedding_matrix = np.zeros((vocab_size, word2vec_model.vector_size))
for word, index in vocab.items():embedding_matrix[index] = word2vec_model.wv[word]# 将嵌入矩阵转换为 PyTorch 张量
embedding_tensor = torch.tensor(embedding_matrix, dtype=torch.float32)# 定义 LSTM 模型,使用 Word2Vec 词嵌入
class LSTMClassifier(nn.Module):def __init__(self, embedding_matrix, hidden_size, output_size, num_layers, trainable=False):super(LSTMClassifier, self).__init__()vocab_size, embedding_dim = embedding_matrix.shapeself.embedding = nn.Embedding.from_pretrained(embedding_matrix, freeze=not trainable)self.lstm = nn.LSTM(embedding_dim, hidden_size, num_layers, batch_first=True)self.fc = nn.Linear(hidden_size, output_size)def forward(self, x):embedded = self.embedding(x)_, (hn, _) = self.lstm(embedded)out = self.fc(hn[-1])return out# 定义超参数
input_size = word2vec_model.vector_size # Word2Vec 生成的词向量维度
hidden_size = 128 # LSTM 隐藏层大小
output_size = 2 # 二分类问题
num_layers = 1 # LSTM 层数
learning_rate = 0.001
num_epochs = 10# 初始化模型、损失函数和优化器
model = LSTMClassifier(embedding_tensor, hidden_size, output_size, num_layers, trainable=False)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)# 训练模型
for epoch in range(num_epochs):model.train()outputs = model(X_train_tensor)loss = criterion(outputs, y_train_tensor)optimizer.zero_grad()loss.backward()optimizer.step()print(f"Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}")# 测试模型
model.eval()
with torch.no_grad():test_outputs = model(X_test_tensor)_, predicted = torch.max(test_outputs, 1)accuracy = (predicted == y_test_tensor).sum().item() / len(y_test_tensor)print(f"测试集准确率: {accuracy:.4f}")
相关文章:
【自然语言处理】词嵌入模型
词嵌入(Word Embedding) 是一种将词汇表示为实数向量的技术,通常是低维度的连续向量。这些向量被设计为捕捉词汇之间的语义相似性,使得语义相似的词在嵌入空间中的距离也更近。词嵌入可以看作是将离散的语言符号(如单词…...
了解针对基座大语言模型(类似 ChatGPT 的架构,Decoder-only)的重头预训练和微调训练
🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 随着自然语言处理(NLP)技术的飞速进步,基于 Transformer 架构的大语言模型在众多任务中取得了显著成就。特别是 Decoder-only 架构,如 GPT 系列模型&…...
cmake如何在编译时区分-std=c++17和-std=gnu++17?检查宏
如何在编译时区分-stdc17和-stdgnu17?检查宏?-腾讯云开发者社区-腾讯云 我正在使用__int128扩展的g。-stdc17的问题是,一些C库不具备对该扩展的全部支持(即std::make_unsigned<>失败)。当使用-stdgnu17时,它工作得很好。 我…...
速通数据结构与算法第七站 排序
系列文章目录 速通数据结构与算法系列 1 速通数据结构与算法第一站 复杂度 http://t.csdnimg.cn/sxEGF 2 速通数据结构与算法第二站 顺序表 http://t.csdnimg.cn/WVyDb 3 速通数据结构与算法第三站 单链表 http://t.csdnimg.cn/cDpcC 4 速通…...
灵当CRM index.php接口SQL注入漏洞复现 [附POC]
文章目录 灵当CRM index.php接口SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 灵当CRM index.php接口SQL注入漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关技…...
修复: Flux女生脸不再油光满面, 屁股下巴 -- 超实用Comfyui小技巧
ComfyUI上目前最强画图模型公认为Flux. 初次用Flux基础模型画真实的女生时, 和SD比起来, 会觉得画出来细节更多, 更真实. 但是当画多了, 就会觉得画出来的女生总是似曾相识. 仔细观察, 会发现一些共同的特征. 人偏老气, 像30~50的女生. 改了提示词也效果不大. 颧骨凸起, 嘴…...
Actions Speak Louder than Words Meta史诗级的端到端推荐大模型落地
发现好久之前整理的推荐系统被遗忘在了草稿箱,让它出来见见世面。。。后续空了持续更新 文章目录 1.Background2.Related works2.1 典型推荐模型2.1.1 DIN2.1.2 DIEN2.1.3 SIM2.1.4 MMoE2.1.5 其他 2.2. 生成式推荐 3.Method3.1 统一特征空间3.2 重塑召回排序模型3.…...
金智维KRPA之Excel自动化
Excel自动化操作概述 Excel自动化主要用于帮助各种类型的企业用户实现Excel数据处理自动化,Excel自动化是可以从单元格、列、行或范围中读取数据,向其他电子表格或工作簿写入数据等活动。 通过相关命令,还可以对数据进行排序、进行格式…...
哪款宠物空气净化器能有效去除浮毛?希喂、352实测分享
你是否曾经站在家电卖场里,面对琳琅满目的宠物空气净化器产品而感到无所适从?或者在浏览网上商城时,被海量的参数和功能描述搞得头晕眼花?别担心,你不是一个人。在这个科技飞速发展的时代,选择一台既能满足…...
2024.9.28更换启辰R30汽车火花塞
2024.9.28周六汽车跑了11万公里,实在加速肉,起步顿挫,油耗在8个,决定更换火花塞。第一个火花塞要拆掉进气歧管。第二和第三个可以直接换。打开第二个火花塞一看电极都被打成深坑,针电极都被打凸。我有两个旧的火花塞&a…...
2024上海网站建设公司哪家比较好TOP3
判断一家网建公司的好坏,第一是看公司背景,包括成立时间,工商注册信息等,第二可以去看看建站公司做的案例,例如,网站开发、设计、引流等等的以往案例,了解清楚具体的业务流程。 一、公司背景 …...
TDesign组件库+vue3+ts 如何视觉上合并相同内容的table列?(自定义合并table列)
背景 当table的某一列的某些内容相同时,需要在视觉上合并这一部分的内容为同个单元格 如上图所示,比如需要合并当申请人为同个字段的列。 解决代码 <t-table:data"filteredData":columns"columns":rowspan-and-colspan"…...
BACnet协议-(基于ISO 8802-3 UDP)(2)
1、模拟设备的工具界面如下: 2、使用yet another bacnet explorer 用作服务,用于发现设备,界面如下: 3、通过wireshark 抓包如下: (1)、整体包如下: (2)、m…...
android 根据公历日期准确节气计算年月日时天干地支 四柱八字
1 年柱 判断当前日期是否超过本年的立春 未超过年份-1 已超过按当前年份计算 2月柱 当前日期是否超过当月的第一个节气 未超过-1 超过当前月份计算 节气对日柱时柱没影响。 获取某年某月第一个节气的准确日期 private int sTerm(int y, int n) {int[] sTermInfo…...
VMware虚拟机连接公网,和WindTerm
一、项目名称 vmware虚拟机连接公网和windterm 二、项目背景 需求1:windows物理机,安装了vmware虚拟机,需要访问公网资源,比如云服务商的yum仓库,国内镜像加速站的容器镜像,http/https资源。 需求2…...
游戏盾SDK真的能无视攻击吗
游戏盾SDK真的能无视攻击吗?在当今的互联网环境中,游戏行业蓬勃发展,但同时也面临着日益严峻的安全挑战。DDoS攻击、CC攻击、外挂作弊等恶意行为频发,不仅威胁着游戏的稳定性和公平性,也严重影响了玩家的游戏体验。为了…...
【QT】亲测有效:“生成的目标文件包含了过多的段,超出了编译器或链接器允许的最大数量”错误的解决方案
在使用dlib开发人脸对齐功能时,出现了”生成的目标文件包含了过多的段,超出了编译器或链接器允许的最大数量的错误“。 主要功能代码如下: #include <QApplication> #include <QImage> #include <QDebug>#include <dlib…...
什么是 Apache Ingress
Apache Ingress 主要用于管理来自外部的 HTTP 和 HTTPS 流量,并将其路由到合适的 Kubernetes 服务。 容器化与 Kubernetes 是现代云原生应用程序的基础。Kubernetes 的主要职责是管理容器集群,确保它们的高可用性和可扩展性,同时还提供自动化…...
SpringBoot助力墙绘艺术市场创新
3 系统分析 当用户确定开发一款程序时,是需要遵循下面的顺序进行工作,概括为:系统分析–>系统设计–>系统开发–>系统测试,无论这个过程是否有变更或者迭代,都是按照这样的顺序开展工作的。系统分析就是分析系…...
Antlr的使用
概念 ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成工具,用于读取、处理、执行或翻译结构化文本或二进制文件。ANTLR通过定义文法(grammar)来识别、构建和访问语言中的元素。 ANTLR为包括Jav…...
HealChat心理大语言模型 丨OPENAIGC开发者大赛高校组AI创作力奖
在第二届拯救者杯OPENAIGC开发者大赛中,涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到,我们特意开设了优秀作品报道专栏,旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者,希望能带给…...
PyQt5整合爬虫制作图片爬取器-幽络源
前言 本篇教程适合对Python爬虫和Python软件制作感兴趣的小伙伴阅读,看完本篇教程,你将能更深入了解PyQt5与实际功能的整合方式。 1.设计界面 首先在pycharm中创建一个新目录,这里我建立的目录名为爬图片,然后按如图打开Qt设计…...
DC00023基于jsp+MySQL新生报到管理系统
1、项目功能演示 DC00023基于jsp新生报到管理系统java webMySQL新生管理系统 2、项目功能描述 基于jspMySQL新生报到管理系统项目分为学生、辅导员、财务处和系统管理员四个角色。 2.1 学生功能 1、系统登录 2、校园新闻、报到流程、学校简介、在线留言、校园风光、入校须知…...
AdaptIoT——制造业中使用因果关系的自我标签系统
0.概述 论文地址:https://arxiv.org/abs/2404.05976 在许多制造应用中,机器学习(ML)已被证明可以提高生产率。针对制造业应用提出了一些软件和工业物联网(IIoT)系统,以接收这些 ML 应用。最近&…...
代码随想录算法训练营Day15
654.最大二叉树 力扣题目链接:. - 力扣(LeetCode) 前序递归、循环不变量 class Solution {public TreeNode constructMaximumBinaryTree(int[] nums) {return findmax(nums,0,nums.length);}public TreeNode findmax(int[] nums,int lefti…...
Thinkphp/Laravel旅游景区预约系统的设计与实现
目录 技术栈和环境说明具体实现截图设计思路关键技术课题的重点和难点:框架介绍数据访问方式PHP核心代码部分展示代码目录结构解析系统测试详细视频演示源码获取 技术栈和环境说明 采用PHP语言开发,开发环境为phpstudy 开发工具notepad并使用MYSQL数据库…...
SpringCloud学习记录|day1
学习材料 2024最新SpringCloud微服务开发与实战,java黑马商城项目微服务实战开发(涵盖MybatisPlus、Docker、MQ、ES、Redis高级等) 学redis讲到微服务就停了,nginx也是。 所以嘛,我终于来到微服务了。 复习MyBatisP…...
Elasticsearch讲解
1.Elasticsearch基本知识 1.基本认识和安装 Elasticsearch是由elastic公司开发的一套搜索引擎技术,它是elastic技术栈中的一部分。完整的技术栈包括: Elasticsearch:用于数据存储、计算和搜索 Logstash/Beats:用于数据收集 Kib…...
Linux嵌入式有发展吗,以及对uboot,kernel,rootfs的领悟
工作多年后,对uboot,kernel,rootfs的领悟,总结 上大学时,51单片机,正点原子的stm32,linux arm开发。对uboot,kernel,rootfs的理解云里雾里,感觉自己很懂了 其…...
基于Springboot+Vue的公寓管理系统(含源码+数据库)
1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 该系统…...
thinkphp企业网站开发/网络推广渠道有哪些
比如下面的代码中实现了一个只能转换User对象的MessageConverter,底层使用的是FastJson,在进行发送消息时重置了user的name属性,加上了t-前缀。 然后为了使它生效,我们需要把它定义为一个bean,并标注StreamMessageConv…...
惠阳开发网站建设/全媒体广告投放平台
点击上方"蓝字"关注我们,享更多干货!索引分裂(Index Block Split),就是索引块的分裂。当一次DML操作修改了索引块上的数据,但是旧有的索引块没有足够的空间去容纳新修改的数据时,将分…...
wordpress 中文付费主题/seo网页推广
cellfun函数 n A{Hello, MATLAB, I love MATLAB, MATLAB is powerful, MATLAB is the language of technical computer} ;试统计A中每个元胞......函数语法为: Bcellfun(fun,A) ; fun 表示实现运算的 匿名函数或函数句柄,A是被实施运算的元胞数组。cellfun函数更详 细的使用说明…...
东营seo网站建设费用/营销策划与运营公司
当用户退出的时候,清除redis中token,其实很简单 我直接在oauth服务中新建一个接口 RestController RequestMapping("/authentication") public class UserController {AutowiredQualifier("consumerTokenServices")private Consume…...
做网站后有人抢注品牌关键字/seo站长综合查询
应用篇:qt写入版本号应用篇:qt写入版本号创建.rc文件在工程文件中载入.rc文件转载需注明出处应用篇:qt写入版本号 在软件开发及交付的过程中,常常需要对已经发布的软件进行技术维护和bug追踪,而这个恰恰依赖于工程师良…...
做网站建设一年能赚多少/百度网络营销中心
之前的两篇文章我们了解了委托和事件,本文我们看一下线程。 1,一个窗体程序,默认拥有一个线程(相当于一个商店里面,只有一个店员),这个默认的线程叫做 UI线程/主线程。 2,进程和线程…...